[commit: ghc] wip/gc/nonmoving-nonconcurrent: rts: Non-concurrent mark and sweep (207c4b4)

git at git.haskell.org git at git.haskell.org
Thu Feb 21 15:12:41 UTC 2019


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/gc/nonmoving-nonconcurrent
Link       : http://ghc.haskell.org/trac/ghc/changeset/207c4b4cf09b9408442de9a4a20ecf99b6903a8d/ghc

>---------------------------------------------------------------

commit 207c4b4cf09b9408442de9a4a20ecf99b6903a8d
Author: Ömer Sinan Ağacan <omer at well-typed.com>
Date:   Tue Feb 5 00:18:44 2019 -0500

    rts: Non-concurrent mark and sweep
    
    This implements the core heap structure and a serial mark/sweep
    collector which can be used to manage the oldest-generation heap.
    This is the first step towards a concurrent mark-and-sweep collector
    aimed at low-latency applications.
    
    The full design of the collector implemented here is described in detail
    in a technical note
    
        B. Gamari. "A Concurrent Garbage Collector For the Glasgow Haskell
        Compiler" (2018)
    
    The basic heap structure used in this design is heavily inspired by
    
        K. Ueno & A. Ohori. "A fully concurrent garbage collector for
        functional programs on multicore processors." /ACM SIGPLAN Notices/
        Vol. 51. No. 9 (presented by ICFP 2016)
    
    This design is intended to allow both marking and sweeping
    concurrent to execution of a multi-core mutator. Unlike the Ueno design,
    which requires no global synchronization pauses, the collector
    introduced here requires a stop-the-world pause at the beginning and end
    of the mark phase.
    
    To avoid heap fragmentation, the allocator consists of a number of
    fixed-size /sub-allocators/. Each of these sub-allocators allocators into
    its own set of /segments/, themselves allocated from the block
    allocator. Each segment is broken into a set of fixed-size allocation
    blocks (which back allocations) in addition to a bitmap (used to track
    the liveness of blocks) and some additional metadata (used also used
    to track liveness).
    
    This heap structure enables collection via mark-and-sweep, which can be
    performed concurrently via a snapshot-at-the-beginning scheme (although
    concurrent collection is not implemented in this patch).
    
    The mark queue is a fairly straightforward chunked-array structure.
    The representation is a bit more verbose than a typical mark queue to
    accomodate a combination of two features:
    
     * a mark FIFO, which improves the locality of marking, reducing one of
       the major overheads seen in mark/sweep allocators (see [1] for
       details)
    
     * the selector optimization and indirection shortcutting, which
       requires that we track where we found each reference to an object
       in case we need to update the reference at a later point (e.g. when
       we find that it is an indirection). See Note [Origin references in
       the nonmoving collector] (in `NonMovingMark.h`) for details.
    
    Beyond this the mark/sweep is fairly run-of-the-mill.
    
    [1] R. Garner, S.M. Blackburn, D. Frampton. "Effective Prefetch for
        Mark-Sweep Garbage Collection." ISMM 2007.
    
    Co-Authored-By: Ben Gamari <ben at well-typed.com>


>---------------------------------------------------------------

207c4b4cf09b9408442de9a4a20ecf99b6903a8d
 includes/rts/storage/Block.h |   11 +-
 rts/Capability.c             |    1 +
 rts/Capability.h             |    1 +
 rts/RtsStartup.c             |    3 +
 rts/Weak.c                   |   18 +-
 rts/sm/Evac.c                |   38 +-
 rts/sm/GC.c                  |  190 ++++---
 rts/sm/GCAux.c               |    8 +
 rts/sm/GCThread.h            |    4 +-
 rts/sm/NonMoving.c           |  819 ++++++++++++++++++++++++++++
 rts/sm/NonMoving.h           |  270 ++++++++++
 rts/sm/NonMovingMark.c       | 1212 ++++++++++++++++++++++++++++++++++++++++++
 rts/sm/NonMovingMark.h       |  140 +++++
 rts/sm/NonMovingScav.c       |  366 +++++++++++++
 rts/sm/NonMovingScav.h       |   10 +
 rts/sm/NonMovingSweep.c      |  273 ++++++++++
 rts/sm/NonMovingSweep.h      |   32 ++
 rts/sm/Sanity.c              |  103 +++-
 rts/sm/Scav.c                |   28 +-
 rts/sm/Storage.c             |   19 +-
 rts/sm/Storage.h             |    1 +
 21 files changed, 3453 insertions(+), 94 deletions(-)

Diff suppressed because of size. To see it, use:

    git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 207c4b4cf09b9408442de9a4a20ecf99b6903a8d


More information about the ghc-commits mailing list