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);
		}
	}
}
/* 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;
}