background image

     will attempt each one, in the above order, until one succeeds or raises
     an ORA error.  On other, non-fatal, errors, Oracle simply cleans up and
     tries again using the next memory model.  The entire SGA must fit into
     shared memory, so the total amount of shared memory allocated under any
     model will be equal to the size of the SGA.  This calculated value will
     be referred to below as SGASIZE.
   
     The one-segment model is the simplest and first model tried. In this
     model, the SGA resides in only one shared memory segment.  Oracle attempts
     to allocate and attach one shared memory segement of size equal to total
     size of the SGA.  However, if the SGASIZE is larger than the configured
     SHMMAX, this will obviously fail (with EINVAL).  In this case, the SGA will
     need to be placed in multiple shared memory segments, and Oracle proceeds
     to the next memory model for the SGA.  If an error other than EINVAL occurs
     when allocating the shared memory with shmget(), Oracle will raise an
     ORA-7306.  If the segment was received (i.e. if SHMMAX > SGASIZE), Oracle
     attempts to attach it at the start address defined in ksms.o.  An error
     on the attach will raise an ORA-7307.
   
     With multiple segments there are two possibilities.  The segments
     can be attached contiguously, so that it appears to be one large
     shared memory segment, or non-contiguously, with gaps between the
     segments.  The former wastes less space that could be used for the stack
     or heap, but depending on alignment requirements for shared memory
     (defined by SHMLBA in the kernel), it may not be possible.
   
     At this point, Oracle needs to determine SHMMAX so it can determine how many
     segments will be required.  This is done via a binary search
     algorithm over the range [1...SGASIZE] (since Oracle is trying this
     model and not the one segment model it must be that SHMMAX<SGASIZE)
     The value of SHMMAX calculated will then be rounded to an even page size
     (on some machines, possibly to an even 2 or 4 page block).
   
     In the contiguous segment model, Oracle simply divides the SGA into
     SGASIZE/SHMMAX (rounded down) segments of size SHMMAX plus another segment
     of size SGASIZE modulo SHMMAX.  If more than SS_SEG_MAX segments are
     required total, an ORA-7329 is raised.  It then allocates and attaches
     one segment at a time, attaching the first segment at the start address
     defined in "ksms.o".  Subsequent segments are attached at an address equal
     to the previous segment's attach address plus the size of the previous
     segment so that they are contiguous in memory.  
   
     For example, if SHMMAX is 2M, SGASIZE is 5M, and the start address is 
     0xd0000000, there would be 3 segments, 2 of 2M and 1 of 1M.  They would be