This document describes how Natural allocates and uses main storage. A chunk of storage requested by a Natural nucleus component is called a "buffer".
This section covers the following topics:
There are two different types of storage environments:
Thread storage environment (typical for multi-user environments, for example, CICS)
Non-thread storage environment (typical for single-user environments, for example, batch)
In a thread environment, a big piece of storage called "thread" is pre-allocated for a session. The thread size must be predefined by the system administrator. During a session each buffer allocation request (GETMAIN) is satisfied within its thread by Natural itself. Free space due to release buffer requests (FREEMAIN) can be reused.
Upon certain events (terminal I/O operations and long waits), the thread storage may be compressed and rolled out (or swapped out) to external storage (swap pool or roll file). The released thread can be reused by other Natural sessions. When a suspended session is to be resumed, it is rolled in from external storage into a free thread again.
The place on the swap pool or roll file where the compressed thread storage is stored, is called a "slot". The slot size has a fixed length and is defined by the system administrator. It must be large enough to contain the largest compressed thread storage. In the worst case, it may be equal to the thread size.
In a non-thread environment, all storage requests are directly passed to the operating (sub)system. No roll-out/roll-in is performed, that is, the buffers for a session are kept until session termination, unless they were explicitly released before.
There are three different types of buffers:
fixed buffers
variable buffers
physical buffers
 Fixed buffers and variable buffers have a 32-byte
                       prefix with a common layout for all environments. The buffer prefix starts with
                       the buffer name followed by 5 buffer length fields (total, used low-end, max.
                       used, used high-end, max. used high-end). The used length fields are maintained
                       by the buffer-owning components and are used for thread compression. Each
                       buffer has a unique ID number (1-255) and can exist only once. Some buffers are
                       allocated during session initialization, others are allocated when required.
                       The system command BUS can be used
                       to show information about all fixed and variable buffers currently allocated.
                       The characteristics of the buffers are defined in the source module
                       NATCONFG, which can be
                       customized in exceptional cases (see
                       Customization of
                          Buffer Characteristics below). The size of some buffers
                       can be specified by a profile parameter. For a complete list of such buffers,
                       see the profile parameter DS.
               
 Physical buffers are allocated outside the thread. They do not
                       have a buffer prefix and they are not unique. They are used in exceptional
                       cases and temporarily only. Physical buffers are automatically released at the
                       next terminal I/O. It is possible to define work pools for physical buffers by
                       profile parameter WPSIZE.
               
In a thread environment, fixed buffers are allocated from the low end of the thread only. In contrast to variable buffers, fixed buffers cannot be moved relatively to the thread and their size cannot be increased or decreased.
In a thread environment, variable buffers are allocated from the high end of the thread. If there is no more space in the thread, variable buffers are allocated temporarily outside of the thread. Upon thread compression, all buffer parts used are compressed into the thread. If they do not fit into the thread, the session is terminated abnormally. This may happen especially when large dynamic variables are used.
After thread decompression, the variable buffers may have been moved to a different place inside or outside of the thread. Variable buffers can be increased or decreased in size on request by the owning component. Some variable buffers are defined to be reduced or released automatically during thread compression.
The total amount of storage allocated outside the thread can be limited
                       by profile parameter OVSIZE.
               
All buffers are defined in the source module
                       NATCONFG by
                       NTBUFID macro definitions.
               
| Warning: Please, do not change any buffer characteristics except the MIN, MAX and
                                   CMPR parameter settings explained below, because the
                                   results may be unpredictable. | 
                     
It is possible to change the buffer size limits by the parameters
                       MIN and MAX of the macro
                       NTBUFID. This makes sense for variable buffers
                       (TYPE=VAR) only. Limits
                       for all buffers are defined either by default (0 - 2097151 KB) or
                       by the limits of the corresponding profile parameters. For further information,
                       see the profile parameter DS. The limits of the
                       buffer size profile parameters in the Natural parameter module are not affected
                       by the MIN and MAX parameters of
                       NTBUFID, but the limits for the dynamic profile buffer
                       size parameters are overwritten by MIN and
                       MAX.
               
Setting the MAX parameter to a value in KB means
                       that the size of this buffer cannot exceed this maximum during session
                       execution. This may cause runtime errors if more buffer storage is requested
                       for the desired buffer.
               
Setting the MIN parameter to a value in KB means
                       that the size of this buffer cannot be less than this value during session
                       execution. For example, in the case of the 3GL CALLNAT interface
                       (NAT3GCAN), the setting of a buffer minimum value makes sense for
                       the following buffers, because the sizes of these buffers may not be increased
                       on a lower Natural program level called by a 3GL program.
               
| Buffer | Purpose | 
|---|---|
DATSIZE |  
                                
                        Data areas | 
GLBTOOL |  
                                
                        Utility GDA | 
GLBUSER |  
                                
                        User GDA | 
GLBSYS |  
                                
                        System GDA | 
AIVDAT |  
                                
                        AIV area | 
CONTEXT |  
                                
                        Context variables | 
The parameter CMPR of the macro
                       NTBUFID defines the compression optimization algorithm for the
                       buffer. It corresponds to the profile parameter CMPR
                       which defines the default. For more information about the possible parameter
                       values, see CMPR – General Default
                          Compression Optimization Algorithm in the
                       Parameter Reference documentation.
               
Example of a buffer characteristics definition:
DATSIZE NTBUFID ID=GETMDATA,TYPE=VAR+INI,CMPR=OPT2,MAX=512
For further information on profile parameters affecting the buffer sizes, see Storage Management in the Parameter Reference documentation.