wmi-systemy-operacyjne/projects/reader-writer.html

103 lines
3.8 KiB
HTML

<HTML>
<HEAD>
<B>Reader/Writer Problem with Writer Priority: </B>
<p>
Using <I>general</I> semaphores, create a solution to the
reader/writer problem such that writers have priority over
readers. When writers have priority, the following rules
exist:
<UL>
<LI> A reader can read the shared file (e.g., database)
only when there are NO active or waiting writers.
<LI> A writer can only write to the shared file when the
writer is given mutually exclusive access to the file.
<LI> Multiple readers can read the shared file concurrently,
if the above rules are followed.
</UL>
<p>
Your BACI program should consist of the following three procedures:
<OL>
<LI> Coordinator: This procedure should be executed before any readers or
writers are executed, and should be used to initialize the semaphores
and any other global variables that require initialization.
<LI> Reader(int reader): Multiple copies of this procedure may be executed
from the cobegin/coend block; reader is the id of this particular reader.
<LI> Writer(int writer): Multiple copies of this
procedure may also be executed from the cobegin/coend block; writer
is the id of this particular writer.
</OL>
<P>
Use two global declarations to declare the number of readers/writers
in the system:
<center>
const int Rnumber= 5; //number of readers// <BR>
const int Wnumber= 3; //number of writers//
</center>
If the above number of readers/writers are defined, then main() will
be: <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
main() { <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Coordinator; <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cobegin { <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Reader(0); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Reader(1); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Reader(2); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Reader(3); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Reader(Rnumber-1); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Writer(0); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Writer(1); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Writer(Wnumber-1); <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//add-delete lines when the number of readers or writers change. <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//NOTE: BACI can only handle about 10 threads at a time <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} <BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} <BR>
<p>
In both the Reader and Writer procedures, during the actual
reading/writing phase of the shared file, have a for loop of length
three that prints to stdout "... reading is performed by process I ..." (or
"... writing is performed by process J ..."), where I/J is the id value
of the reader/writer.
In addition, both the Reader and Writer procedures should print a
message to stdout just before they perform a P() or V() operation on
any of the semaphores. In the message, each thread must identify itself
as a reader or a writer, the id of the reader/writer, the name of
the semaphore variable upon which it is operating, and the value
of the semaphore variable at that time.
<P>
Written deliverables:
<OL>
<LI> A listing of your code (*.lst).
<LI> The results from executing your program with the following
number of readers/writers:
<OL type=a>
<LI> Rnumber= 5 and Wnumber= 3
<LI> Rnumber= 6 and Wnumber= 1
<LI> Rnumber= 1 and Wnumber= 6
</OL>
<LI> A brief explanation of how your solution gives writer
priority.
</OL>
</BODY>
</HTML>