Things that keep D from evolving?
Chris Wright via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Feb 10 12:21:22 PST 2016
On Wed, 10 Feb 2016 08:57:51 +0000, thedeemon wrote:
> Currently (at least last time I checked) GC pauses the world, then does
> all the marking in one thread, then all the sweeping.
Right.
> We can do the
> marking in several parallel threads (this is much harder to implement
> but still doable),
Parallel marking would not be a breaking change by any means. No user
code runs during GC collections, so we can do anything. The major fly in
the ointment is that creating threads normally invokes the GC, since
Thread is an object, and invoking the GC during a collection isn't the
best.
This can be solved by preallocating several mark threads. Then you just
divide the stack and roots between those threads. Moderately annoying
sync issues
This doesn't guarantee an even distribution of work. You can solve that
problem with a queue, though that requires locking.
The main wrinkle is writing a bit to shared data structures, which can be
slow. On the other hand, in the mark phase, we're only ever going to
write the same value to each, so it doesn't matter if GC thread A . I
don't know how to tell the CPU that it doesn't have to read back the
memory before writing it.
> and we can kick the sweeping out of stop-the-world
> pause and do the sweeping lazily
This would be a breaking change. Right now, your destructors are
guaranteed to run when no other code is running. You'd need to introduce
locks in a few places.
I'm not saying this is a bad thing. I think people generally wouldn't
notice if we made this change. But some code would break, so we'd have to
stage that change.
Anyway, I'm hacking up parallel mark phase to see how it would work. I
could use some GC benchmarks if anyone's got them lying around.
More information about the Digitalmars-d-learn
mailing list