The assignment explicitly said not to write pseudocode. The following code is included here to illustrate how much more work is involved in formulating pseudocode to solve this problem:
client-call( sl, out-l, in-l, out-p, in-p ) r = create new box rl = create new link to box r c = length of list of links in-l send to sl the link rl with the body [c,out-p] await message in box r containing link pl for each link l in the list of links out-l send to pl the link l (this loop iterates c iterations) endloop -- in-l = empty list of links await message in box r containing body [c,in-p] iterate c times await message in box r containing link l add link l the list in-l endloop server loop await message in box s the link rl and body [c,out-p] p = create new box pl = creat new link to box p send to rl the link pl out-l = empty list of links iterate c times wait message in box p containing link l add link l to the list out-l endloop -- call service function ( out-l, in-l, out-p, in-p ) -- c = length of list in-l send to rl the body [c,in-p] for each link l in list in-l send to rl the link l (this loop iterates c iterations) endloop forever
Part B: In the case where the server is a nameserver, the messages that must be exchanged between the client and server for the operations are as follows:
save(l,n) initiate save message from client to server's public mailbox: body: ( save, n ) link: reply-link initial reply from server to client's reply box: body: none link: private-link followup save message, from client to server's private-link: body: none link: l optional final reply from server to client's reply box: body: none link: none lookup(n) returns l initiate lookup message from client to server's public mailbox: body: ( lookup, n ) link: reply-link optional initial reply from server to client's reply box: body: none link: private-link final reply from server to client's reply box: body: none link: lIn the above, the optional messages are not, strictly speaking, needed, but a generic skeleton for the server following the outline of part A will tend to include them unless it is optimized. Furthermore, in a fault tolerant system, it is handy to know, in the case of save(), that the service has been completed, and in the case of lookup(), that the initial message was delivered.
Part C: The basic interprocess communication primitives of our DEMOS like example are at the transport level in the ISO OSI model protocol hierarchy. They are stateless, so they aren't at or above the session layer, but they clearly address messages to logical recipients (boxes) and not to physical machines.
Part D: In the ISO OSI model protocol hierarchy, what level is represented by The client-server protocol described in part A establishes a temporary connection between client and server using temporary boxes and links, so it is at the session level in the ISO OSI model protocol hierarchy.