Need dynamic memory allocation both for main memory
and for file space on disk.
Two basic operations in dynamic storage management:
Dynamic allocation can be handled in one of two
general ways:
- Stack allocation (hierarchical): restricted, but simple and
efficient.
- Heap allocation: more general, but less efficient, more difficult
to implement.
Stack organization: memory allocation and freeing are
partially predictable (as usual, we do better when we can predict the future).Allocation is hierarchical: memory is freed in opposite order from allocation.
If alloc(A) then alloc(B) then alloc(C), then it must be free(C) then free(B)then free(A).
- Example: procedure call. Program calls Y, which calls X. Each call
pushes another stack frame on top of the stack. Each stack frame has space forvariable, parameters, and return addresses.
- Stacks are also useful for lots of other things: tree traversal,
expression evaluation, top-down recursive descent parsers, etc.
A stack-based organization keeps all the free space
together in one place.
Heap organization: allocation and release are
unpredictable. Heaps are used for arbitrary list structures, complex dataorganizations. Example: payroll system. Do not know when employees will join and
leave the company, must be able to keep track of all them using the leastpossible amount of storage.
- Inevitably end up with lots of holes. Goal: reuse the space in
holes to keep the number of holes small, their size large.
- Fragmentation: inefficient use of memory due to holes that are too
small to be useful. In stack allocation, all the holes are together in one bigchunk.
- Refer to Knuth volume 1 for detailed treatment of what
follows.
- Typically, heap allocation schemes use a free list to keep track
of the storage that is not in use. Algorithms differ in how they manage the freelist.
- Best fit: keep linked list of
free blocks, search the whole list on each allocation, choose block that comesclosest to matching the needs of the allocation, save the excess for later.
During release operations, merge adjacent free blocks.
- First fit:
just scan list for the first hole that is large enough. Free excess. Also mergeon releases. Most first fit implementations are rotating first
fit.
- Bit Map: used for allocation of storage that comes in fixed-size
chunks (e.g. disk blocks, or 32-byte chunks). Keep a large array of bits, onefor each chunk. If bit is 0 it means chunk is in use, if bit is 1 it means chunk
is free. Will be discussed more when talking about file systems.
Pools: keep a separate allocation pool for each
popular size. Allocation is fast, no fragmentation.
Reclamation Methods: how do we know when memory can
be freed?
- It is easy when a chunk is only used in one place.
- Reclamation is hard when information is shared: it cannot be
recycled until all of the sharers are finished. Sharing is indicated by thepresence of pointers to the data (show example). Without a pointer, cannot
access (cannot find it).
Two problems in reclamation: