Region-based memory management

Region-based memory management

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 zone, arena, or memory context, is a collection of allocated objects that can be efficiently deallocated all at once. Like stack allocation, regions facilitate allocation and deallocation of memory with low overhead; but they are more flexible, allowing objects to live longer than the activation record in which they were allocated. In typical implementations, all objects in a region are allocated in a single contiguous range of memory addresses.

As a simple example, consider the following pseudocode which allocates and then deallocates a linked list data structure:

r ← createRegion()
ListNode head ← null
for i from 1 to 1000
    newNode ← allocateFromRegion(r, sizeof(ListNode))
    newNode.next ← head
    head ← newNode
destroyRegion(r)

Although it required many operations to construct the linked list, it can be destroyed quickly in a single operation by destroying the region in which the nodes were allocated. There is no need to traverse the list.

Contents

Implementation

Simple explicit regions are straightforward to implement; the following description is based on Hanson.[1] 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 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.[2] In 1990, Hanson demonstrated that explicit regions in C (which he called arenas) could achieve time performance per allocated byte superior to even the fastest-known heap allocation mechanism.[1] Explicit regions were instrumental in the design of a number of early C-based software projects, including the Apache HTTP Server, which calls them arenas, and the PostgreSQL database management system, which calls them memory contexts.[3] 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,[4] 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 functions in Standard ML, a functional programming language, using a different algorithm based on type inference and the theoretical concepts of polymorphic region types and the region calculus.[5][6] Their work introduced an extension of the lambda calculus including regions, adding two constructs:

e1 at ρ: Compute the result of the expression e1 and store it in region ρ;
letregion ρ in e2 end: Create a region and bind it to ρ; evaluate e2; then deallocate the region.

Due to this syntactic structure, regions are nested, meaning that if r2 is created after r1, it must also be deallocated before r1; 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.[7]

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 recursive calls, and eliminating regions which contained only a single value. This work was completed in 1995[8] 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.[9] 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.[10][11]

Generalization to new language environments

Following the development of ML Kit, regions began to be generalized to other language environments:

  • Various extensions to the C programming language:
    • The safe C dialect Cyclone, which among many other features adds support for explicit regions, and evaluates the impact of migrating existing C applications to use them.[12][13][14]
    • An extension to C called RC[15] 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.[16][17] 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.[18]
    • 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.[19]
  • Regions were implemented for a subset of Java,[20] and became a critical component of memory management in Real time Java, which combines them with ownership types to demonstrate object encapsulation and eliminate runtime checks on region deallocation.[21][22][23] 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.[24][25] Regions are a good fit for real-time computing because their time overhead is statically predictable, without the complexity of incremental garbage collection.
  • They were implemented for the logic programming languages Prolog[26][27][28] and Mercury[29][30] by extending Tofte and Talpin's region inference model to support backtracking and cuts.

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.[10] On the other hand, tracing garbage collectors can also exhibit subtle leaks, if references are retained to data which will never be used again.

Region-based memory management works best when the number of regions is relatively small and each contains many objects; programs that contain many sparse regions will exhibit internal fragmentation, leading to wasted memory and a time overhead for region management. Again, in the presence of region inference this problem can be more difficult to diagnose.

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.[31]

