.. _MemManage:
.. raw:: html
.. |--| unicode:: U+2013 .. en dash
.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace
:trim:
.. odsalink:: AV/MemManage/dynamicCON.css
.. odsalink:: AV/MemManage/seqFitCON.css
.. This file is part of the OpenDSA eTextbook project. See
.. http://algoviz.org/OpenDSA for more details.
.. Copyright (c) 2012-2013 by the OpenDSA Project Contributors, and
.. distributed under an MIT open source license.
.. avmetadata::
:author: Cliff Shaffer
=================
Memory Management
=================
Memory Management
-----------------
Memory Management
~~~~~~~~~~~~~~~~~
* Problem: Records (of various lengths) need to be stored.
* Model: A big array of space to store them, managed by a memory
manager.
* Like a coat-check stand, give them your coat, get back a ticket.
Later, return the ticket for your coat.
* We call the ticket a **handle**.
Memory Manager ADT
~~~~~~~~~~~~~~~~~~
::
// Memory Manager abstract class
interface MemManager {
// Store a record and return a handle to it
public MemHandle insert(byte[] info);
// Release the space associated with a record
public void release(MemHandle h);
// Get back a copy of a stored record
public byte[] getRecord(MemHandle h);
}
Implementation Issues
~~~~~~~~~~~~~~~~~~~~~
* The client doesn’t know what is in the handle.
* The memory manager doesn’t know what is in the message.
* Multiple clients can share a memory manager.
* The memory manager might interact with a buffer pool:
* The client decides what gets stored
* The memory manager decides where things get stored
* The buffer pool decides when blocks are in main memory
Dynamic Storage Allocation
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Use a memory manager when:
* Access patterns are uncertain
* Messages are of varying length
* Over time, memory contains interspersed free blocks and reserved
blocks.
* When adding a new message, find a free block large enough
* When deleting, merge free blocks
.. inlineav:: freeblocklistCON dgm
:align: justify
Fragmentation
~~~~~~~~~~~~~
* **Internal fragmentation:** when more space is allocated than the message
size.
* Might be done to make memory management easier
* Example: Sectors and clusters on disk
* **External fragmentation:** Free blocks too small to be useful.
.. inlineav:: fragCON dgm
:align: center
Managing the Free Blocks
~~~~~~~~~~~~~~~~~~~~~~~~
* A key issue is how to merge free blocks
#. Use a linked list of free blocks (external to the memory pool)
.. inlineav:: seqFitCON dgm
:align: justify
Selecting a Free Block
~~~~~~~~~~~~~~~~~~~~~~
* Somehow, need to pick one of the free blocks in which to store the
message
* It must be at least as large as the message (plus whatever
info the memory manager needs, such as size and tags)
* Extra space can be returned as a free block
* Want to minimize fragmentation, and avoid failing to service
requests
Sequential Fit Methods
~~~~~~~~~~~~~~~~~~~~~~
| First Fit: Start from beginning, pick first free block that is
big enough
| Store list in memory-pool order
| Circular first fit: Move forward from current position
| Best Fit: Pick the smallest block big enough
| Store by block size, or search list
| Protect large blocks for big requests
| Worst Fit: Pick the biggest block
| Store by block size, or search list
| Avoid external fragmentation
Example
~~~~~~~
.. avembed:: AV/MemManage/firstFitAV.html ss
:module: MemManage
.
~
|
Buddy Method
~~~~~~~~~~~~
| The memory pool is a power of 2 in size.
| Memory allocations are always the smallest power of 2 equal to or
bigger than the request.
| Free (and allocated) blocks are therefore always a power of 2
| Keep a list for each block size
| Easy to merge freed blocks
Buddy Method Example
~~~~~~~~~~~~~~~~~~~~
.. avembed:: AV/MemManage/BuddyAV.html ss
:module: MemManage
.
~
|
Failure Policies
~~~~~~~~~~~~~~~~
| What do we do if there is no free block that can hold the message?
| Must resort to a **failure policy**.
| Reject the request
| Grow the memory
| Compact the memory
| Garbage collection
.. odsascript:: AV/MemManage/freeblocklistCON.js
.. odsascript:: AV/MemManage/fragCON.js
.. odsascript:: AV/MemManage/seqFitCON.js