[MLton] Transactions for ML
Eric McCorkle
ericmcc at cs.brown.edu
Thu Apr 19 22:39:43 PDT 2007
On Apr 19, 2007, at 8:31 PM, Suresh Jagannathan wrote:
> As Matthew rightly points out, the stabilizer implementation is
> easily adapted to support
> concurrent transactions. Our current implementation provides an
> STM interface that
> implements a pessimistic write/optimistic read incarnation,
> although we have
> experimented in the past with an optimistic (logging) write version
> as well.
McRT papers suggest that read versioning/undo-logging is the best
approach. These strategies are much better for compiler
optimizations as well. The biggest problem with undo logging,
however, is that you either have to do eager conflict detection on
every access, or you have to somehow deal with the possibility of
seeing inconsistent data (McRT opts for the former).
I have a list of ideas for how a compiler can do things that a
library can't possibly do. To name a few: generate undo logs as
actual code, rather than building a data structure (similar to
implementing exceptions with continuations versus unwinding the
stack), use knowledge of transaction behavior available at compile
time to do things better.
There's also several optimizations one can perform on transactions
themselves (most of these require very sophisticated analysis)
> Of course, porting this implementation to a multiprocessor/multi-
> core environment is
> significantly more challenging, requiring modifying the garbage
> collector, atomic
> primitives
The most advanced schedulers, like FreeBSD's ULE scheduler maintain a
separate structure for each OS-level thread, and only communicate
between schedulers to steal work. You need a barrier to make sure no
one tries to steal work while legitimate scheduling is going on, but
aside from that, with lock-free data structures, one could should be
able to implement a scheduler with no locks at all.
I know significantly less about garbage collectors. If I recall,
cheng-blelloch (which is the only one I know anything about) claims
only to need a barrier and a room, though I'm not sure.
Modern STM systems use locks and memory allocation, and in the worst
case can invoke arbitrarily complex contention managers.
My intuition at this point would be to have the scheduler run
separate from everything, the garbage collector use locks, and the TM
system allocate from the heap and use locks. The sticking point for
me is how to implement the scheduler. If you do it in C or something
else, then communicating with SML efficiently becomes an issue.
However, if you do it in SML, you have to somehow avoid allocating
memory while in the scheduler context. How do you and philip deal
with this, or do you organize things differently than what I'm
imagining?
--
Eric McCorkle
Brown University
CS Graduate Student
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mlton.org/pipermail/mlton/attachments/20070420/b2ce9f4d/attachment.htm
More information about the MLton
mailing list