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); } } }
/* Start next process in p*_queue. return current process */ PcbPtr start_process() { if (current_process == NULL && (realtime_queue || p1_queue || p2_queue || p3_queue)) { // start the next process if the queue exists if (realtime_queue) { current_process = pcb_dequeue(&realtime_queue); current_process->memory = memory; } else if (p1_queue) { current_process = pcb_dequeue(&p1_queue); } else if (p2_queue) { current_process = pcb_dequeue(&p2_queue); } else if (p3_queue) { current_process = pcb_dequeue(&p3_queue); } else { fprintf(stderr, "Error. Priority Queues all null\n"); } pcb_start(current_process); return current_process; } return NULL; }