Annotation of 43BSDReno/share/doc/ps1/06.sysman/1.2.t, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1983 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)1.2.t       6.10 (Berkeley) 8/25/86
                      6: .\"
                      7: .sh "Memory management\(dg
                      8: .NH 3
                      9: Text, data and stack
                     10: .PP
                     11: .FS
                     12: \(dg This section represents the interface planned for later
                     13: releases of the system.  Of the calls described in this section,
                     14: only \fIsbrk\fP and \fIgetpagesize\fP are included in 4.3BSD.
                     15: .FE
                     16: Each process begins execution with three logical areas of memory
                     17: called text, data and stack.  
                     18: The text area is read-only and shared, while the data and stack
                     19: areas are private to the process.  Both the data and stack areas may
                     20: be extended and contracted on program request.  The call
                     21: .DS
                     22: addr = sbrk(incr);
                     23: result caddr_t addr; int incr;
                     24: .DE
                     25: changes the size of the data area by \fIincr\fP bytes and
                     26: returns the new end of the data area, while
                     27: .DS
                     28: addr = sstk(incr);
                     29: result caddr_t addr; int incr;
                     30: .DE
                     31: changes the size of the stack area.
                     32: The stack area is also automatically extended as needed.
                     33: On the VAX the text and data areas are adjacent in the P0 region,
                     34: while the stack section is in the P1 region, and grows downward.
                     35: .NH 3
                     36: Mapping pages
                     37: .PP
                     38: The system supports sharing of data between processes
                     39: by allowing pages to be mapped into memory.  These mapped
                     40: pages may be \fIshared\fP with other processes or \fIprivate\fP
                     41: to the process.
                     42: Protection and sharing options are defined in \fI<sys/mman.h>\fP as:
                     43: .DS
                     44: .ta \w'#define\ \ 'u +\w'MAP_HASSEMAPHORE\ \ 'u +\w'0x0080\ \ 'u
                     45: /* protections are chosen from these bits, or-ed together */
                     46: #define        PROT_READ       0x04    /* pages can be read */
                     47: #define        PROT_WRITE      0x02    /* pages can be written */
                     48: #define        PROT_EXEC       0x01    /* pages can be executed */
                     49: .DE
                     50: .DS
                     51: .ta \w'#define\ \ 'u +\w'MAP_HASSEMAPHORE\ \ 'u +\w'0x0080\ \ 'u
                     52: /* flags contain mapping type, sharing type and options */
                     53: /* mapping type; choose one */
                     54: #define MAP_FILE       0x0001  /* mapped from a file or device */
                     55: #define MAP_ANON       0x0002  /* allocated from memory, swap space */
                     56: #define MAP_TYPE       0x000f  /* mask for type field */
                     57: .DE
                     58: .DS
                     59: .ta \w'#define\ \ 'u +\w'MAP_HASSEMAPHORE\ \ 'u +\w'0x0080\ \ 'u
                     60: /* sharing types; choose one */
                     61: #define        MAP_SHARED      0x0010  /* share changes */
                     62: #define        MAP_PRIVATE     0x0000  /* changes are private */
                     63: .DE
                     64: .DS
                     65: .ta \w'#define\ \ 'u +\w'MAP_HASSEMAPHORE\ \ 'u +\w'0x0080\ \ 'u
                     66: /* other flags */
                     67: #define MAP_FIXED      0x0020  /* map addr must be exactly as requested */
                     68: #define MAP_INHERIT    0x0040  /* region is retained after exec */
                     69: #define MAP_HASSEMAPHORE       0x0080  /* region may contain semaphores */
                     70: #define MAP_NOPREALLOC 0x0100  /* do not preallocate space */
                     71: .DE
                     72: The cpu-dependent size of a page is returned by the
                     73: \fIgetpagesize\fP system call:
                     74: .DS
                     75: pagesize = getpagesize();
                     76: result int pagesize;
                     77: .DE
                     78: .LP
                     79: The call:
                     80: .DS
                     81: maddr = mmap(addr, len, prot, flags, fd, pos);
                     82: result caddr_t maddr; caddr_t addr; int *len, prot, flags, fd; off_t pos;
                     83: .DE
                     84: causes the pages starting at \fIaddr\fP and continuing
                     85: for at most \fIlen\fP bytes to be mapped from the object represented by
                     86: descriptor \fIfd\fP, starting at byte offset \fIpos\fP.
                     87: The starting address of the region is returned;
                     88: for the convenience of the system,
                     89: it may differ from that supplied
                     90: unless the MAP_FIXED flag is given,
                     91: in which case the exact address will be used or the call will fail.
                     92: The actual amount mapped is returned in \fIlen\fP.
                     93: The \fIaddr\fP, \fIlen\fP, and \fIpos\fP parameters
                     94: must all be multiples of the pagesize.
                     95: A successful \fImmap\fP will delete any previous mapping
                     96: in the allocated address range.
                     97: The parameter \fIprot\fP specifies the accessibility
                     98: of the mapped pages.
                     99: The parameter \fIflags\fP specifies
                    100: the type of object to be mapped,
                    101: mapping options, and
                    102: whether modifications made to
                    103: this mapped copy of the page
                    104: are to be kept \fIprivate\fP, or are to be \fIshared\fP with
                    105: other references.
                    106: Possible types include MAP_FILE,
                    107: mapping a regular file or character-special device memory,
                    108: and MAP_ANON, which maps memory not associated with any specific file.
                    109: The file descriptor used for creating MAP_ANON regions is used only
                    110: for naming, and may be given as \-1 if no name
                    111: is associated with the region.\(dd
                    112: .FS
                    113: \(dd The current design does not allow a process
                    114: to specify the location of swap space.
                    115: In the future we may define an additional mapping type, MAP_SWAP,
                    116: in which the file descriptor argument specifies a file
                    117: or device to which swapping should be done.
                    118: .FE
                    119: The MAP_INHERIT flag allows a region to be inherited after an \fIexec\fP.
                    120: The MAP_HASSEMAPHORE flag allows special handling for
                    121: regions that may contain semaphores.
                    122: The MAP_NOPREALLOC flag allows processes to allocate regions whose
                    123: virtual address space, if fully allocated,
                    124: would exceed the available memory plus swap resources.
                    125: Such regions may get a SIGSEGV signal if they page fault and resources
                    126: are not available to service their request;
                    127: typically they would free up some resources via \fIunmap\fP so that
                    128: when they return from the signal the page
                    129: fault could be successfully completed.
                    130: .PP
                    131: A facility is provided to synchronize a mapped region with the file
                    132: it maps; the call
                    133: .DS
                    134: msync(addr, len);
                    135: caddr_t addr; int len;
                    136: .DE
                    137: writes any modified pages back to the filesystem and updates
                    138: the file modification time.
                    139: If \fIlen\fP is 0, all modified pages within the region containing \fIaddr\fP
                    140: will be flushed;
                    141: if \fIlen\fP is non-zero, only the pages containing \fIaddr\fP and \fIlen\fP
                    142: succeeding locations will be examined.
                    143: Any required synchronization of memory caches
                    144: will also take place at this time.
                    145: Filesystem operations on a file that is mapped for shared modifications
                    146: are unpredictable except after an \fImsync\fP.
                    147: .PP
                    148: A mapping can be removed by the call
                    149: .DS
                    150: munmap(addr, len);
                    151: caddr_t addr; int len;
                    152: .DE
                    153: This call deletes the mappings for the specified address range,
                    154: and causes further references to addresses within the range
                    155: to generate invalid memory references.
                    156: .NH 3
                    157: Page protection control
                    158: .PP
                    159: A process can control the protection of pages using the call
                    160: .DS
                    161: mprotect(addr, len, prot);
                    162: caddr_t addr; int len, prot;
                    163: .DE
                    164: This call changes the specified pages to have protection \fIprot\fP\|.
                    165: Not all implementations will guarantee protection on a page basis;
                    166: the granularity of protection changes may be as large as an entire region.
                    167: .NH 3
                    168: Giving and getting advice
                    169: .PP
                    170: A process that has knowledge of its memory behavior may
                    171: use the \fImadvise\fP call:
                    172: .DS
                    173: madvise(addr, len, behav);
                    174: caddr_t addr; int len, behav;
                    175: .DE
                    176: \fIBehav\fP describes expected behavior, as given
                    177: in \fI<sys/mman.h>\fP:
                    178: .DS
                    179: .ta \w'#define\ \ 'u +\w'MADV_SEQUENTIAL\ \ 'u +\w'00\ \ \ \ 'u
                    180: #define        MADV_NORMAL     0       /* no further special treatment */
                    181: #define        MADV_RANDOM     1       /* expect random page references */
                    182: #define        MADV_SEQUENTIAL 2       /* expect sequential references */
                    183: #define        MADV_WILLNEED   3       /* will need these pages */
                    184: #define        MADV_DONTNEED   4       /* don't need these pages */
                    185: #define        MADV_SPACEAVAIL 5       /* insure that resources are reserved */
                    186: .DE
                    187: Finally, a process may obtain information about whether pages are
                    188: core resident by using the call
                    189: .DS
                    190: mincore(addr, len, vec)
                    191: caddr_t addr; int len; result char *vec;
                    192: .DE
                    193: Here the current core residency of the pages is returned
                    194: in the character array \fIvec\fP, with a value of 1 meaning
                    195: that the page is in-core.
                    196: .NH 3
                    197: Synchronization primitives
                    198: .PP
                    199: Primitives are provided for synchronization using semaphores in shared memory.
                    200: Semaphores must lie within a MAP_SHARED region with at least modes
                    201: PROT_READ and PROT_WRITE.
                    202: The MAP_HASSEMAPHORE flag must have been specified when the region was created.
                    203: To acquire a lock a process calls:
                    204: .DS
                    205: value = mset(sem, wait)
                    206: result int value; semaphore *sem; int wait;
                    207: .DE
                    208: \fIMset\fP indivisibly tests and sets the semaphore \fIsem\fP.
                    209: If the the previous value is zero, the process has acquired the lock
                    210: and \fImset\fP returns true immediately.
                    211: Otherwise, if the \fIwait\fP flag is zero,
                    212: failure is returned.
                    213: If \fIwait\fP is true and the previous value is non-zero,
                    214: \fImset\fP relinquishes the processor until notified that it should retry.
                    215: .LP
                    216: To release a lock a process calls:
                    217: .DS
                    218: mclear(sem)
                    219: semaphore *sem;
                    220: .DE
                    221: \fIMclear\fP indivisibly tests and clears the semaphore \fIsem\fP.
                    222: If the ``WANT'' flag is zero in the previous value,
                    223: \fImclear\fP returns immediately.
                    224: If the ``WANT'' flag is non-zero in the previous value,
                    225: \fImclear\fP arranges for waiting processes to retry before returning.
                    226: .PP
                    227: Two routines provide services analogous to the kernel
                    228: \fIsleep\fP and \fIwakeup\fP functions interpreted in the domain of
                    229: shared memory.
                    230: A process may relinquish the processor by calling \fImsleep\fP
                    231: with a set semaphore:
                    232: .DS
                    233: msleep(sem)
                    234: semaphore *sem;
                    235: .DE
                    236: If the semaphore is still set when it is checked by the kernel,
                    237: the process will be put in a sleeping state
                    238: until some other process issues an \fImwakeup\fP for the same semaphore
                    239: within the region using the call:
                    240: .DS
                    241: mwakeup(sem)
                    242: semaphore *sem;
                    243: .DE
                    244: An \fImwakeup\fP may awaken all sleepers on the semaphore,
                    245: or may awaken only the next sleeper on a queue.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.