References

  1. ^ a b Hanson, David R. (1989). "Fast allocation and deallocation of memory based on object lifetimes". Software: Practice and Experience 20 (1): 5–12. doi:10.1002/spe.4380200104. http://www3.interscience.wiley.com/journal/113446436/abstract?CRETRY=1&SRETRY=0. 
  2. ^ Ross, Douglas (1967). "The AED free storage package". Communications of the ACM 10 (8): 481–492. doi:10.1145/363534.363546. http://portal.acm.org/citation.cfm?id=363546. 
  3. ^ 2010 PostgreSQL Global Development Group (1996). "Section 41.3: Memory Management". PostgreSQL 8.2.15 Documentation. http://www.postgresql.org/docs/8.2/static/spi-memory.html. Retrieved 22 February 2010. 
  4. ^ Ruggieri, Cristina; Murtagh, Thomas P. (1988). "Lifetime analysis of dynamically allocated objects". POPL '88: Proceedings of the 15th ACM SIGPLAN-SIGACT symposium on Principles of programming languages. New York, NY, USA: ACM. doi:10.1145/73560.73585. http://portal.acm.org/citation.cfm?id=73585. Retrieved 2010-02-22. 
  5. ^ Tofte, Mads; Jean-Pierre Talpin (1993). A Theory of Stack Allocation in Polymorphically Typed Languages (Technical report). Department of Computer Science, Copenhagen University. 93/15.  On Citeseer
  6. ^ Tofte, Mads; Talpin, Jean-Pierre (1994). "Implementation of the Typed Call-by-Value λ-calculus using a Stack of Regions". POPL '94: Proceedings of the 21st ACM SIGPLAN-SIGACT symposium on Principles of programming languages. New York, NY, USA: ACM. pp. 188–201. doi:10.1145/174675.177855. ISBN 0-89791-636-0. 
  7. ^ Aiken, Alex; Manuel Fähndrich, Raph Levien (1995). Better Static Memory Management: Improving Region-Based Analysis of Higher-Order Languages (Technical report). EECS Department, University of California, Berkeley. UCB/CSD-95-866.  On Citeseer
  8. ^ Birkedal, Lars; Tofte, Mads; Vejlstrup, Magnus (1996). "From region inference to von Neumann machines via region representation inference". POPL '96: Proceedings of the 23rd ACM SIGPLAN-SIGACT symposium on Principles of programming languages. New York, NY, USA: ACM. pp. 171–183. doi:10.1145/237721.237771. ISBN 0-89791-769-3. http://portal.acm.org/citation.cfm?id=237721.237771. Retrieved 2010-02-22. 
  9. ^ Tofte, Mads; Birkedal, Lars; Elsman, Martin; Hallenberg, Niels (2004). "A Retrospective on Region-Based Memory Management". Higher Order Symbolic Computing (Hingham, MA, USA: Kluwer Academic Publishers) 17 (3): 245–265. doi:10.1023/B:LISP.0000029446.78563.a4. ISSN 1388-3690. http://www.springerlink.com/content/m2074884n6gt612h/. Retrieved 2009-2-20. 
  10. ^ a b Hallenberg, Niels; Elsman, Martin; Tofte, Mads (2003). "Combining region inference and garbage collection". SIGPLAN Notices (New York, NY, USA: ACM) 37 (5): 141–152. doi:10.1145/543552.512547. ISSN 0362-1340. http://portal.acm.org/citation.cfm?id=543552.512547. 
  11. ^ Elsman, Martin (2003). "Garbage collection safety for region-based memory management". SIGPLAN Notices (New York, NY, USA: ACM) 38 (3): 123–134. doi:10.1145/640136.604190. ISSN 0362-1340. http://portal.acm.org/citation.cfm?id=640136.604190. 
  12. ^ "Cyclone: Introduction to Regions". Cyclone User Manual. http://cyclone.thelanguage.org/wiki/Introduction%20to%20Regions. Retrieved 22 February 2010. 
  13. ^ Grossman, Dan; Morrisett, Greg; Jim, Trevor; Hicks, Michael; Wang, Yanling (2002). "Region-based memory management in cyclone". SIGPLAN Notices 37 (5): 282–293. doi:1145/543552.512563. http://portal.acm.org/citation.cfm?id=512563#. 
  14. ^ Hicks, Michael; Morrisett, Greg; Grossman, Dan (2004). "Experience with safe manual memory-management in cyclone". ISMM '04: Proceedings of the 4th international symposium on Memory management. New York, NY, USA: ACM. pp. 73–84. doi:1145/1029873.1029883. ISBN 1-58113-945-4,. http://portal.acm.org/citation.cfm?id=1029883. Retrieved 2010-02-22. 
  15. ^ Gay, David (1999). "RC - Safe, region-based memory-management for C". David Gay's homepage. Intel Labs Berkeley. http://berkeley.intel-research.net/dgay/rc/index.html. Retrieved 22 February 2010. [dead link]
  16. ^ Gay, David; Aiken, Alex (1998). "Memory management with explicit regions". PLDI '98: Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation. New York, NY, USA: ACM. pp. 313–323. doi:10.1145/277650.277748. ISBN 0-89791-987-4. http://portal.acm.org/citation.cfm?id=277650.277748. Retrieved 2010-02-22. 
  17. ^ Gay, David Edward (2001). Memory management with explicit regions (PhD in Computer Science thesis). University of California at Berkeley. http://theory.stanford.edu/~aiken/publications/theses/gay.pdf. Retrieved 20 February 2010. 
  18. ^ Gay, David; Aiken, Alex (2001). "Language support for regions". SIGPLAN Notices (New York, NY, USA: ACM) 36 (5): 70–80. doi:10.1145/381694.378815. ISSN 0362-1340. http://portal.acm.org/citation.cfm?id=378815. Retrieved 2010-02-22. 
  19. ^ Kowshik, Sumant; Dhurjati, Dinakar; Adve, Vikram (2002). "Ensuring code safety without runtime checks for real-time control systems". CASES '02: Proceedings of the 2002 international conference on Compilers, architecture, and synthesis for embedded systems. New York, NY, USA: ACM. pp. 288–297. doi:10.1145/581630.581678. ISBN 1-58113-575-0. http://portal.acm.org/citation.cfm?id=581678. Retrieved 2010-02-22. 
  20. ^ Christiansen, Morten (1998). Region-based memory management in Java (Masters in Computer Science thesis). Department of Computer Science (DIKU), University of Copenhagen. ftp://ftp.diku.dk/diku/semantics/papers/D-395.ps.gz. Retrieved 20 February 2010. 
  21. ^ Beebee, William S.; Rinard, Martin C. (2001). "An Implementation of Scoped Memory for Real-Time Java". EMSOFT '01: Proceedings of the First International Workshop on Embedded Software. London, UK: Springer-Verlag. pp. 289–305. ISBN 3-540-42673-6. http://www.cag.lcs.mit.edu/~rinard/paper/emsoft01.ps. Retrieved 2010-02-22. 
  22. ^ Sălcianu, Alexandru; Chandrasekhar Boyapati, William Beebee, Jr., Martin Rinard (2003). A type system for safe region-based memory management in Real-Time Java (Technical report). MIT Laboratory for Computer Science. MIT-LCS-TR-869. http://people.csail.mit.edu/rinard/techreport/MIT-LCS-TR-869.pdf. 
  23. ^ Boyapati, Chandrasekhar; Salcianu, Alexandru; Beebee, Jr., William (2003). "Ownership types for safe region-based memory management in real-time Java". PLDI '03: Proceedings of the ACM SIGPLAN 2003 conference on Programming language design and implementation. New York, NY, USA: ACM. pp. 324–337. doi:1145/781131.781168. ISBN 1-58113-662-5,. http://portal.acm.org/citation.cfm?id=781168. Retrieved 2010-02-22. 
  24. ^ Nahkli, Chaker; Rippert, Christophe; Salagnac, Guillaume; Yovine, Sergio (2007). "Efficient region-based memory management for resource-limited real-time embedded systems". Proceedings of "Workshop on Implementation, Compilation, Optimization of Object-Oriented Languages, Programs and Systems (ICOOOLPS'2006)". http://hal.inria.fr/docs/00/30/96/88/PDF/06-Salagnac-ICOOOLPS.pdf. Retrieved 2010-02-22. 
  25. ^ Salagnac, Guillaume; Rippert, Christophe (2007). "Semi-Automatic Region-Based Memory Management for Real-Time Java Embedded Systems". RTCSA '07: Proceedings of the 13th IEEE International Conference on Embedded and Real-Time Computing Systems and Applications. Washington, DC, USA: IEEE Computer Society. pp. 73–80. doi:1109/RTCSA.2007.67. ISBN 0-7695-2975-5,. http://www.computer.org/portal/web/csdl/doi/10.1109/RTCSA.2007.67. Retrieved 2010-02-22. 
  26. ^ Makholm, Henning (2001). "A region-based memory manager for prolog". SIGPLAN Notices 36 (1): 25–34. doi:1145/362426.362434. http://portal.acm.org/citation.cfm?id=362434#. 
  27. ^ Makholm, Henning (2000). Region-based memory management in Prolog (Masters in Computer Science thesis). University of Copenhagen, Denmark. http://www.diku.dk/OLD/publikationer/tekniske.rapporter/rapporter/00-09.pdf. Retrieved 20 February 2010. 
  28. ^ Makholm, Henning (2000). "A region-based memory manager for prolog". ISMM '00: Proceedings of the 2nd international symposium on Memory management. New York, NY, USA: ACM. pp. 25–34. doi:1145/362422.362434. ISBN 1-58113-263-8,. http://portal.acm.org/citation.cfm?id=362422.362434. Retrieved 2010-02-22. 
  29. ^ Phan, Quan; Janssens, Gerda (2007). "Static region analysis for Mercury". Lecture Notes in Computer Science: Logic Programming (Springer Berlin / Heidelberg) 4670/2007: 317–332. doi:10.1007/978-3-540-74610-2. ISSN 1611-3349. http://www.springerlink.com/content/eq2396u4glmv77j1/. Retrieved 2010-02-22. 
  30. ^ Phan, Quan; Somogyi, Zoltan (2008). "Runtime support for region-based memory management in Mercury". ISMM '08: Proceedings of the 7th international symposium on Memory management. New York, NY, USA: ACM. pp. 61–70. doi:1145/1375634.1375644. ISBN 978-1-60558-134-7,. 
  31. ^ Blackburn, Stephen M.; McKinley, Kathryn M. (2008). "Immix: a mark-region garbage collector with space efficiency, fast collection, and mutator performance". PLDI '08: Proceedings of the 2008 ACM SIGPLAN conference on Programming language design and implementation. New York, NY, USA: ACM. pp. 22–32. doi:10.1145/1375581.1375586. ISBN 978-1-59593-860-2. 

Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать курсовую

