int main (void) { PCB *q1 = NULL; PCB *p1 = pcb_new(0, 1); PCB *p2 = pcb_new(3, 2); PCB *p3 = pcb_new(2, 3); PCB *p4 = pcb_new(1, 4); PCB *p5 = pcb_new(4, 5); PCB *x1; q1 = p1; pcb_enqueue(p2, &q1); pcb_enqueue(p3, &q1); pcb_enqueue(p4, &q1); pcb_enqueue(p5, &q1); pcb_print_list(q1); x1 = pcb_dequeue(&q1); pcb_print_list(q1); pcb_remove(p5, &q1); pcb_print_list(q1); return 0; }
/* Move head of userqueue to feedback queues */ void enqueue_roundrobin() { PcbPtr process; while (user_queue) { // while there are items in the user queue if (check_resource(io_resources,user_queue) == 1 && memChk(memory,user_queue->mbytes)){ // if resources/memory can be allocated for the given process process = pcb_dequeue(&user_queue); process->memory = memAlloc(memory,process->mbytes); // allocating memory if (process->memory) { // making sure it is not null process->memory->id = process->id; } io_resources = allocate_resource(io_resources,process); switch (process->priority) { case 0: break; case 1: p1_queue = pcb_enqueue(p1_queue,process); break; case 2: p2_queue = pcb_enqueue(p2_queue,process); break; case 3: p3_queue = pcb_enqueue(p3_queue,process); break; default: fprintf(stderr, "Error. Priority not correctly set. Process ID: %d Priority: %d\n",process->id,process->priority); break; } } else { // leave the while loop when the above condition fails break; } } }
/* Move input->head of queue to user queue */ void enqueue_user_real_queues(){ PcbPtr process; while(input_queue && input_queue->arrival_time <= clock_time) { // enqueue onto user/real queues when arrival time is reached process = pcb_dequeue(&input_queue); if (process->priority == 0) { // real time queue realtime_queue = pcb_enqueue(realtime_queue,process); } else { user_queue = pcb_enqueue(user_queue,process); } } }
/* Checks for currently running processes. Stops it if time is up, Pauses it if queue is not empty */ PcbPtr running_processes() { if (current_process) { // if there is a process running current_process->remaining_cpu_time = current_process->remaining_cpu_time -1; // decrement time if (current_process->remaining_cpu_time <= 0 || (current_process->processor_time - current_process->remaining_cpu_time >= 20)) { // processing time is completed pcb_terminate(current_process); if (current_process->priority > 0) { // not real time io_resources = free_resource(io_resources,current_process); } /* Free memory relating to the finished process*/ if (current_process->priority != 0) { memFree(current_process->memory); } pcb_free(current_process); current_process = NULL; } else if (realtime_queue || p1_queue || p2_queue || p3_queue){ // suspend and enqueue process back to roundrobin if other waiting processes if (current_process->priority == 0) { //real time process return current_process; } current_process = pcb_suspend(current_process); if (current_process-> priority < 3 && current_process->priority != 0){ // reduce priority current_process->priority = current_process->priority +1 ; } switch (current_process->priority) { case 1: p1_queue = pcb_enqueue(p1_queue,current_process); break; case 2: p2_queue = pcb_enqueue(p2_queue,current_process); break; case 3: p3_queue = pcb_enqueue(p3_queue,current_process); break; default: fprintf(stderr, "Error. Priority is out of bounds\n"); } current_process = NULL; } } return current_process; }