Exploiting Dual Core's with Py_NewInterpreter's separated GIL ?

Joe Seigh jseigh_01 at xemaps.com
Tue Nov 7 09:06:59 EST 2006


Paul Rubin wrote:
> robert <no-spam at no-spam-no-spam.invalid> writes:
> 
>>>I don't want to discourage you but what about reference
>>>counting/memory
>>>management for shared objects? Doesn't seem fun for me.
>>
>>in combination with some simple locking (anyway necessary) I don't
>>see a problem in ref-counting.
>>If at least any interpreter branch has a pointer to the (root)
>>object in question the ref-count is >0. ----
>>Question Besides: do concurrent INC/DEC machine OP-commands execute
>>atomically on Multi-Cores as they do in Single-Core threads?
> 
> 
> Generally speaking, no, the inc/dec instructions are not atomic.  You
> can do an atomic increment on the x86 using LOCK XCHG (or maybe LOCK
> INC is possible).  The thing is that the locking protocol that
> guarantees atomicity is very expensive, like 100x as expensive as an
> unlocked instruction on a big multiprocessor.  So yes, of course you
> could accomplish reference counting through locks around the ref
> counts, but performance suffers terribly.  The solution is to get rid
> of the ref counts and manage the entire heap using garbage collection.

Atomic increment and decrement instructions are not by themselves
sufficient to make reference counting safe.  It's what Boost::shared_ptr
uses to make itself internally thread-safe but it's not safe to copy
a shared_ptr without "owning" it. Not like Java where you can safely
copy a reference (Java pointer) no matter what.

Basically there's a race condition where an object containing the
refcount can be deleted between the time you load a pointer to
the object and the time you increment what used to be a refcount
and is possibly something else but definitely undefined.

I have an experimental refcounting implementation at
http://atomic-ptr-plus.sourceforge.net/


> 
> For stuff like dictionary access, there are protocols (again based on
> LOCK XCHG) that don't require locking for lookups.  Only updates
> require locking.  Simon Peyton-Jones has a good paper about how it's
> done in Concurrent Haskell:
> 
>   http://research.microsoft.com/~simonpj/papers/stm/stm.pdf
> 
> This is really cool stuff and has found its way into Perl 6.  I'd like
> to see Python get something like it.

That seems to be about STM (Software Transactional Memory).  What you're
describing seems to be read lock-free using what I call PDR
(PCOW (Partial Copy On Write) Deferred Reclaimation).  Examples of PDR
are RCU (used in Linux kernel),  Maged Michael's SMR hazard pointers,
and thread-safe GC (used in Java's concurrent collections java.util.concurrent).

You can also use PDR to manage safe refcounting ,e.g. RCU based refcounting, rcuref,
in the Linux kernel.

-- 
Joe Seigh

When you get lemons, you make lemonade.
When you get hardware, you make software. 



More information about the Python-list mailing list