Look at other dictionaries:

  • Memory management — is the act of managing computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and freeing it for reuse when no longer needed. This is critical to …   Wikipedia

  • Memory management unit — This 68451 MMU could be used with the Motorola 68010 A memory management unit (MMU), sometimes called paged memory management unit (PMMU), is a computer hardware component responsible for handling accesses to memory requested by the CPU. Its… …   Wikipedia

  • Manual memory management — In computer science, manual memory management refers to the usage of manual instructions by the programmer to identify and deallocate unused objects, or garbage. Up until the mid 1990s, the majority of programming languages used in industry… …   Wikipedia

  • Memory segmentation — is the division of computer memory into segments or sections. Segments or sections are also used in object files of compiled programs when they are linked together into a program image, or the image is loaded into memory. In a computer system… …   Wikipedia

  • Memory pool — Memory pools, also called fixed size blocks allocation, allow dynamic memory allocation comparable to malloc or C++ s operator new. As those implementations suffer from fragmentation because of variable block sizes, it can be impossible to use… …   Wikipedia

  • Memory safety — Software Testing portal Memory safety is a concern in software development that aims to avoid software bugs that cause security vulnerabilities dealing with random access memory (RAM) access, such as buffer overflows and dangling pointers.… …   Wikipedia

  • Memory leak — A memory leak, in computer science (or leakage, in this context), occurs when a computer program consumes memory but is unable to release it back to the operating system. In object oriented programming, a memory leak happens when an object is… …   Wikipedia

  • Stack-based memory allocation — Stacks in computing architectures are regions of memory where data is added or removed in a Last In First Out manner.In most modern computer systems, each thread has a reserved region of memory referred to as its stack. When a function executes,… …   Wikipedia

  • C dynamic memory allocation — C Standard Library Data types Character classification Strings Mathematics File input/output Date/time Localization …   Wikipedia

  • Virtual memory — This article is about the computational technique. For the TBN game show, see Virtual Memory (game show). Virtual memory combines active RAM and inactive memory in disk form into a large range of contiguous addresses. In computing, virtual memory …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”