CS452 - Real-Time Programming - Spring 2008
Lecture 15 - Send-Receive-Reply
Questions & Comment
- Due dates now on the web.
Producer/Consumer
Two ways to do this
- Producer
Sends, consumer Receives
Send means "Here is some data"
Receive means "I'm ready to receive data"
Reply means "I got the data"
After Reply buffers holding data can be overwritten at
will
- Producer
Receives and Replys
Send means "I'm ready for data"
Receive means "I'm ready to transmit data"
Reply means "Here's the data"
After Reply buffers can be overwritten at will.
What is the difference?
- If relationship is one-to-one
- If relationship is many-to-one
- the one doing many MUST
Receive.
- If relationship is many-to-many
- both MUST
Receive
- Placing a
Send among Receives is a bad
idea. Why?
- How do you solve the problem: a worker
Sends to
both.
int Send( Tid tid, char *arg, int arg-length, char *reply-buffer, int
reply-buffer-size )
These are pretty self explanatory, except
- The return value is the number of characters actually returned
- including the \0 if the contents of the reply buffer is a
string
- If something goes wrong, the return value is negative, coded to
indicate what went wrong
What can go wrong
- Illegal
tid
tid not an existing task
It's up to Send to check that the reply-buffer was big
enough by looking at its return value
It's not an error if the task to which we Send never
Receives
- Parsing
argument and reply-buffer is
potentially costly and error-prone
- A type system might be nice
- But then you would feel compelled to implement run-time type
checking
- This form of message passing requires user and kernel code to cooperate
to avoid malignancies
- which is just barely okay when one implementer does both
- but is otherwise monumentally insecure
int Receive( Tid *tid, char *arg-buffer, int arg-buffer-length )
These are pretty self explanatory, except
- How is the task id copied form kernel to receiver?
- That is, where does the pointer point to?
- What if the buffer wasn't big enough?
- If several tasks have
Sended, which one gets
Received first?
int Reply( Tid tid, char *reply, int reply-length )
These are pretty self explanatory
Implementation
Code should be constant time
Send before Receive
- Kernel needs to find the
Sender
- Need a FIFO
Send queue in the Receiver's
TD
Receive before Send
Tid of Receiver in the arguments
- Test state to know which case
How is the message copying done?
Return to: