$30
AN OPERATING SYSTEM SYNCHRONIZATION IMPLEMENTATION
CMPE322 project series is a set of projects that teaches how to construct an operating system, named BUnix (written in institutional colors of Boğaziçi University J ), from scratch. In the first project, you scheduled processes which are independent from each other. In addition to your implementation of the first project, now these processes have to use the same critical resources, thus you also have to synchronize them with binary semaphores.
Scenario in the Second Project
BUnix manages a hardware which has some critical resources that only one process at a time is allowed to use. So, you inform your BUnix coders that if they need to use a critical section, they have to write “waitS_[Semaphore_No]” to not permit other processes to use that critical resource. Also, you remind them that they should not forget to write “signS_[Semaphore_No]” to release this critical section after it is completed. You allow them to use at most 10 semaphores which are numbered from 0 to 9. After all, they compile their new codes which is in the form that is presented in Table 1.
INSTRUCTION NAME
INSTRUCTION EXECUTION TIME (ms)
instruction_1
20
instruction_2
20
waitS_0
0
instruction_3
50
instruction_4
20
signS_0
0
waitS_2
0
instruction_5
30
instruction_6
30
signS_2
0
instruction_7
30
.
.
.
.
.
.
exit
10
Table 1 – A Text Based Program Code File Example
The Synchronization Code
In addition to the first project, we want you to implement the following parts in your second project:
• Implement a wait queue for each semaphore. These wait queues should be a FIFO again.
• Implement “waitS” operation:
o If it is not used by any process allow the current process to use it and lock the semaphore.
o Otherwise remove this process from the ready queue and send it to the corresponding wait queue.
o Prevent the starvation of a process in wait queue. Allow a process to use this semaphore before any other process wants to use this semaphore. For example, P1 calls waitS_0 and starts to use critical section. Then P3 calls waitS_0 before P1 calls signS_0 which means that you have to send P3 to the wait queue of the semaphore 0. You have to send any other process (P1 included) to this wait queue if they call waitS_0 before P3 calls signS_0.
• Implement “signS” operation:
o Allow the use of this semaphore again. o If there is any process in the wait queue of semaphore, remove it from the wait queue (do not forget that this queue is a FIFO!) and send it to the ready queue.
o Continue to run this process.
• An output mechanism that generates a file to present the ready queue and wait queues whenever it is changed by the algorithm. The format of the files should be same as the first project.
• Ready queue output name should be “output.txt” again. Wait queue output names should be “output_[Semaphore_No].txt”, e.g. “output_0.txt”, “output_1.txt”. If a semaphore queue is not used according to test input files, you don’t have to create it.
Restrictions in Test Input Files
The following restrictions are added to reduce complexity of the implementation.
• In our test definition files:
o P1 will always arrive at time 0 o Process arrival times will increase in each row.
o There will be always a process in the ready queue according to test definition files. So, you don't have to worry about what to do in "idle CPU" state.
• If a running process and a new arrived process should have been enqueued at the same time, first enqueue the new arrived process and then the running process. For example:
140::HEAD-P2-P1-TAIL
250::HEAD-P1-P3-P2-TAIL
P2 consumes its dedicated time slot at 250 and P3 has arrived at the same time. First enqueue P3 and then P2.
• Your output file does not have to show the ready queue when a new process has arrived.
For example:
P1 has arrived at time 0
P2 has arrived at time 120 P3 has arrived at time 250 Output:
0::HEAD-P1-TAIL
120::HEAD-P1-P2-TAIL
140::HEAD-P2-P1-TAIL
250::HEAD-P1-P3-P2-TAIL
290::HEAD-P3-P2-TAIL
You do not have to show the second line (time 120). On the other hand, you have to show the fourth line (time 250) when P3 is arrived but also P1 starts to execute by CPU.
• Execution time of waitS and signS operations are always 0.
• Your BUnix coders are really good coders that never call another waitS command before releasing the first one. So, don’t be afraid from a deadlock. You will never see a code like Table-2.
INSTRUCTION NAME
INSTRUCTION EXECUTION TIME (ms)
waitS_0
0
instruction_3
50
waitS_2
0
instruction_5
30
signS_0
0
Table 2 – A Code Example that may cause a deadlock
Development Platform
You have to implement your design in the Linux Platform with GCC/G++ Compiler. We strongly advise you to install Ubuntu which has pre-installed GCC/G++ compiling tools. We will test your code in this platform and if your compiled code is not compatible with the test platform, you might be invited for a demo, if necessary.
Provided Files
The following files are given together with the project:
• The process definition file (number of processes and their arrival times will be modified to test your code).
• Four program code files (number of instructions, their names and their execution times will be modified to test your code. Only exception is the last instruction name is always “exit” and its execution time is 10 milliseconds).
• The expected output file.
• Note: The length of the time slot is a constant value in BUnix operating system (100 milliseconds).
Project Requirements
• Your project should have generated the expected output file for modified process definition file and program code files. (80%)
• The source code documentation. The documentation depends on your design style but at least having comments that explain your code is strongly advised. (20%)