Documente Academic
Documente Profesional
Documente Cultură
22.1 Send/Receive
How do you program a distributed application? Need to
synchronize multiple threads, only now running on different
machines (can't use test&set).
Receive(buffer, mbox)
Wait until mbox has message in it, then copy message into
buffer, and return.
1-way communication
Producer:
int msg1[1000]
while (1)
prepare message // make coke
send(msg1, mbox)
Consumer:
int msg[1000]
while (1)
receive(msg2, mbox)
process message // drink coke
Request/response:
Server:
char command[1000], answer[1000];
receive(command, mbox1);
decode command
read file into answer
send(answer, mbox2);
What if file is too big for response? Use big message protocol.
Client calls:
remoteFileSys->Read("rutabaga")
Implementation:
request-response message passing
"stub" provides glue on client/server
bundle
call args send
Client Client Packet
(caller) stub Handler
receive
return unbundle
Network Network
transport transport
bundle
return ret vals send
Server Server Packet
(callee) stub Handler
call receive
unbundle
arguments
Client stub:
build message
send message
wait for response
unpack reply
return result
Server stub:
Create N threads to wait for work to do
loop:
wait for command
decode and unpack request parameters
call procedure
build reply message with results
send reply
What if there are multiple servers -- can they use same mbox?
OK, if no state carried forward from one call to the next. For
example, open, seek, read, close -- each uses context of
previous operation.
shared memory
App App
22.5.1 Failures
Different failure modes in distributed system than on single
machine.
22.5.2 Performance
Cost of a procedure call << same-machine RPC << network RPC
Means programmers must be aware that RPC is cheap, but it's
not free.
Caching can help, but that can make failure handling more
complex.