Message Passing Tutorial: Difference between revisions

Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content deleted Content added
Line 13: Line 13:
Blocking and non blocking: sender can be blocked upon send, but not necessarily. Receiver must block if there's no message waiting. Blocking means the OS will remove the process from ready queue, and won't allocate CPU resource for it until the blockade canceled. When it happens, it simply puts back the process to ready queue (most likely to the top), so next time it gains CPU, it can run. Processes on the blocked queue will not use any CPU. This saves you from [[busy loop]].
Blocking and non blocking: sender can be blocked upon send, but not necessarily. Receiver must block if there's no message waiting. Blocking means the OS will remove the process from ready queue, and won't allocate CPU resource for it until the blockade canceled. When it happens, it simply puts back the process to ready queue (most likely to the top), so next time it gains CPU, it can run. Processes on the blocked queue will not use any CPU. This saves you from [[busy loop]].


You should maintain a queue for every process to record waiting processes. I assume you have written the following functions already:
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 (will be required by the tutorial):
<source lang="c">
<source lang="c">
block(processid) //function to block a process
block(processid) //function to block a process
awake(processid) //function to unblock a process
awake(processid) //function to unblock a process
isblocked(processid) //returns true if process is blocked
pushwaitqueue(recvpid,sendpid) //put sendpid on recvpid process' sender waiting queue
pushwaitqueue(recvpid,sendpid) //put sendpid on recvpid process' sender waiting queue
topwaitqueue() //get the last pid in queue
topwaitqueue() //get the last pid in queue
popwaitqueue() //get the last pid in queue and remove it from queue
popwaitqueue() //get the last pid in queue and remove it from queue
</source>
</source>