- About
- Getting Started
- Prerequisite
- Running
- Data Structures used
- Algorithm Explanation and Results
- Assumptions
- This is an Operating Systems Course Project where we were required to implement various process management alogirhtms, It's scheduler the processes that there exist in the system
This is a list of instructions to set up the project.
- GCC compiler installed
- Any unix based system
Running program
- build and run the project.
$ Makefile
- compile the project.
$ make build
- run the project.
$ make all
- C Language
| Algorithm | Used DS | Notes |
|---|---|---|
| Highest Priority First (HPF) | Priority Queue | Priority: Priority of the process |
| Shortest Remaining Time (SRTN) | Priority Queue | Priority: Remaining time |
| Round Robin (RR) | Circular Queue | Inside the implementation, when a process arrives, it is inserted into a queue. When it is stopped, it is dequeued and enqueued again. Once it finishes, it is dequeued. |
| First Fit (FF) | List | |
| Buddy | List of lists | The list of lists consists of 11 lists, each representing a specific size that is a power of two starting from 2^0 to 2^10. Each list is implemented as First Fit (FF). |
Note that we have isolated the functions for running, stopping, and continuing in separate functions.
The code first checks if there is no currently running process (RunningProcess is NULL) and the ready queue is not empty (!IsEmpty(ReadyQueue)). If both conditions are met, the highest priority process at the front of the queue is retrieved using the peek(ReadyQueue) function, and its address is assigned to the RunningProcess pointer.
Then, the state of the process is updated to "started" and the runProcess() function is called to execute the process. It is assumed that the runProcess() function takes a process pointer as its parameter and executes the process.
The code first checks if the ready queue is empty using IsEmpty(ReadyQueue). If the queue is empty, the function simply returns and does nothing.
If the ready queue is not empty, the code checks if there is a currently running process (RunningProcess is not NULL) and the process at the head of the ready queue has a shorter remaining execution time than the currently running process by comparing the ids of RunningProcess and the head of ReadyQueue. If this is the case, the function calls preempt() to stop the currently running process and switch to the new process with a shorter remaining execution time.
Finally, the function calls runProcess() to execute the process at the head of the ready queue.
The code first checks if the ready queue is empty by checking if ReadyQueue->head is NULL. If the queue is empty, the function simply returns and does nothing.
If the queue is not empty, the code first retrieves the process at the head of the ready queue using &(ReadyQueue->head->process) and assigns it to a pointer variable p.
Then, the code checks if there is no currently running process (RunningProcess is NULL) and there is a process at the head of the ready queue (p is not NULL). If this is the case, the function assigns the process at the head of the ready queue to RunningProcess and calls runProcess() to execute it.
If there is a currently running process, the code checks if the time quantum has elapsed for the process by comparing the current system time (getClk()) with the last start time of the process (RunningProcess->laststart) plus the time quantum (q). If the time quantum has elapsed, the function stops the currently running process using ReadingProcess() and checks if there is another process in the ready queue to be executed.
If there is another process in the ready queue, the function dequeues the process at the head of the queue using dequeueProcess(ReadyQueue) and saves it in a temporary variable temp. Then, the function inserts temp back into the ready queue using InsertInRR(temp, ReadyQueue, q) to maintain the order of processes in the queue.
Finally, the function assigns the process at the head of the ready queue to RunningProcess and calls runProcess() to execute it.
We have defined a function Allocation that attempts to allocate the process according to the current algorithm by calling the functions below:
For allocating the process:
int allocate_process(List* list, processIn* process)The function first initializes two pointers to nodes in the linked list: curr_hole points to the head of the list, and prev_hole points to NULL. The function then iterates
|
Aliaa Gheis |
Menna Mohamed |
Mennatallah Ahmed |
Sara Bisheer |
