However, the performance advantage offered by nonblocking primitives is offset by a serious disadvantage: the sender cannot modify the message buffer until the message has been sent. The consequences of the process overwriting the message during transmission are too horrible to contemplate. Worse yet, the sending process has no idea of when the transmission is done, so it never knows when it is safe to reuse the buffer. It can hardly avoid touching it forever.. ItemOption 1Option 2Option 3AddressingMachine numberSparse process addressesASCII names looked up via serverBlockingBlocking primitivesNonblocking with copy to kernelNonblocking with interruptBufferingUnbuffered, discarding unexpected messagesUnbuffered, temporarily keeping unexpected messagesMailboxesReliabilityUnreliableRequest-Ack-Reply AckRequest-Reply-Ack. In Chap. 2, we saw how processes in a distributed system communicate with one another. The methods used include layered protocols, request/reply message passing (including RPC), and group communication. While communication is important, it is not the entire story. Closely related is how processes cooperate and synchronize with one another. For example, how are critical regions implemented in a distributed system, and how are resources allocated? In this chapter we will study these and other issues related to interprocess cooperation and synchronization in distributed systems.. Although both methods prevent deadlocks, it is wiser to give priority to older processes. They have run longer, so the system has a larger investment in them, and they are likely to hold more resources. Also, a young process that is killed off will eventually age until it is the oldest one in the system, so this choice eliminates starvation. As we have pointed out before, killing a transaction is relatively harmless, since by definition it can be restarted safely later.. Many clients are configured to mount certain remote directories without manual intervention. Typically, these clients contain a file called /etc/rc, which is a shell script containing the remote mount commands. This shell script is executed automatically when the client is booted.. Then we come to machines that share only a selected portion of their address spaces, namely shared variables and other data structures. The Munin (Bennett et al., 1990) and Midway (Bershad et al., 1990) systems work this way. User-supplied information is required to determine which variables are shared and which are not. In these systems, the focus changes from trying to pretend that there is a single common memory to how to maintain a set of replicated distributed data structures consistent in the face of updates, potentially from all the machines using the shared data. In some cases the paging hardware detects writes, which may help maintain consistency efficiently. In other cases, the paging hardware is not used for consistency management.. a = 1;a = 1;b = 1;b = 1;print(b, c);b = 1;c= 1;a= 1;b = 1;print(a, c);print(a, b);c = 1;print(a, c);print(b, c);print(a, c);print(a, c); c = 1;c = 1;a = 1;print(b, c);print(a, c);print(a, b);print(b, c);print(a, b);Prints: 001011Prints: 101011Prints: 010111Prints: 111111Signature: 001011Signature: 101011Signature: 110101Signature: 111111(a)(b)(c)(d). Let us now reconsider the three processes of Fig. 6-14, but this time using PRAM consistency instead of sequential consistency. Under PRAM consistency, different processes may see the statements executed in a different order. For example, Fig. 6-19(a) shows howP1 might see the events, whereas Fig. 6-19(b) shows howP2 might see them and Fig. 6-19(c) showsP3’s view. For a sequentially consistent memory, three different views would not be allowed.. If read-only pages are replicated, there is also no problem. The read-only pages are never changed, so all the copies are always identical. Only a single copy is kept of each read-write page, so inconsistencies are impossible here, too.. 2. The implementation is more flexible because accesses are controlled.. Note that Amoeba does not use access control lists for authentication. The protection scheme used requires almost no administrative overhead. However, in an insecure environment, additional cryptography (e.g., link encryption) may be required to keep capabilities from being disclosed accidentally to wiretappers on the network.. Themach_msg call can be aborted part-way through by a software interrupt. Anotheroptions bit tells whether to give up or try again.. Now let us turn to the message format of Fig. 8-17. The first word contains a bit telling whether the message is simple or complex. The difference is that simple messages cannot carry capabilities or protected pointers, whereas complex ones can. Simple messages require less work on the part of the kernel and are therefore more efficient. Both message types have a system-defined structure, described below. Themessage size field tells how big the combined header plus body is. This information is needed both for transmission and by the receiver.. Episode was designed for highly concurrent access. It avoids having threads take out long-term locks on critical data structures to minimize conflicts between threads needing access to the same tables. It also has been designed to work with asynchronous I/O, providing an event notification system when I/O completes.. The fileset server also can provide information about filesets, manipulate fileset quotas, and perform other management functions..