papierkorb:forth_memory_allocator
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| papierkorb:forth_memory_allocator [2025-08-10 22:50] – ↷ Seite von projects:forth_memory_allocator nach papierkorb:forth_memory_allocator verschoben mka | papierkorb:forth_memory_allocator [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | < | ||
| - | Forth Interest Group | ||
| - | Category 18, Topic 86 | ||
| - | Message 5 Mon Aug 13, 1990 | ||
| - | GARY-S | ||
| - | |||
| - | |||
| - | PORTED FROM UseNet => | ||
| - | ------ | ||
| - | From: wmb@MITCH.ENG.SUN.COM | ||
| - | | ||
| - | | ||
| - | | ||
| - | Date: 10 Aug 90 00:08:09 GMT | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | ^^^^^ | ||
| - | Split for ForthNet port - part a | ||
| - | |||
| - | > In a similar vein, does anyone have a forth memory allocator/ | ||
| - | |||
| - | | ||
| - | | ||
| - | It strikes a reasonable balance between speed of allocation, speed of | ||
| - | | ||
| - | size pieces. | ||
| - | |||
| - | | ||
| - | Mitch Bradley | ||
| - | |||
| - | |||
| - | \ Forth dynamic storage managment. | ||
| - | \ Implementation of the ANS Forth BASIS 11 memory allocation wordset. | ||
| - | \ | ||
| - | \ By Don Hopkins, University of Maryland (now at Sun Microsystems) | ||
| - | \ Heavily modified by Mitch Bradley, Bradley Forthware | ||
| - | \ Public Domain. | ||
| - | \ Feel free to include this in any program you wish, including | ||
| - | \ commercial programs and systems, but please give us credit. | ||
| - | \ | ||
| - | \ First fit storage allocation of blocks of varying size. | ||
| - | \ Blocks are prefixed with a usage flag and a length count. | ||
| - | \ Free blocks are collapsed downwards during free-memory and while | ||
| - | \ searching during allocate-memory. | ||
| - | \ in Knuth' | ||
| - | \ sections 5-6.2 and 5-6.3, pp. 501-511. | ||
| - | \ | ||
| - | \ In the following stack diagrams, " | ||
| - | \ | ||
| - | \ init-allocator | ||
| - | | ||
| - | | ||
| - | \ | ||
| - | \ add-memory | ||
| - | | ||
| - | | ||
| - | | ||
| - | \ | ||
| - | \ allocate | ||
| - | | ||
| - | | ||
| - | | ||
| - | \ | ||
| - | \ free ( adr -- ior | 0 ) | ||
| - | | ||
| - | | ||
| - | | ||
| - | \ | ||
| - | \ resize | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | \ | ||
| - | \ available | ||
| - | | ||
| - | | ||
| - | |||
| - | 8 constant #dalign \ Machine-dependent worst-case alignment boundary | ||
| - | |||
| - | 2 base ! | ||
| - | | ||
| - | | ||
| - | | ||
| - | |||
| - | : field \ name ( offset size -- offset' | ||
| - | create over , + does> @ + | ||
| - | ; | ||
| - | |||
| - | | ||
| - | /n field .dbuf-flag | ||
| - | /n field .dbuf-size | ||
| - | | ||
| - | 0 field .dbuf-data | ||
| - | /n field .dbuf-suc | ||
| - | /n field .dbuf-pred | ||
| - | | ||
| - | |||
| - | | ||
| - | ---------- | ||
| - | Forth Interest Group | ||
| - | Category 18, Topic 86 | ||
| - | Message 6 Mon Aug 13, 1990 | ||
| - | GARY-S | ||
| - | |||
| - | |||
| - | PORTED FROM UseNet => | ||
| - | ------ | ||
| - | |||
| - | From: wmb@MITCH.ENG.SUN.COM | ||
| - | | ||
| - | | ||
| - | | ||
| - | Date: 10 Aug 90 00:08:09 GMT | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | ^^^^^ | ||
| - | Split for ForthNet port - part b | ||
| - | |||
| - | : > | ||
| - | |||
| - | : dbuf-flag! | ||
| - | : dbuf-flag@ | ||
| - | : dbuf-size! | ||
| - | : dbuf-size@ | ||
| - | : dbuf-suc! | ||
| - | : dbuf-suc@ | ||
| - | : dbuf-pred! | ||
| - | : dbuf-pred@ | ||
| - | |||
| - | : next-dbuf | ||
| - | |||
| - | \ Insert new-node into doubly-linked list after old-node | ||
| - | : insert-after | ||
| - | >r r@ dbuf-suc@ | ||
| - | dup r@ dbuf-suc! | ||
| - | r> over dbuf-pred! | ||
| - | dup dbuf-suc@ dbuf-pred! | ||
| - | ; | ||
| - | : link-with-free | ||
| - | *dbuf-free* | ||
| - | dbuf-head insert-after | ||
| - | ; | ||
| - | |||
| - | \ Remove node from doubly-linked list | ||
| - | : remove-node | ||
| - | dup dbuf-pred@ | ||
| - | dup dbuf-suc@ | ||
| - | ; | ||
| - | |||
| - | \ Collapse the next node into the current node | ||
| - | |||
| - | : merge-with-next | ||
| - | dup next-dbuf dup remove-node | ||
| - | |||
| - | over dbuf-size@ swap dbuf-size@ + rot dbuf-size! | ||
| - | ; | ||
| - | |||
| - | \ node is a free node. Merge all free nodes immediately following | ||
| - | \ into the node. | ||
| - | |||
| - | : merge-down | ||
| - | begin | ||
| - | dup next-dbuf dbuf-flag@ | ||
| - | while | ||
| - | dup merge-with-next | ||
| - | repeat | ||
| - | ; | ||
| - | |||
| - | \ The following words form the interface to the memory | ||
| - | \ allocator. | ||
| - | \ only and should not be used by applications. | ||
| - | |||
| - | : msize ( adr -- count ) >dbuf dbuf-size@ > | ||
| - | |||
| - | : free ( adr -- ior | 0 ) | ||
| - | > | ||
| - | dup dbuf-flag@ *dbuf-used* <> | ||
| - | -1 | ||
| - | else | ||
| - | | ||
| - | then | ||
| - | ; | ||
| - | ---------- | ||
| - | Forth Interest Group | ||
| - | Category 18, Topic 86 | ||
| - | Message 7 Mon Aug 13, 1990 | ||
| - | GARY-S | ||
| - | |||
| - | |||
| - | PORTED FROM UseNet => | ||
| - | ------ | ||
| - | |||
| - | From: wmb@MITCH.ENG.SUN.COM | ||
| - | | ||
| - | | ||
| - | | ||
| - | Date: 10 Aug 90 00:08:09 GMT | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | ^^^^^ | ||
| - | Split for ForthNet port - part c | ||
| - | |||
| - | : add-memory | ||
| - | \ Align the starting address to a " | ||
| - | \ guarantee that allocated data areas will be on a " | ||
| - | \ alignment boundary. | ||
| - | |||
| - | swap dup #dalign round-up | ||
| - | dup rot - ( len adr' diff ) | ||
| - | rot swap - ( adr' len' ) | ||
| - | |||
| - | \ Set size and flags fields for first piece | ||
| - | |||
| - | \ Subtract off the size of one node header, because we carve out | ||
| - | \ a node header from the end of the piece to use as a " | ||
| - | \ That " | ||
| - | \ trying to merge past the end of the piece. | ||
| - | |||
| - | > | ||
| - | |||
| - | \ Ensure that the piece is big enough to be useable. | ||
| - | \ A piece of size dbuf-min (after having subtracted off the " | ||
| - | \ header) is barely useable, because the space used by the free list | ||
| - | \ links can be used as the data space. | ||
| - | |||
| - | dup dbuf-min < abort" add-memory: piece too small" | ||
| - | |||
| - | \ Set the size and flag for the new free piece | ||
| - | |||
| - | *dbuf-free* 2 pick dbuf-flag! | ||
| - | 2dup swap dbuf-size! | ||
| - | |||
| - | \ Create the " | ||
| - | |||
| - | \ XXX The stopper piece should be linked into a piece list, | ||
| - | \ and the flags should be set to a different value. | ||
| - | \ field should indicate the total size for this piece. | ||
| - | \ The piece list should be consulted when adding memory, and | ||
| - | \ if there is a piece immediately following the new piece, they | ||
| - | \ should be merged. | ||
| - | |||
| - | over + ( first-node first-node-limit ) | ||
| - | *dbuf-used* swap dbuf-flag! | ||
| - | |||
| - | link-with-free | ||
| - | ; | ||
| - | : allocate | ||
| - | \ Keep pieces aligned on " | ||
| - | #dalign round-up | ||
| - | |||
| - | .dbuf-data dbuf-min max ( size ) | ||
| - | |||
| - | \ Search for a sufficiently-large free piece | ||
| - | dbuf-head | ||
| - | begin ( size node ) | ||
| - | | ||
| - | dup dbuf-head = if \ Bail out if we've already been around | ||
| - | 2drop -1 exit ( ior ) | ||
| - | | ||
| - | | ||
| - | dup dbuf-size@ | ||
| - | 2 pick >= ( size node big-enough? ) | ||
| - | until ( size node ) | ||
| - | |||
| - | dup dbuf-size@ 2 pick - ( size node left-over ) | ||
| - | dup dbuf-min <= if \ Too small to fragment? | ||
| - | |||
| - | \ The piece is too small to split, so we just remove the whole | ||
| - | \ thing from the free list. | ||
| - | |||
| - | drop nip ( node ) | ||
| - | dup remove-node | ||
| - | else ( size node left-over ) | ||
| - | |||
| - | \ The piece is big enough to split up, so we make the free piece | ||
| - | \ smaller and take the stuff after it as the allocated piece. | ||
| - | |||
| - | 2dup swap dbuf-size! | ||
| - | | ||
| - | tuck dbuf-size! | ||
| - | then | ||
| - | *dbuf-used* over dbuf-flag! | ||
| - | .dbuf-data 0 ( adr 0 ) | ||
| - | ; | ||
| - | ---------- | ||
| - | Forth Interest Group | ||
| - | Category 18, Topic 86 | ||
| - | Message 8 Mon Aug 13, 1990 | ||
| - | GARY-S | ||
| - | |||
| - | |||
| - | PORTED FROM UseNet => | ||
| - | ------ | ||
| - | |||
| - | From: wmb@MITCH.ENG.SUN.COM | ||
| - | | ||
| - | | ||
| - | | ||
| - | Date: 10 Aug 90 00:08:09 GMT | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | ^^^^^ | ||
| - | Split for ForthNet port - part d | ||
| - | |||
| - | : available | ||
| - | 0 .dbuf-data | ||
| - | |||
| - | dbuf-head | ||
| - | begin ( size node ) | ||
| - | | ||
| - | while \ Go once around the free list | ||
| - | | ||
| - | dup dbuf-size@ | ||
| - | rot max swap ( size' node ) | ||
| - | repeat | ||
| - | drop > | ||
| - | ; | ||
| - | |||
| - | \ XXX should be smarter about extending or contracting the current piece | ||
| - | \ "in place" | ||
| - | : resize | ||
| - | allocate | ||
| - | | ||
| - | swap free 0 ( adr2 0 ) | ||
| - | else ( adr ) | ||
| - | | ||
| - | then | ||
| - | ; | ||
| - | |||
| - | \ Head node has 0 size, is not free, and is initially linked to itself | ||
| - | : init-allocator | ||
| - | *dbuf-used* dbuf-head dbuf-flag! | ||
| - | 0 dbuf-head dbuf-size! \ Must be 0 so the allocator won't find it. | ||
| - | dbuf-head | ||
| - | dbuf-head | ||
| - | ; | ||
| - | ---------- | ||
| - | </ | ||
papierkorb/forth_memory_allocator.1754859050.txt.gz · Zuletzt geändert: 2025-08-10 22:50 von mka