A separate GC idea - multiple D GCs

Chris Katko ckatko at gmail.com
Fri Jan 21 13:56:09 UTC 2022

So I was going to ask this related question in my other thread 
but I now see it's hit over 30 replies (!) and the discussion is 
interesting but a separate topic.

So a related question: Has anyone ever thought about 
"thread-local garbage collection" or some sort of "multiple pool 
[same process/thread] garbage collection"? The idea here is, each 
thread [or thread collection] would have its own garbage 
collector, and, be the only thread that pauses during a 
collection event.

Basically, you cordon off your memory use like you would with say 
a memory pool, so that when a GC freezes it only freezes that 
section. Smaller, independent sections means less freeze time and 
the rest of the threads keep running on multiple core CPUs.

There are obviously some issues:

  1 - Is the D GC designed to allow something like this? Can it be 
prevented from walking into areas it shouldn't? I know you can 
make malloc non-system memory it "shouldn't" touch if you never 
make pointers to it?

  2 - It will definitely be more complex, and D can be too complex 
and finnicky already. (SEGFAULT TIME.) So patterns to prevent 
that will be needed. "Am I reading in my thread, or thread 37?"

  3 - Any boundary where threads "touch" will be either a 
nightmare or at least need some sort of mechanism to cross and 
synchronize across said boundary. And a frozen thread, 
synchronized, will freeze any reads by non-frozen threads. 
[Though one might be able to schedule garbage collections only 
when massive reads/writes aren't currently needed.]

I think the simple, easiest way to try this would be to just 
spawn multiple processes [each having their own D GC collector] 
and somehow share memory between them. But I have no idea if it's 
easy to work around the inherent "multiple process = context 
switch" overhead making it actually slower.

As for the "why?". I'm not sure if there are huge benefits, mild 
benefits, benefits in only niche scenarios (like games, which is 
the kind I play with). But I'm just curious about the prospect.

Because while an "iterative GC" requires... an entire new GC. 
Splitting off multiple existing D garbage collectors into their 
own fields could maybe work. [And once again, without benchmarks 
a single D GC may be more than fast for my needs.] But I'm 
curious and like to know my options, suggestions, and people's 
general thoughts on it.

Thanks, have a great day!

More information about the Digitalmars-d mailing list