Object Spaces
From Wikipedia, the free encyclopedia
Object Spaces is a paradigm for development of distributed computing applications. It is characterized by the existence of logical entities, called Object Spaces. All the participants of the distributed application share an Object Space. Provider of a service encapsulates the service as an Object, and puts it in the Object Space. Clients of a service then accesses the Object Space, finds out which object provides the required service, and have the request serviced by the object.
Object Spaces, as a computing paradigm, put forward by Dr. David Gelernter at Yale University. A language called Linda was developed to support the concept of global object coordination.
[edit] Concept
Object Space can be thought of as a virtual repository, shared amongst providers and accessors of network services, which are themselves abstracted as objects. Processes communicate among each other using these shared objects — by updating the state of the objects as and when needed.
An object, when deposited into a space, needs to be registered with a Object Directory in the Object Space. Any processes can then identify the object from the Object Directory, using properties lookup, where the property specifying the criteria for the lookup of the object be its name or some other property which uniquely identifies it. A process may choose to wait for an object to be placed in the Object Space, if the required object is not already present.
Objects, when deposited in an Object Space are passive, i.e., their methods cannot be invoked while the objects are in the Object Space. Instead, the accessing process must retrieve it from the Object Space into its local memory, use the service provided by the object, update the state of the object and place it back into the Object Space.
This paradigm inherently provides mutual exclusion. Because once an object is accessed, it has to be removed from the Object Space, and is placed back only after its has been released. This means that no other process can access an object while it is being used by one process, thereby ensuring mutual exclusion.
The main advantages of using Object Spaces are listed below.
- No explicit code needs to be written for a Service Provider to act as a server. The service needs to be encapsulated as an object and it needs to be put in an Object Space. The server need not even explicitly maintain the Object Space.
- The client need not worry about how to communicate with the server.
[edit] Usage
Object Spaces paradigm has been implemented by Sun Microsystem's JavaSpaces, among others. To build applications using Object Spaces, one needs to make Distributed Data Structures, which is a data structure that consists of objects stored in one or more Object Spaces. When these objects are accessed, the run-time support of the Object Space implementation automatically retrieves the object from its Object Space, and puts it back when the object is used.
The following example shows an application made using JavaSpaces, which requires Jini. First, an object, to be shared in the Object Space is made. Such an object is called an Entry in JavaSpace terminology. Here, the Entry is used to encapsulate a service which returns a Hello World! string, and keeps track of how many times it was used. The server which provides this service will create an Object Space, termed JavaSpace by JavaSpaces. The Entry is then written into the JavaSpace. The client reads the entry from the JavaSpace and invokes its method to access the service, updating its usage count by doing so. The updated Entry is written back to the JavaSpace.
//An Entry class public class SpaceEntry implements Entry { public final string message = "Hello World!"; public Integer count = 0; public String service() { count = new Integer(count.intValue() + 1); return message; } public String toString() { return "Count: " + count.toString(); } }
//Hello World! server public class Server { public static void main(String[] args) { try { SpaceEntry entry = new SpaceEntry(); //Create the Entry object JavaSpace space = (JavaSpace)space(); //Create an Object Space //Register and write the Entry into the Space space.write(entry, null, Lease.FOREVER); //Pause for 10 minutes and then retrieve the Entry and check its state. Thread.sleep(10*60*1000); SpaceEntry e = space.read(new SpaceEntry(), null, Long.MAX_VALUE); System.out.println(e); } catch (Exception e) {} } }
//Client public class Client { public static void main(String[] args) { try { JavaSpace space = (JavaSpace) space(); SpaceEntry e = space.take(new SpaceEntry(), null, Long.MAX_VALUE); system.out.println(e.service()); space.write(e, null, Lease.FOREVER); } catch (Exception e) {} } }
[edit] References
- Distributed Computing (First Indian reprint, 2004), M. L. Liu