void run_simulation(int algorithm, int quantum) { switch(algorithm) { case STRIDE: stride_scheduling(quantum); break; case PS: priority_scheduling(); break; case RR: rr_scheduling(quantum); break; case FCFS: default: first_come_first_serve(); break; } }
void stride_scheduling(int quantum) { total_priority = 0; global_tickets = 10000; /* divide tickets by piority */ int i,p; for ( p =0; p<num_tasks; p++){ if (tasks[p].stride <= current_pass && tasks[p].finish_time == 0) total_priority += tasks[p].priority; } if (total_priority == 0){ compute_and_print_stats(); exit(0); } for ( i =0; i<num_tasks; i++){ tasks[i].stride = tasks[i].priority * tasks[i].schedulings; /*printf("Stride: %d %d \n", tasks[i].stride, current_pass);*/ if (global_tickets - tasks[i].tickets <=0){ /* printf ("Not enough tickets \n");*/ break; } if (tasks[i].stride > current_pass || tasks[i].finish_time != 0) { tasks[i].tickets = 0; tasks[i].upperbound = 0; global_tickets-= tasks[i].tickets; tasks[i].lowerbound= 0; current_pass++; } else{ /* printf("Total Priority : %d\n", total_priority);*/ tasks[i].tickets = tasks[i].priority *(10000/total_priority); tasks[i].upperbound = global_tickets; global_tickets-= tasks[i].tickets; tasks[i].lowerbound= global_tickets+1; /* printf(" Upper; %d Lower %d\n", tasks[i].upperbound, tasks[i].lowerbound);*/ } } srand ( time(NULL) ); int r = rand() % (10000 - global_tickets + 2); r = 10000 - r; int j; for (j =0; j<num_tasks; j++) { if (tasks[j].upperbound >= r && r >= tasks[j].lowerbound) { /*task runs*/ if (tasks[j].length - quantum - tasks[j].cpu_cycles<=0 ) { /* printf("Running task %d:\n\n" , j);*/ int p = tasks[j].length- tasks[j].cpu_cycles; tasks[j].cpu_cycles += p; tasks[j].schedulings +=1; current_tick += p; tasks[j].finish_time = current_tick; /* printf("finish time %f current tick %d schedulings %d\n" , tasks[j].finish_time, current_tick, tasks[j].schedulings);*/ /* printf("TASK %d FINSIHED \\n\n\n", j);*/ current_pass++; usleep(10000); } else { /*printf("Running task %d:\n" , j);*/ tasks[j].cpu_cycles += quantum; current_tick+= quantum; tasks[j].schedulings += 1; /* printf("Cycles %f current tick %d schedulings %d\n" , tasks[j].cpu_cycles, current_tick, tasks[j].schedulings);*/ current_pass++; usleep(10000); } } } stride_scheduling(quantum); printf("STRIDE SCHEDULING appears here\n"); exit(1); }