Re: [vos-d] s5 design overview
Peter Amstutz wrote: 1. Memory footprint The current s4 design has a lot of per-vobject overhead, leading to a significant memory footprint. The development version improves on this a bit, but the honest truth is that the implementation was not written with memory efficiency in mind. The s5 design will attempt to address in various ways, including attempting to directly minimize the byte count of crucial classes and data structures, and by using the flyweight pattern to collapse identical classes into a single shared instance. In particular, symbols (method names, message fields, types, etc) will be stored in a single global symbol table. This will ensure that such strings (which are expected to be used a lot in the system) are not duplicated, and has the convient effect of also making string comparison a constant-time pointer comparison instead of a linear time compare. This seems like a very good optimization, given how string-heavy the system is. Could string tables also be used to compress COD files more? How about network optimization by having two sites share a string table (or have a static standard string table of commonly used strings in the core protocol?). Also ... are properties stored as strings at the moment or as native bytes (I actually don't know this)? If they're stored as strings, compressing them to native data structures would probably be a big win too (same thing goes for properties with storing them in COD and sending them over the network). [I also had another idea related to network optimization -- which is unrelated to memory footprint. The idea is particularly for large worlds with lots of objects to listen to: instead of listening update messages sending the whole message string and object identification, etc, have an optimized listen protocol, where a chosen-at-runtime tag is used to identify a certain kind of update message coming from a specific object, and that's all you need to have in the network traffic (other than the actual updated values, of course). This could even be done transparently at the network interface level] Another method for making the most out of the memory will be the ability to load vobjects from persistant storage on demand, and swap out rarely used vobjects. This will allow a site to contain many more vobjects than would otherwise fit in RAM. This Could this also be extended to support persistant transparent caching of remote sites that have been visited? Perhaps paired with a new method to query certain information about vobjects, such as is-cacheable and last-updated/version? To reduce the footprint of vobjects themselves, I am introduce a concept called embedded children. These are objects that appear in protocol terms to be independently addressable vobjects that can send and receive messages, but are actually stored as a field of another vobject. This emerged from the observation that while it was extremely powerful from a design pattern standpoint for properties to be first-class vobjects, in s4 this often led to situations where it hundreds of bytes of overhead to store even a single four byte integer (for example). As an embedded child, the child vobject is simply a normal data field in the parent class, and it falls upon the parent sends and receives messages on behalf of the child. Sounds reasonable... What reasons (other than asthetics/symmetry) are there for properties to be first-class? Will a property object ever have children? Will one ever be at site root with no other parent? Will one ever be a meta-object other than property? I guess you could have two parents sharing the same property if it's a big one ... A final goal is to simplify memory management overall. One significant change will be the introduction of a single root to the vobject tree. In s4, the site contains a list of every vobject on the site, and the site URL + vobject site name acts as the unique identifier for a vobject. Unfortunately, there are two problems with this. The first is that typing ls in mesh in the site root on a large site results in it printing out 1000s of vobjects to your screen, which is rarely useful. The second, more subtle problem is that vobjects are easily leaked by orphaning them so that no other vobject points to it but failing to to call excise() on it. In s5 I propose to change this system, to a design inspired by the design of the Unix filesystem. Vobjects will have unique, opaque identifiers (which correspond to inodes) that are not generally visible to the user, and vobjects will be reqired to be accessable from the site root via some path. Vobjects which are orphaned can then be garbage collected. Yes. I've run into this ls at site root problem and it's a bit annoying :) And orphaned vobjects just seem like a lose. Other strategies to make memory management easier will include a greater emphasis on copying semantics when the amount of memory involved is small.
Re: [vos-d] s5 design overview
On Thu, Mar 29, 2007 at 07:29:35AM -0700, Ken Taylor wrote: This seems like a very good optimization, given how string-heavy the system is. Could string tables also be used to compress COD files more? How about network optimization by having two sites share a string table (or have a static standard string table of commonly used strings in the core protocol?). Also ... are properties stored as strings at the moment or as native bytes (I actually don't know this)? If they're stored as strings, compressing them to native data structures would probably be a big win too (same thing goes for properties with storing them in COD and sending them over the network). Presently there is support for having COD files gzipped by default, which helps a bit. The COD file format will need to be reworked to take advantage of s5 features anyhow. Properties are presently stored as strings, but in s5 will be stored in the native binary encoding. This is a major change since it requires that we define the set of primitive types that VOS will support. Indeed, this ties in directly with a general overhaul of the type system that I'm going to propose when I write about scripting. [I also had another idea related to network optimization -- which is unrelated to memory footprint. The idea is particularly for large worlds with lots of objects to listen to: instead of listening update messages sending the whole message string and object identification, etc, have an optimized listen protocol, where a chosen-at-runtime tag is used to identify a certain kind of update message coming from a specific object, and that's all you need to have in the network traffic (other than the actual updated values, of course). This could even be done transparently at the network interface level] I think what you're describing is essentially packet compression by creating a dictionary during the session mapping short identifiers to common packet headers. A separate problem with updates at the moment comes from the fact that the client presently has to subscribe to each vobject individually, which is one source of memory overhead since this is often redundant. I've been mulling over ways of subscribing to changes in a subtree of vobjects without having to communicate with each one separately. Could this also be extended to support persistant transparent caching of remote sites that have been visited? Perhaps paired with a new method to query certain information about vobjects, such as is-cacheable and last-updated/version? Yes! I'm glad you mentioned caching, because that is another thing that is sorely lacking in s4 and needs to be designed for in s5. Sounds reasonable... What reasons (other than asthetics/symmetry) are there for properties to be first-class? Will a property object ever have children? Will one ever be at site root with no other parent? Will one ever be a meta-object other than property? I guess you could have two parents sharing the same property if it's a big one ... Well, so you can share properties, and originally (in s3/s4) so we could have special properties like the file property (its value was bound to the contents of a particular file on disk) and extrapolated property (the property included velocity/acceleration, used for client-side movement prediction). It is a like like the notion of boxed objects in some object oriented languages like Java, C# and Ruby, where a primitive value like an integer is treated like a first class object which allows you to assign it to System.Object type references. Other strategies to make memory management easier will include a greater emphasis on copying semantics when the amount of memory involved is small. This avoids having to maintain reference counts, and we can keep simple data structures on the stack (and in L1 cache?) to avoid potentially expensive calls to the heap allocator. I don't think I understand this one Memory management is exceedingly difficult in C and C++, since if a data structure has multiple pointers going to it can be difficult to determine when it is appropriate to free() it. Concurrency makes this even worse, since you could have a thread still accessing that structure while it is being free()ed. Smart pointers and reference counts can help a lot, but they can be incredibly difficult to debug. For s5 I want minimize the amount of shared state (which I'll talk about in the next email about concurrency) and one way to do that is when copying data to someone else, to pass a copy rather than a reference. Another related technique will be the use of opaque identifiers rather than pointers where possible, so that if a vobject is freed in the background (or alternately, the object is swapped out) we don't dereference an invalid pointer. Scalability is going to be hugely important if vos is ever going to support a world-wide metaverse with large, interactive worlds. I'm glad you
[vos-d] http://interreality.org/wiki/YiMeiyou
http://interreality.org/wiki/YiMeiyou Mar 29 '07 VOS Discussion, The faq at the above page is missing. Incidentely, this URL is a similar framework for separation of the mail-client-gui from other components such as input / output database plugins: http://www.manitou-mail.org/overview.php HEBLACK, J -- Entrante.fir Search name: excremento Find items: If any criteria are met Sender contains unclean Recipients contains unclean Subject contains unclean Message Body contains unclean Source Account is HEBLACK, J [EMAIL PROTECTED] Then Move to Folder Inbox/Air alert ___ vos-d mailing list vos-d@interreality.org http://www.interreality.org/cgi-bin/mailman/listinfo/vos-d