README
上传用户:nthfjj
上传日期:2007-01-07
资源大小:37k
文件大小:9k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
  2. This material may be freely distributed, provided this notice is retained.
  3. This material is provided as is, with no warranty expressed or implied.
  4. Use at your own risk.
  5.   This collector was developed as a part of research projects supported in
  6. part by the National Science Foundation and the Defense Advance Research
  7. Projects Agency.  The SPARC specific code was contributed by Mark Weiser
  8. (weiser.pa@xerox.com).  The Encore Multimax modifications were supplied by
  9. Kevin Kenny (kenny@m.cs.uiuc.edu).  The adaptation to the RT is largely due
  10. to Vernon Lee, on machines made available by IBM. (Blame for misinstallation
  11. of those modifications goes to the first author, however.) Some of the
  12. improvements incorporated in this version were suggested by David Chase at
  13. Olivetti Research.
  14.   This is intended to be a general purpose, garbage collecting storage
  15. allocator.  The algorithms used are described in:
  16. Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment",
  17. Software Practice & Experience, September 1988, pp. 807-820.
  18.   Many of the ideas underlying the collector have previously been explored
  19. by others.  (We discovered recently that Doug McIlroy wrote a more or less
  20. similar collector that is part of version 8 UNIX (tm).)  However none of this
  21. work appears to have been widely disseminated.
  22.   The tools for detecting storage leaks described in the above paper
  23. are not included here.  There is some hope that they might be released
  24. by Xerox in the future.
  25.   Since the collector does not require pointers to be tagged, it does not
  26. attempt to insure that all inaccessible storage is reclaimed.  However,
  27. in our experience, it is typically more successful at reclaiming unused
  28. memory than most C programs using explicit deallocation.
  29.   In the following, an "object" is defined to be a region of memory allocated
  30. by the routines described below.  
  31.   Any objects not intended to be collected must be pointed to either
  32. from other such accessible objects, or from the registers,
  33. stack, data, or statically allocated bss segments.  It is usually assumed
  34. that all such pointers point to the beginning of the object.  (This does
  35. not disallow interior pointers; it simply requires that there must be a
  36. pointer to the beginning of every accessible object, in addition to any
  37. interior pointers.  Conditionally compiled code to check for pointers to the
  38. interiors of objects is supplied.  As explained in "runtime.h", this
  39. may create other problems, however.)
  40.   Note that pointers inside memory allocated by the standard "malloc" are not
  41. seen by the garbage collector.  Thus objects pointed to only from such a
  42. region may be prematurely deallocated.  It is thus suggested that the
  43. standard "malloc" be used only for memory regions, such as I/O buffers, that
  44. are guaranteed not to contain pointers.  Pointers in C language automatic,
  45. static, or register variables, are correctly recognized.
  46.   The collector is designed to minimize stack growth if link fields inside
  47. structures are allocated first.  (Normally only linked lists of lengths
  48. exceeding about 100000 will cause this to be noticable.)
  49.   Signal processing for most signals is deferred during collection. (This
  50. is not done on the MIPS machine under System V, where this seem to require
  51. many system calls.  If signal handling is desired, the user will probably
  52. find it necessary to suspend those signals that are actually used.)
  53.   As distributed, the collector produces garbage collection statistics
  54. during every collection.  Once the collector is known to operate properly,
  55. these can be suppressed by undefining the appropriate macros at the top
  56. of "runtime.h".  (The given statistics exhibit a few peculiarities.
  57. Things don't appear to add up for a variety of reasons, most notably
  58. fragmentation losses.  These are probably much more significant for the
  59. contrived program "test.c" than for your application.)
  60.   The collector currently is designed to run essentially unmodified on
  61. the following machines:
  62.     Sun 3
  63.     Sun 4  (except under some versions of 3.2)
  64.     Vax under Berkeley UNIX
  65.     Sequent Symmetry  (no concurrency)
  66.     Encore Multimax   (no concurrency)
  67.     MIPS M/120 (and presumably M/2000) (System V)
  68.     IBM PC/RT  (Berkeley UNIX)
  69.   For these machines you should check the beginning of runtime.h
  70. to verify that the machine type is correctly defined.  On an Encore Multimax,
  71. MIPS M/120, or a PC/RT, you will also need to make changes to the
  72. Makefile, as described by comments there.
  73.   In all cases we assume that pointer alignment is consistent with that
  74. enforced by the standard C compilers.  If you use a nonstandard compiler
  75. you may have to adjust the alignment parameters defined in runtime.h.
  76.   On a MIPS machine or PC/RT, we assume that no calls to sbrk occur during a
  77. collection. (This is necessary due to the way stack expansion works on these
  78. machines.) This may become false if certain kinds of I/O calls are inserted
  79. into the collector.
  80.   For machines not already mentioned, the following are likely to require
  81. change:
  82. 1.  The parameters at the top of runtime.h and the definition of
  83.     TMP_POINTER_MASK further down in the same file.
  84. 2.  mach_dep.c.  This includes routines to mark from registers,
  85.     and to save registers not normally preserved by the C compiler.
  86.     (The latter should not be necessary unless assembly language calls
  87.     to the allocator are used.)  If your machine does not allow in-line
  88.     assembly code, this may be replaced by a .s file (as we did for the MIPS
  89.     machine and the PC/RT).
  90.   For a different UN*X version or different machine using the Motorola 68000,
  91. Vax, SPARC, 80386, NS 32000, PC/RT, or MIPS architecture, it should frequently
  92. suffice to change definitions in runtime.h.
  93.   The following routines are intended to be directly called by the user.
  94. Note that only gc_malloc and gc_init are necessary.  The remaining routines
  95. are used solely to enhance performance.  It is suggested that they be used
  96. only after initial debugging.
  97. 1)  gc_init()
  98.     - called once before allocation to initialize the collector.
  99. 2)  gc_malloc(nbytes)
  100.     - allocate an object of size nbytes.  Unlike malloc, the object is
  101.       cleared before being returned to the user.  (For even better performance,
  102.       it may help to expand the relevant part of gc_malloc in line.
  103.       This is done by the Russell compiler, for example.)  Gc_malloc will
  104.       invoke the garbage collector when it determines this to be appropriate.
  105.       (A number of previous collector bugs resulted in objects not getting
  106.       completely cleared.  We claim these are all fixed.  But if you encounter
  107.       problems, this is a likely source to check for.  The collector tries
  108.       hard to avoid clearing any words that it doesn't have to.  Thus this
  109.       is a bit subtle.)
  110.       
  111. 3)  gc_malloc_atomic(nbytes)
  112.     - allocate an object of size nbytes that is guaranteed not to contain any
  113.       pointers.  The returned object is not guaranteed to be cleeared.
  114.       (Can always be replaced by gc_malloc, but results in faster collection
  115.       times.  The collector will probably run faster if large character
  116.       arrays, etc. are allocated with gc_malloc_atomic than if they are
  117.       statically allocated.)
  118. 4)  gc_free(object)
  119.     - explicitly deallocate an object returned by gc_malloc or
  120.       gc_malloc_atomic.  Not necessary, but can be used to minimize
  121.       collections if performance is critical.
  122. 5)  expand_hp(number_of_4K_blocks)
  123.     - Explicitly increase the heap size.  (This is normally done automatically
  124.       if a garbage collection failed to reclaim enough memory.  Explicit
  125.       calls to expand_hp may prevent unnecessarily frequent collections at
  126.       program startup.)
  127.   The global variable dont_gc can be set to a non-zero value to inhibit
  128. collections, e.g. during a time-critical section of code.  (This may cause
  129. otherwise unnecessary exansion of the process' memory.)
  130.   The variable non_gc_bytes, which is normally 0, may be changed to reflect
  131. the amount of memory allocated by the above routines that should not be
  132. considered as a candidate for collection.  Collections are inhibited
  133. if this exceeds a given fraction (currently 3/4) of the total heap size.
  134. The heap is simply expanded instead.  Careless use may, of course, result
  135. in excessive memory consumption.
  136.   Some additional tuning is possible through the parameters defined
  137. near the top of runtime.h.
  138.   
  139.   The two gc_malloc routines may be declared to return a suitable pointer
  140. type.  It is not intended that runtime.h be included by the user program.
  141. If only gc_malloc is intended to be used, it might be appropriate to define:
  142. #define malloc(n) gc_malloc(n)
  143. #define calloc(m,n) gc_malloc((m)*(n))
  144.   No attempt is made to use obscure names for garbage collector routines
  145. and data structures.  Name conflicts are possible.  (Running "nm gc.o"
  146. should identify names to be avoided.)
  147.   Please address bug reports to boehm@rice.edu.