% 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}
