Concurrent Squeak (was Re: election details *PLEASE READ*)

David T. Lewis lewis at mail.msen.com
Fri Feb 23 12:09:45 UTC 2007


You can do approach (3) with an ordinary Squeak image if you are
using a unix platform (including OS X, I think) with OSProcess. Use
#forkHeadlessSqueakAndDo: to start the "threads", and connect them
with OSPipes. The endpoints of an OSPipe are FileStreams, so you
can read and write serialized objects between the images. The
#forkSqueak turns out to be surprisingly fast and memory efficient.

I'm not up to speed on Croquet, but some variant of this technique
might be a convenient way to start up a large number of cooperating
Croquet images, presumably using sockets instead of OSPipe.

Dave

On Thu, Feb 22, 2007 at 10:21:42PM -0800, Andreas Raab wrote:
> Nice summary. The only thing I have to add is that your approach (3) is 
> how Croquet works. We currently don't do it inside a single image but we 
> have been talking about it and at some point we will get around to it.
> 
> Cheers,
>   - Andreas
> 
> J J wrote:
> >
> >Afaik there are 3 ways of handling true concurrent execution (i.e. not 
> >green threads):
> >
> >1) Fine-grained locking/shared thread state:
> >
> >The old way of running heavy weight threads, sharing memory across 
> >threads and using some kind of locking to protect against race conditions.
> >
> >Positive:  Hrm, well I guess there is the most support for this, since 
> >it is probably the most common.  If you don't use any locking but only 
> >read the data shared this is very fast approach.
> >
> >Negative: It simply doesn't scale well.  It also doesn't compose well.  
> >You can't simply put two independently created pieces of code together 
> >that use locking and expect it to work.  Stated another way, 
> >fine-grained locking is the manual memory management of concurrency 
> >methodologies [1].  If any part of your code is doing fine-grain 
> >locking, you can never "just use it" somewhere else.  You have to dig 
> >deep down in every method to make sure you aren't going to cause a 
> >deadlock.
> >
> >This one would probably be very hard to add to Squeak based on what John 
> >said.
> >
> >2) Shared state, transactional memory:
> >
> >Think relational database.  You stick a series of code in an "atomic" 
> >block and the system does what it has to to make it appear as the memory 
> >changes occurred atomically.
> >
> >Positive:  This approach affords some composability.  You still should 
> >know if the methods your calling are going to operate on memory, but in 
> >the case that you put two pieces of code together that you know will, 
> >you can just slap an atomic block around them and it works.  The system 
> >can also ensure that nested atomic blocks work as expected to further 
> >aid composability.  This approach can often require very few changes to 
> >existing code to make it thread safe.  And finally, you can still have 
> >all (most?) of the benefits of thread-shared memory without having to 
> >give up so much abstraction (i.e. work at such a low level).
> >
> >Negative:  To continue the above analogy, I consider this one the 
> >"reference counted memory management" of options.  That is, it works as 
> >expected, but can end up taking more resources and time in the end.  My 
> >concern with this approach is that it still does need some knowledge of 
> >what the code you are calling does at a lower level.  And most people 
> >aren't going to want to worry about it so they will just stick "atomic" 
> >everywhere.  That probably wont hurt anything, but it forces the system 
> >to keep track of a lot more things then it should, and this bookkeeping 
> >is not free.
> >
> >This one would also require some VM (probably very big) changes to 
> >support and could be tough to get right.
> >
> >3) Share nothing message passing:
> >
> >Basically, no threads, only independent processes that send messages 
> >between each other to get work done.
> >
> >Positive:  This approach also allows a high level of composability.  If 
> >you get new requirements, you typically add new processes to deal with 
> >them.  And at last, you don't have to think about what the other "guy" 
> >is going to do.  A system designed in this manner is very scalable; in 
> >Erlang for example, a message send doesn't have to worry if it is 
> >sending to a local process or a totally different computer.  A message 
> >send is a message send.  There is no locking at all in this system, so 
> >no process is sleeping waiting for some other process to get finished 
> >with a resource it wants (low level concerns).  Instead a process will 
> >block waiting for another process to give him work (high level concerns).
> >
> >Negative:  This requires a new way of architecting in the places that 
> >use it.  What we are used to is; call a function and wait for an 
> >answer.  An approach like this works best if your message senders never 
> >care about answers.  The "main loop" sends out work, the consumers 
> >consume it and generate output that they send to other consumers (i.e. 
> >not the main loop).  In some cases, what we would normally do in a 
> >method is done in a whole other process.  Code that uses this in 
> >smalltalk will also have to take care, as we *do* have state that could 
> >leak to local processes.  We would either have to make a big change how 
> >#fork and co. work today to ensure no information can be shared, or we 
> >would have to take care in our coding that we don't make changes to data 
> >that might be shared.
> >
> >I think this one would be, by far, the easiest to add to Squeak (unless 
> >we have to change #fork and co, of course).  I think the same code that 
> >writes out objects to a file could be used to serialize them over the 
> >network.  The system/package/whatever can check the recipient of a 
> >message send to decide if it is a local call that doesn't need to be 
> >serialized or not.
> >
> >[1] The big win usually cited for GC's is something to the effect of 
> >"well, people forget to clean up after themselves and this frees up 
> >their time by not making them".  But really, the big win was 
> >composability.  In any GC-less system, it is always a nightmare of who 
> >has responsibility for deleting what, when.  You can't just use a new 
> >vendor API, you have to know if it cleans up after itself, do I have to 
> >do it, is there some API I call?  With a GC you just forget about it, 
> >use the API and everything works.
> >
> >_________________________________________________________________
> >Win a Zune??make MSN? your homepage for your chance to win! 
> >http://homepage.msn.com/zune?icid=hmetagline
> >
> >
> >
> 



More information about the Squeak-dev mailing list