@node Memory allocation @chapter Memory allocation @cpindex Memory allocation @cpindex Allocate memory The ability to allocate memory of on at compile-time unknown amount is an important feature for most programs. @cpindex Virtual address space @cpindex Virtual memory-address @cpindex Memory, virtual address space @cpindex @sc{RAM} @cpindex Swap space On modern operating systems, processes do not have direct access to the memory. Only the operating system kernel does. Instead, the process have virtual memory-addresses, that the kernel maps to either, real @sc{RAM}, swap space (disc backed), file segments, or zeroes. @cpindex Forks @cpindex Exec:s @cpindex Process image @cpindex Memory sharing, private memory @cpindex Private memory sharing @cpindex Memory deduplication @cpindex Deduplication memory Memory for a process is either allocated programmatically, or when the process forks (is created) or exec:s (changes process image.) The operating system kernel is typically configured to share a much memory between processes as possible. For example, and a process forks, they will share their memory rather than duplicate the memory, and the kernel will only remap the memory when the processs' memory content diverges. It is also possible to allocate memory in such a way that processes can share it. so that updates from one process influences the other processes. @cpindex Virtual address space segments @cpindex Memory segments @cpindex Segments, virtual address space A process' virtual address space is divided into segments. There are three important segments. @table @i @item text segment @cpindex Segment, text @cpindex Text segment @cpindex @code{.text} @cpindex Instructions @cpindex Static constants @cpindex Constants, static @cpindex Literals @cpindex Strings, literals When a process exec:s this segment is allocated. It contains instructions, static constants, and literals. @item BSS segment @cpindex Segment, @sc{BSS} @cpindex @sc{BSS} segment @cpindex @code{.bss} @cpindex Block Started by Symbol @cpindex Uninitialised variables @cpindex Zero variables @cpindex Global variables @cpindex Static variables When a process exec:s this segment is allocated. It contains all global and static variables that are initialised to zero or lacks explicit initialisation. On some systems this segment is merged into the data segment. @sc{BSS} is an acronym: `Block Started by Symbol'. @item data segment @cpindex Segment, data @cpindex Data segment @cpindex @code{.data} @cpindex Heap @cpindex Memory, heap @cpindex Global variables @cpindex Static variables When a process exec:s this segment is allocated. It is filled all global and static variables that are not covered by the @sc{BSS} segment. This segment's lower end is fixed, and its upper end is unfixed; it can be resized. Any part of the segment that is a result of it being resized, is referred to as the heap. @item stack segment @cpindex Segment, stack @cpindex Stack segment @cpindex Memory, stack @cpindex Call-stack @cpindex Automatic variables This segment contains a@footnote{Program stack's can created programmtically, hence `a' rather than `the'.} program stack. A program stack contains information required to return after a function call, and automatic variables. Depending on the platform and the function it may also contain arguments passed in function calls and return values. It grows as the stack grows, but it does not shrink as the stack shrinks. @end table The layout of the segments is machine dependent and operating system. However, a common@footnote{Keeping in mind this cannot be assumed practice, and that it is in fact different between systems.} layout is have the text segment (as other fixed segments) start at 0, and end at some positive address. The text segment is then followed by the @sc{BSS} segment, and the data segment. The stack segment however, grows from the highest address (@math{-1} on two's complement-machines) downwards. The process cannot allocate any more memory when the allocation would require the data segment to be grown to such an extent that it would overlap with the stack segment. In C there are multiple ways to allocate memory. @itemize @bullet{} @item @cpindex Global variables @cpindex Static allocations Variables that are declared outside functions are called global variables@footnote{Even if that are declared with @code{static}. In this context, @code{static} is only use to hide object from other translation units.}. These are stored either in the @sc{BSS} segment or in the data segment, depending on their initialisation. Pointer are stored as numerical values, and the content is stored in the text segment. Arrays however are not stored, but their content is. In the data segment (or in the @sc{BSS} segment if the elements are zeroes.) These allocations are known as @i{static allocations}. @item @cpindex @code{static} @cpindex Static variables @cpindex Static allocations Variables that are declared inside functions, with @code{static}, are stored just like global variables. These are called static variables, and remain unchanged between function calls, and only change in statements other than the declaration statement. These allocations are known as @i{static allocations}. @item @cpindex @code{auto} @cpindex Local variables @cpindex Automatic variables @cpindex Automatic allocations @cpindex Stack-allocations Variables that are declared inside functions (these are known as local variables), without @code{static}, but with @code{auto}, are called automatic variables. These are stored in the stack segment, and are deallocated when the function returns. Local variables that are declared with neither @code{static}, @code{auto}, or @code{register} are often though of as automatic; however, the compiler may choose to add @code{register}. These allocations are known as @i{automatic allocations}@footnote{Known in some other programming languages as stack-allocations.}. @item @cpindex @code{register} @cpindex Register variables Variables that are declared with @code{register} are not stored in any segment. They lack addresses and stored as CPU registers. @item @cpindex Dynamic allocation @cpindex Heap-allocation Using system calls, a heap can be created, where new allocations are stored. These are often allocated with the function @code{malloc}, and are known as @i{dynamic allocations}@footnote{Known in some other programming languages as heap-allocations.}. @end itemize @cpindex Dynamic allocation @cpindex Automatic allocations @cpindex Stack-allocations Some compilers, including @sc{GCC}, provide two additional ways to allocate memory. @table @asis @item @i{Variable-length arrays} @cpindex Variable-length arrays @cpindex Arrays, variable-length A simple example of variable-length arrays, available with some compilers, is @example void function(size_t n) @{ int array[n]; /* ... */ @} @end example Variable-length arrays have a special property: they may be deallocated before the function returns. In fact, they are returned once the variable becomes invisible, this causes the follow example to work without every exhausting the memory. @example void function(size_t n) @{ for (;;) @{ int array[n]; /* ... */ @} @} @end example @item @code{alloca} @fnindex alloca @code{alloca} is a special function that is implement by the compiler. It increases the stack and returns a pointer to the beginning of the new part of the stack. It is similar to variable-length arrays, however the allocation is not deallocated before the function returns. This causes the follow example to eventually exhaust the memory. @example void function(size_t n) @{ for (;;) @{ int pointer* = alloca(n); /* ... */ @} @} @end example @end table Both of these allocation-methods are both automatic and dynamic. @menu * The alloca function:: Dynamically allocate automatically freed memory. * Basic memory allocation:: Basic functions for dynamic memory allocation. * Resizing memory allocations:: How to resize memory allocations. * Efficient stack-based allocations:: Improving the performance using constrained allocation methods. * Resizing the data segment:: How to change the size of the heap. * Memory locking:: How to prevent pages from being swapped out. @end menu @node The alloca function @section The @code{alloca} function TODO @node Basic memory allocation @section Basic memory allocation TODO @node Resizing memory allocations @section Resizing memory allocations TODO @node Efficient stack-based allocations @section Efficient stack-based allocations TODO @node Resizing the data segment @section Resizing the data segment TODO @node Memory locking @section Memory locking TODO