-
Notifications
You must be signed in to change notification settings - Fork 0
/
cpu.c
54 lines (49 loc) · 1.32 KB
/
cpu.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "cpu.h"
#include "queue.h"
Queue maQ; // ayyyyy globals
int PRIORITY_DEC = 1;
int PRIORITY_INC = -1;
int PRIORITY_BASE = 1;
void cpu_init() {
initQueue(&maQ);
}
void dispatch() {
if (PTBR != NULL && PTBR->pcb->status == running) {
if (Int_Vector.cause != timeint) {
PTBR->pcb->last_dispatch = get_clock();
return;
}
else if (Int_Vector.cause == timeint) {
insert_ready(PTBR->pcb);
PTBR = NULL;
}
}
PCB *nextPCB = deQueue(&maQ);
if (nextPCB == NULL) {
PTBR = NULL;
return;
}
else {
PTBR = nextPCB->page_tbl;
prepage(nextPCB); // External routine.
nextPCB->status = running;
nextPCB->last_dispatch = get_clock();
set_timer(Quantum); // Same. Must be implemented in OSP.
}
}
int compareTo(PCB *pcb1, PCB *pcb2) {
return pcb1->priority - pcb2->priority;
}
void insert_ready(PCB *pcb) {
if (pcb->accumulated_cpu == 0) {
pcb->priority = PRIORITY_BASE;
}
else if (pcb->status == running && Int_Vector.cause == timeint) {
pcb->priority += PRIORITY_DEC;
}
else if (pcb->status == waiting) {
pcb->priority += PRIORITY_INC;
}
pcb->status = ready;
enQueueSorted(&maQ, pcb, compareTo); // Passing function as argument. Neat.
}