On Friday, 24 May 2013 at 06:52:19 UTC, Diggory wrote:
On Tuesday, 21 May 2013 at 20:08:16 UTC, Leandro Lucarella wrote:
I'm interested in what you're describing, but I don't know how can you achieve this without fork()ing (or clone()ing in Linux). What does "remap shared memory using COW" in a context where fork() doesn't happen? Why do you even need shared memory if fork() doesn't happen? If "remap shared memory using COW" means get a different address for the same block of memory until a write happens in that block, then you can't
scan the roots anymore.

I'm *very* interested in your suggestion.

After doing some further investigation I think I've found a fairly awesome way of doing garbage collection on windows, hopefully linux has a similar mechanism. It doesn't require memory mapped files or anything special, it can be done retroactively, and it allows a kind of reverse copy on write which is what's actually needed.

When the GC is run:
- Use VirtualProtect to mark all mutable memory pages as read-only - Add a vectored exception handler to handle the access violation exception
- Resume the GC thread

I've tried writing a generational GC for D that used page protection for write barriers a while ago. IIRC, I ran into performance issues (the page faults were rather expensive).

This approach does have the benefit that it will not cause pages that have been moved to swap to be pulled out in order to be scanned every time, though.

Reply via email to