.. _MemManage:
.. raw:: html
.. |--| unicode:: U+2013 .. en dash
.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace
:trim:
.. 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
.. odsalink:: AV/MemManage/dynamicCON.css
.. inlineav:: freeblocklistCON dgm
:align: justify
.. odsascript:: AV/MemManage/freeblocklistCON.js
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
.. odsascript:: AV/MemManage/fragCON.js
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)
.. odsalink:: AV/MemManage/seqFitCON.css
.. inlineav:: seqFitCON dgm
:align: justify
.. odsascript:: AV/MemManage/seqFitCON.js
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
:long_name: First Fit Visualization
:points: 0.0
:required: False
:threshold: 1.0
:exer_opts: JOP-lang=en&fitAlgorithm=1&JXOP-code=java
.
~
.
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