On 19/01/11 16:14, Sam Vilain wrote:
> In general, Java's basic types typically correspond with types that can
> be dealt with atomically by processors, or are small enough to be passed
> by value.  This already makes things a lot easier.
>
> I've had another reason for the differences explained to me.  I'm not
> sure I understand it fully enough to be able to re-explain it, but I'll
> try anyway.  As I grasped the concept, the key to making VMs fully
> threadable with shared state, is to first allow reference addresses to
> change, such as via generational garbage collection.  This allows you to
> have much clearer "stack frames", perhaps even really stored on the
> thread-local/C stack, as opposed to most dynamic language interpreters
> which barely use the C stack at all.  Then, when the long-lived objects
> are discovered at scope exit time they can be safely moved into the next
> memory pool, as well as letting access to "old" objects be locked (or
> copied, in the case of Software Transactional Memory).  Access to
> objects in your own frame can therefore be fast, and the number of locks
> that have to be held reduced.

Ref:
http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#33308
and to a lesser extent, the note on
http://java.sun.com/docs/books/jvms/second_edition/html/Threads.doc.html#22244

> Perhaps to support/refute this argument, in your JVM, how do you handle:
>
> - memory allocation: object references' timeline and garbage collection
> - call stack frames and/or return continuations - the C stack or the heap?
> - atomicity of functions (that's the "synchronized" keyword?)
> - timely object destruction
>
>  put it forward that the overall design of the interpreter, and
> therefore what is possible in terms of threading, is highly influenced
> by these factors.
>
> When threading in C or C++ for instance (and this includes HipHop-TBB),
> the call stack frame is on the C stack, so shared state is possible so
> long as you pass heap pointers around and synchronise appropriately. 
> The "virtual" machine is of a different nature, and it can work.  For
> JVMs, as far as I know references are temporary and again the nature of
> the execution environment is different.
>
> For VMs where there is basically nothing on the stack, and everything on
> the heap, it becomes a lot harder.  To talk about a VM I know better,
> Perl has about 6 internal stacks all represented on the heap; a function
> call/return stack, a lexical scope stack to represent what is in scope,
> a variable stack (the "tmps" stack) for variables declared in those
> scopes and for timely destruction, a stack to implement local($var)
> called the "save" stack, a "mark" stack used for garbage collection, ok
> well only 5 but I think you get my point.  From my reading of the PHP
> internals so far there are similar set there too, so comparisons are
> quite likely to be instructive.  It's a bit hard figuring out everything
> that is going on internally (all these internal void* types don't help
> either), and whether or not there is some inherent property of reference
> counting, or whether it just makes a shared state model harder, is a
> question I'm not sure is easy to answer
>

Based on https://github.com/smarr/RoarVM/blob/98caf11d0/README.rst it
can be seen that indeed it is a completely different architecture.  From
the first of the ACM papers' abstract:

In addition to the cost of inter-core communication, two hardware
characteristics influenced our design: the absence of hardware-provided
cache-coherence, and the inability to move a single object from one
core's cache to another's without changing its address.

> In any case, full shared state is not required for a large set of useful
> parallelism APIs, and in fact contains a number of pitfalls which are
> difficult to explain, debug and fix.  I'm far more interested in simple
> acceleration of tight loops - to make use of otherwise idle CPU cores
> (perhaps virtual as in hyperthreading) to increase throughput - and APIs
> like "map" express this well.  The idea is that the executor can start
> up with no variables in scope, though hopefully shared code segments,
> call some function on the data it is passed in, and pass the answers
> back to the main thread and then set about cleaning itself up.

You could probably support this with any paper on Erlang ;-)

Sam

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to