Content deleted Content added
m linking |
m →Generalization to new language environments: HTTP to HTTPS for Blogspot |
||
(47 intermediate revisions by 23 users not shown) | |||
Line 1:
{{Short description|Memory allocation scheme}}▼
{{Use American English|date = February 2019}}
In [[computer science]], '''region-based memory management''' is a type of [[memory management]] in which each allocated object is assigned to a '''region'''. A region, also called a '''partition''', '''subpool''', '''zone''', '''arena''', '''area''', or '''memory context''', is a collection of allocated objects that can be efficiently reallocated or deallocated all at once. Memory allocators using region-based managements are often called '''area allocators''', and when they work by only "bumping" a single pointer, as '''bump allocators'''.
▲{{Short description|Memory allocation scheme}}
In [[OS/360 and successors]], the concept applies at two levels; each job runs within a contiguous partition{{efn|For [[OS/360 and successors#MFT|MFT]] and [[OS/VS1]]}} or region.{{efn|For [[OS/360 and successors#MVT|MVT]], [[OS/VS2]] and later [[MVS]] systems.}} Storage allocation requests specify a subpool, and the application can free an entire subpool. Storage for a subpool is allocated from the region or partition in blocks that are a multiple of 2 KiB{{efn|For OS/360 and OS/VS1}} or 4 KiB{{efn|For OS/VS2 and later MVS systems.}} that generally are not contiguous.
== Example ==▼
== Implementation ==
Simple explicit regions are straightforward to implement; the following description is based on the work of Hanson.<ref name="hanson">▼
{{cite journal |last1=Hanson |first1=David R. |year=1989 |title=Fast allocation and deallocation of memory based on object lifetimes |journal=Software: Practice and Experience |volume=20 |issue=1 |pages=5–12 |url=http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |archive-url=https://archive.today/20121020025006/http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |
▲Simple explicit regions are straightforward to implement; the following description is based on Hanson.<ref name="hanson">
</ref> Each region is implemented as a [[linked list]] of large blocks of memory; each block should be large enough to serve many allocations. The current block maintains a pointer to the next free position in the block, and if the block is filled, a new one is allocated and added to the list. When the region is deallocated, the next-free-position pointer is reset to the beginning of the first block, and the list of blocks can be reused for the next allocated region
▲{{cite journal |last1=Hanson |first1=David R. |year=1989 |title=Fast allocation and deallocation of memory based on object lifetimes |journal=Software: Practice and Experience |volume=20 |issue=1 |pages=5–12 |url=http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |archive-url=https://archive.today/20121020025006/http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0 |dead-url=yes |archive-date=2012-10-20 |doi=10.1002/spe.4380200104 }}
▲</ref> Each region is implemented as a [[linked list]] of large blocks of memory; each block should be large enough to serve many allocations. The current block maintains a pointer to the next free position in the block, and if the block is filled, a new one is allocated and added to the list. When the region is deallocated, the next-free-position pointer is reset to the beginning of the first block, and the list of blocks can be reused for the next region to be created. Alternatively, when a region is deallocated, its list of blocks can be appended to a global freelist from which other regions may later allocate new blocks. With this simple scheme, it is not possible to deallocate individual objects in regions.
The overall cost per allocated byte of this scheme is very low; almost all allocations involve only a comparison and an update to the next-free-position pointer. Deallocating a region is a constant-time operation, and is done rarely. Unlike in typical [[garbage collection (computer science)|garbage collection]] systems, there is no need to tag data with its type.
== History and concepts ==
The basic concept of regions is very old, first appearing as early as 1967 in Douglas T. Ross's AED Free Storage Package, in which memory was partitioned into a hierarchy of zones; each zone had its own allocator, and a zone could be freed all-at-once, making zones usable as regions.<ref>
{{cite journal |last1=Ross |first1=Douglas |year=1967 |title=The AED free storage package |journal=Communications of the ACM |volume=10 |issue=8 |pages=481–492 |doi=10.1145/363534.363546 |s2cid=6572689 |doi-access=free }}
</ref>
{{cite web |url=http://www.postgresql.org/docs/8.2/static/spi-memory.html |title=Section 41.3: Memory Management |author=2010 PostgreSQL Global Development Group |year=1996 |work=PostgreSQL 8.2.15 Documentation |accessdate=22 February 2010}}
</ref> Like traditional heap allocation, these schemes do not provide [[memory safety]]; it is possible for a programmer to access a region after it is deallocated through a [[dangling pointer]], or to forget to deallocate a region, causing a [[memory leak]].
=== Region inference ===
In 1988, researchers began investigating how to use regions for safe memory allocation by introducing the concept of '''region inference''', where the creation and deallocation of regions, as well as the assignment of individual static allocation expressions to particular regions, is inserted by the compiler at compile-time. The compiler is able to do this in such a way that it can guarantee dangling pointers and leaks do not occur.
In an early work by Ruggieri and Murtagh,<ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=73585 |title=Lifetime analysis of dynamically allocated objects |last1=Ruggieri |first1=Cristina |last2=Murtagh |first2=Thomas P. |year=1988 |
</ref> a region is created at the beginning of each function and deallocated at the end. They then use [[data flow analysis]] to determine a lifetime for each static allocation expression, and assign it to the youngest region that contains its entire lifetime.
In 1994, this work was generalized in a seminal work by Tofte and Talpin to support [[type polymorphism]] and [[higher-order function]]s in [[Standard ML]], a [[functional programming]] language, using a different algorithm based on [[type inference]] and the theoretical concepts of polymorphic [[region type]]s and the [[region calculus]].<ref>
{{cite
</ref><ref>
{{cite conference |title=Implementation of the Typed Call-by-Value λ-calculus using a Stack of Regions |last1=Tofte |first1=Mads |
</ref> Their work introduced an extension of the [[lambda calculus]] including regions, adding two constructs:
:''e''<sub>1</sub> at
:
Due to this syntactic structure, regions are ''nested'', meaning that if r<sub>2</sub> is created after r<sub>1</sub>, it must also be deallocated before r<sub>1</sub>; the result is a ''stack'' of regions. Moreover, regions must be deallocated in the same function in which they are created. These restrictions were relaxed by Aiken et al.<ref>
{{cite
</ref>
This extended lambda calculus was intended to serve as a provably memory-safe [[intermediate representation]] for compiling Standard ML programs into machine code, but building a translator that would produce good results on large programs faced a number of practical limitations which had to be resolved with new analyses, including dealing with recursive calls, [[tail
{{cite conference |url=http://portal.acm.org/citation.cfm?id=237721.237771 |title=From region inference to von Neumann machines via region representation inference |last1=Birkedal |first1=Lars |
</ref> and integrated into the ML Kit, a version of ML based on region allocation in place of garbage collection. This permitted a direct comparison between the two on medium-sized test programs, yielding widely varying results ("between 10 times faster and four times slower") depending on how "region-friendly" the program was; compile times, however, were on the order of minutes.<ref>
{{cite journal |last1=Tofte |first1=Mads |last2=Birkedal |first2=Lars |last3=Elsman |first3=Martin |last4=Hallenberg |first4=Niels |year=2004 |title=A Retrospective on Region-Based Memory Management |journal=Higher Order Symbolic Computing |volume=17 |issue=3 |pages=245–265 |issn=1388-3690 |doi=10.1023/B:LISP.0000029446.78563.a4 |doi-access=free }}
</ref> The ML Kit was eventually scaled to large applications with two additions: a scheme for separate compilation of modules, and a hybrid technique combining region inference with tracing garbage collection.<ref name="hybrid">
{{cite journal |last1=Hallenberg |first1=Niels |last2=Elsman |first2=Martin |last3=Tofte |first3=Mads |year=2003 |title=Combining region inference and garbage collection |journal=SIGPLAN Notices |volume=37 |issue=5 |pages=141–152 |issn=0362-1340 |doi=10.1145/543552.512547 }}
Line 72 ⟶ 53:
=== Generalization to new language environments ===
Following the development of ML Kit, regions began to be generalized to other language environments:
* Various extensions to the
** The safe C dialect [[Cyclone (programming language)|Cyclone]], which among many other features adds support for explicit regions, and evaluates the impact of migrating existing C applications to use them.<ref>
{{cite web |url=http://cyclone.thelanguage.org/wiki/Introduction%20to%20Regions |title=Cyclone: Introduction to Regions |work=Cyclone User Manual |accessdate=22 February 2010}}
Line 81 ⟶ 61:
{{cite journal |last1=Grossman |first1=Dan |last2=Morrisett |first2=Greg |last3=Jim |first3=Trevor |last4=Hicks |first4=Michael |last5=Wang |first5=Yanling |year=2002 |title=Region-based memory management in cyclone |journal=SIGPLAN Notices |volume=37 |issue=5 |pages=282–293 |doi=10.1145/543552.512563}}
</ref><ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=1029883 |title=Experience with safe manual memory-management in cyclone |last1=Hicks |first1=Michael
</ref>
** An extension to C called RC<ref>{{cite web|url=http://berkeley.intel-research.net/dgay/rc/index.html |title=RC - Safe, region-based memory-management for C |last1=Gay |first1=David |year=1999 |work=David Gay's homepage |publisher=Intel Labs Berkeley |accessdate=22 February 2010 |
</ref> was implemented that uses explicitly-managed regions, but also uses [[reference counting]] on regions to guarantee memory safety by ensuring that no region is freed prematurely.<ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=277650.277748 |title=Memory management with explicit regions |last1=Gay |first1=David |
</ref><ref>
{{Cite thesis |degree=PhD in Computer Science |title=Memory management with explicit regions |url=http://theory.stanford.edu/~aiken/publications/theses/gay.pdf |last=Gay |first=David Edward |year=2001 |publisher=University of California at Berkeley |accessdate=20 February 2010}}
</ref> Regions decrease the overhead of reference counting, since references internal to regions don't require counts to be updated when they're modified. RC includes an explicit static type system for regions that allows some reference count updates to be eliminated.<ref>
{{cite journal |title=Language support for regions |last1=Gay |first1=David |
</ref>
** A restriction of C called Control-C limits programs to use regions (and only a single region at a time), as part of its design to statically ensure memory safety.<ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=581678 |title=Ensuring code safety without runtime checks for real-time control systems |last1=Kowshik |first1=Sumant |last2=Dhurjati |first2=Dinakar |last3=Adve |first3=Vikram |year=2002 |publisher=ACM |___location=New York, NY, USA |accessdate=22 February 2010 |
</ref>
* Regions were implemented for a subset of [[Java (programming language)|Java]],<ref>
{{Cite
</ref> and became a critical component of memory management in [[Real time Java]], which combines them with [[ownership type]]s to demonstrate object encapsulation and eliminate runtime checks on region deallocation.<ref>{{cite conference |url=http://www.cag.lcs.mit.edu/~rinard/paper/emsoft01.ps |title=An Implementation of Scoped Memory for Real-Time Java |last1=Beebee |first1=William S. |last2=Rinard |first2=Martin C. |year=2001 |publisher=Springer-Verlag |___location=London, UK |accessdate=22 February 2010 |book-title=EMSOFT '01: Proceedings of the First International Workshop on Embedded Software |pages=289–305 |isbn=3-540-42673-6 }}{{Dead link|date=February 2020 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref>
{{cite tech report | title=A type system for safe region-based memory management in Real-Time Java | last1=Sălcianu |first1=Alexandru |author2=Chandrasekhar Boyapati, William Beebee, Jr., Martin Rinard |number=MIT-LCS-TR-869 | institution=MIT Laboratory for Computer Science |year=2003 |url=http://people.csail.mit.edu/rinard/techreport/MIT-LCS-TR-869.pdf}}
</ref><ref>
{{cite
</ref> More recently, a semi-automatic system was proposed for inferring regions in embedded real-time Java applications, combining a compile-time static analysis, a runtime region allocation policy, and programmer hints.<ref>
{{cite conference |url=http://hal.inria.fr/docs/00/30/96/88/PDF/06-Salagnac-ICOOOLPS.pdf |title=Efficient region-based memory management for resource-limited real-time embedded systems |last1=Nahkli |first1=Chaker |
</ref><ref>
{{cite conference |title=Semi-Automatic Region-Based Memory Management for Real-Time Java Embedded Systems |last1=Salagnac |first1=Guillaume |
</ref> Regions are a good fit for [[real-time computing]] because their time overhead is statically predictable, without the complexity of incremental garbage collection.
* Java 21 added a Java API to allocate and release Arenas.<ref>{{cite web |title=Memory Segments and Arenas |url=https://docs.oracle.com/en/java/javase/21/core/memory-segments-and-arenas.html#GUID-01CE34E8-7BCB-4540-92C4-E127C1F62711 |publisher=Oracle}}</ref> The stated purpose of these is to improve safe integration with native libraries so as to prevent JVM memory leaks and to reduce the risk of JVM memory corruption by native code.<ref>{{cite web |last1=Cimadamore |first1=Maurizio |title=JEP 454: Foreign Function & Memory API |url=https://openjdk.org/jeps/454 |publisher=OpenJDK}}</ref> Arenas are a part of the Java Foreign Function and Memory Interface, which is a successor to [[Java Native Interface]] (JNI), and includes classes like <code>Arena</code>, <code>MemorySegment</code>, and others.<ref>{{cite web|title=Package java.lang.foreign|url=https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/lang/foreign/package-summary.html|publisher=Oracle Corporation}}</ref>
* They were implemented for the [[logic programming]] languages [[Prolog]]<ref>
{{Cite thesis |degree=Masters in Computer Science |title=Region-based memory management in Prolog |url=http://www.diku.dk/OLD/publikationer/tekniske.rapporter/rapporter/00-09.pdf |last=Makholm |first=Henning |year=2000 |publisher=University of Copenhagen, Denmark |accessdate=20 February 2010 |
</ref><ref>
{{cite conference |url=http://portal.acm.org/citation.cfm?id=362422.362434 |last=Makholm |first=Henning |title=A region-based memory manager for prolog |year=2000 |publisher=ACM |___location=New York, NY, USA |accessdate=22 February 2010 |
</ref> and [[Mercury programming language|Mercury]]<ref>
{{cite book
</ref><ref>
{{cite conference |title=Runtime support for region-based memory management in Mercury |last1=Phan |first1=Quan |
</ref> by extending Tofte and Talpin's region inference model to support backtracking and cuts.
* Region-based storage management is used throughout the [[parallel programming language]] [[ParaSail (programming language)|ParaSail]].
{{Cite web |url=
== Disadvantages ==
Systems using regions may experience issues where regions become very large before they are deallocated and contain a large proportion of dead data; these are commonly called "leaks" (even though they are eventually freed). Eliminating leaks may involve restructuring the program, typically by introducing new, shorter-lifetime regions. Debugging this type of problem is especially difficult in systems using region inference, where the programmer must understand the underlying inference algorithm, or examine the verbose intermediate representation, to diagnose the issue. Tracing garbage collectors are more effective at deallocating this type of data in a timely manner without program changes; this was one justification for hybrid region/GC systems.<ref name="hybrid"/> On the other hand, tracing garbage collectors can also exhibit subtle leaks, if references are retained to data which will never be used again.
Line 126 ⟶ 104:
== Hybrid methods ==
As mentioned above, RC uses a hybrid of regions and [[reference counting]], limiting the overhead of reference counting since references internal to regions don't require counts to be updated when they're modified. Similarly, some ''mark-region'' hybrid methods combine [[tracing garbage collection]] with regions; these function by dividing the heap into regions, performing a mark-sweep pass in which any regions containing live objects are marked, and then freeing any unmarked regions. These require continual defragmentation to remain effective.<ref>
{{cite conference |title=Immix: a mark-region garbage collector with space efficiency, fast collection, and mutator performance |last1=Blackburn |first1=Stephen M. |
</ref>
{{notelist}}
== References ==
Line 136 ⟶ 116:
{{Memory management navbox}}
[[Category:Articles with example C code]]
[[Category:Memory management]]
|