Exemple #1
0
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;
}