COOL: system support for distributed programming

istributed systems are by their very nature large and complex applications requiring the interaction of many individual c o m p o n e n t s scattered throughout a distributed collection of hosts which are often physically dispersed. Interaction is usually modeled on a message-passing abstraction in which services are requested by sending a request message to a service provider and receiving an asynchronous or synchronous reply. Service providers are often large-grained encapsulated entities, whose interface is defined by its message protocol. Internal synchronization of multiple competing requests is handled by the service provider either by message queuing or by language synchronization primitives. Such systems are natural candidates for the objectoriented model of software development simply because the way most of them are built maps closely to the objectoriented model. Service providers are large-grained, active objects; message protocols define an adhoc type interface, and message passing is a low-level mechanism that supports method invocation. This obvious mapping has led many groups to attempt to extend existing object-oriented languages with support for distributed objects, either by adding remote messagepassing facilities (based on RPC) or by supporting distributed objects [2, 11]. This approach has had mixed success. On the one hand it has demonstrated that the object-oriented languages provide sufficient support for building distributed applications. However, because the efficiency of such an approach has been so poor, it has served as a proof of concept but has failed to provide the break through for which many in the distributed-systems community have hoped. This inefficiency is mainly caused by a mismatch between the services and abstractions that systems provide, and those that languages offer. System services are often generic, designed to support multiple uses, and achieving this with a lowestcommon-denominator solution. Also, the majority of existing operating systems provide abstractions that were never designed to support modern programming languages and, in particular, were never designed to support distributed applications. For example , ob j ec t -o r i en t ed languages deal with f ine-grained objects. The majority of modern systems provide an abstraction of an address space as the smallest systemsupported concept. It is the compiler's job to match the fine-grained language model to the coarse-grained system model. For a single address space application this is fine; however, for distributed applications, spanning multiple address spaces, the compiler support breaks down because the compiler is not aware of the environment outside a single address space. Equally, some languages support lightweight activities or active objects; again, most systems support a heavier notion, a process. Mapping between the two is a complex and often costly task. Finally, current operating systems provide distributed interprocess communication using protocols designed for unre l iable networks and often implemented as an "add-on" feature. These communication mechanisms are often too costly to support applications built of fine-grained objects, working in a tightly coupled manner and using interobject invocation.