% HOMEWORK #2 % re: processes % \documentstyle[11pt,fullpage]{article} \pagestyle{empty} \begin{document} \begin{center} {\large\bf BACI Projects for an OS Course} \end{center} \begin{enumerate} \item {\small\bf Implementation of Machine Instructions:} Implement the exchange instruction in the text. The implementation of this instruction should be based on an ATOMIC function which returns a BOOLEAN value. You should test your implementation of the machine instruction by building a mutual exclusion protocol on top of your low-level operation. \item {\small\bf Implementation of Fair Semaphores (FIFO):} The default semaphore in BACI is implemented with a random wake up order. For non-terminating processes, this random behavior allows the possibility of starvation. A fair semaphore implementation, on the other hand, has a FIFO wake up order. Implement semaphores with this FIFO wake up order. Allow users to define a semaphore as a CONST value in the range [1..13]. This CONST value should be used as a tag for access to a semaphore and its corresponding variables. At least four procedures will be required in your implementation: \begin{itemize} \item PROCEDURE {\tt Create\_Semaphores}(); \\ You should place your initialization code here. \item PROCEDURE {\tt Init\_Semaphore}({\it sem\_index} : INTEGER; {\it val} : INTEGER); \\ In this procedure, you should initialize the semaphore represented by {\it sem\_index}. As in the given BACI semaphore implementation, your FIFO semaphore implementation should not allow the use of a semaphore unless it has been initialized. \item PROCEDURE {\tt FIFO\_P}({\it sem\_index} : INTEGER); \\ This procedure should include the ATOMIC compare-and-swap operation implemented above. If a calling process needs to be put to sleep, use the SUSPEND operation. The WHICH\_PROC command helps keep track of sleeping processes. \item PROCEDURE {\tt FIFO\_V}({\it sem\_index} : INTEGER); \\ This procedure should REVIVE a process waiting on the semaphore represented by {\it sem\_index} in a FIFO basis. If no such semaphore exists, this procedure should increment the value associated with the semaphore. Again, use the ATOMIC compare-and-swap operation to obtain mutual exclusive access to variables associated with this semaphore. \end{itemize} Bear in mind that this code should be written as a system implementation and, as such, should handle all possible errors. You are responsible for producing code which is robust in the presence of ignorant, stupid, or even malicious use by the user community. Lastly, full credit will not be received if your solution has non-required waiting. \item {\small\bf Implementation of Unfair Semaphores:} Assume that the semaphore operation given in BACI does not exist. Implement semaphores based on Dijkstra's original proposal by randomly choosing which process to wake up when a signal occurs (E. Dijkstra, ``Hierarchical ordering of sequential processes,'' {\em Acta Informatica}, vol. 1, no. 2, pp. 115--138, 1971.) The RANDOM(INTEGER) command returns a random number in the range [0..(INTEGER-1)]. Follow the information in the fair semaphores implementation project on the minimal number of procedures required for this implementation. \end{enumerate} \end{document}