Anonymous user
Message Passing Tutorial: Difference between revisions
Jump to navigation
Jump to search
m
→Definitions
[unchecked revision] | [unchecked revision] |
m (→Pitfalls) |
m (→Definitions) |
||
Line 1:
It's always a problem to decide if you use asynchronous or synchronous message passing. In this article I'll show you how to have both. I'll use a pseudo-code to describe the algorithm, so you can implement it to your language environment. Note that I refer sender and receiver as processes, it can be easily adopted to threads.
== Definitions ==
You should have a structure to be sent to another
<source lang="c">
struct message {
Line 9:
}
</source>
Sending and receiving must be atomic. This means you must prevent task switches until it's finished. I have two different
Blocking and non blocking: the sender can be blocked upon
You should maintain a queue for every process to record blocked waiting processes. This queue must not be a circular buffer, you can implement it as a simple chained list. I assume you have written the following functions already (they will be required by the tutorial):
<source lang="c">
block(processid) //function to block a process
Line 23:
</source>
Now a few words on synchronization: if it's asynchronous, it means the sender is not interested whether the receiver accepts the message or not. It will send the message and move on (won't block). This also means the message could be lost, hence messaging is unreliable. On the other hand, a synchronous sender will wait (block) until the message is delivered, this creates a
Finally, [[circular buffer]]. It's a FIFO (First In, First Out) buffer. It's implemented by pointers (or indeces) head and tail. If you push something in a FIFO, it will be stored at the memory pointed to by head, and head will be adjusted. On pop, the item will be read from the memory pointed to by tail, and tail will be adjusted. If head or tail reaches the end of the buffer, they will wrap around.
<source lang="c">
struct circbuff {
Line 34:
}
</source>
You could calculate the number of items in the buffer
== Asynchronous ==
|