2016-01-10 1 views
0

Я пытаюсь реализовать алгоритм Round Robin для симулятора планировщика CPU, но используя структуру связанных списков.Round Robin scheduling с помощью связанного списка

Я написал этот код, но, похоже, не работает так, как должно быть:

//Round Robin scheduling 
void roundRobin(){ 

bubbleSortArrivalTime(); 

struct process *temp; 
int totalTimeCnt=0; 
int totalTime; 
int quantum=4; 
int i; 

for(temp=proc; temp!=NULL; temp=temp->next){ 
totalTime+=temp->burstTime; 

} 

do{ 


for(i=1; i<LISTSIZE; i++){ 

if(i==1){ 
set_nth_process_burstTime(proc, i, get_nth_process_burstTime(proc,i)-quantum); 

//set_nth_process_waitingTime(proc, i, get_nth_process_burstTime(proc,i-1)+get_nth_process_waitingTime(proc, i-1)); 

totalTime+=4; 
} 

else{ 
set_nth_process_burstTime(proc, i, get_nth_process_burstTime(proc,i)-quantum); 
set_nth_process_waitingTime(proc, i, get_nth_process_burstTime(proc,i-1)+get_nth_process_waitingTime(proc, i-1)); 
totalTime+=4; 
} 

} 


}while(totalTimeCnt!=0); 


method="Method selected: Round Robin Scheduling"; 


} 

Структура моего связанного списка выглядит следующим образом:

struct process{ 
    int burstTime,arrivalTime, priority,pname; 
    float waitingTime, turnArroundTime; 
    struct process *next; 
}*proc=NULL; 

где proc является определяемый как глобальный.

Я реализовал некоторые получают и установить функции для доступа к любому элементу легко:

void set_nth_process_burstTime(struct process*header, int position, int value) 
void set_nth_process_waitingTime(struct process *header, int position, float value) 
int get_nth_process_waitingTime(struct process *header, int position) 
int get_nth_process_priority(struct process *header,int position) 
int get_nth_process_arrivalTime(struct process *header,int position) 
int get_nth_process_burstTime(struct process *header,int position) 

Не могли бы вы мне советы о том, как реализовать Round Robin правильно? Это не дает правильных результатов.

ответ

0

круглый робин очень прост. в основной функции, после того, как все инициализации, настройки прерываний и т.д., есть:

while(1) 
{ 
    process_1(); 
    process_2(); 
    process_3(); 
    ... 
} 

Все, что за это было бы из-за некоторых специальных соображений для конкретного проекта.

Для реализации scheduler + dispatcher с несколькими желаемыми интервалами выполнения, приоритетами, состояниями состояния, старением и т. Д. Является совершенно другой архитектурой.

для round robin, вышеуказанный цикл while().

Для реалистичного проекта, вам также потребуется:

  1. определенное прерыванию процессы синхронизации и ввода/вывода,
  2. обработки сторожевого таймера
  3. теплые и холодные режимы загрузки
  4. включение питания BIT
  5. непрерывный BIT
  6. с приказами BIT
+0

Где таймер прерывает? Что, если 'process_1' берет навсегда? Что делать, если процесс убит? Он будет снова запланирован на следующей итерации 'while'. Это больше похоже на алгоритм пакетной обработки. И небольшая степень мультипрограммирования также будет приятной. – Downvoter

+0

для меня это просто симулятор. Не нужно использовать эти функции. –

+0

@cad, вопрос OPs был о 'round robin' не о каком-либо мультипрограммировании. Надеюсь, вы заметили обработчик сторожевого таймера, обработчик прерываний и другие функции, которые должны быть в реалистичной системе. Точно так же, что 'while()' loop - это то, что подразумевается под 'round robin'. Сторожевой сторож будет обращаться с любой проблемой, например, с процессом. несмотря на то, что правильный подход заключается в том, чтобы не писать никаких циклов ожидания, которые могли бы повесить навсегда. – user3629249

0
#include<stdio.h> 

struct process { 
char na[20]; 
int at, bt, ft, tat, rem; 
float ntat; 
} Q[5], temp; 

void roundRobin() { 
int rr[20], q, x, k; 
int f, r, n, i, j, tt = 0, qt, t, flag, wt = 0; 
float awt = 0, antat = 0, atat = 0; 

printf("Enter the no. of jobs:"); 
scanf("%d", &n); 
for (r = 0; r < n; r++) { 
    printf("Enter process name,arrival time and burst time:\n"); 
    scanf("%s%d%d", Q[r].na, &Q[r].at, &Q[r].bt); 
} 
printf("Enter quantum:\n"); 
scanf("%d", &qt); 
for (i = 0; i < n; i++) { 
    for (j = i + 1; j < n; j++) { 
     if (Q[i].at > Q[j].at) { 
      temp = Q[i]; 
      Q[i] = Q[j]; 
      Q[j] = temp; 
     } 
    } 
} 
for (i = 0; i < n; i++) { 
    Q[i].rem = Q[i].bt; 
    Q[i].ft = 0; 
} 
tt = 0; 
q = 0; 
rr[q] = 0; 
do { 
    for (j = 0; j < n; j++) 
     if (tt >= Q[j].at) { 
      x = 0; 
      for (k = 0; k <= q; k++) 
       if (rr[k] == j) 
        x++; 
      if (x == 0) { 
       q++; 
       rr[q] = j; 
      } 
     } 
    if (q == 0) 
     i = 0; 
    if (Q[i].rem == 0) 
     i++; 
    if (i > q) 
     i = (i - 1) % q; 
    if (i <= q) { 
     if (Q[i].rem > 0) { 
      if (Q[i].rem < qt) { 
       tt += Q[i].rem; 
       Q[i].rem = 0; 
      } else { 
       tt += qt; 
       Q[i].rem -= qt; 
      } 
      Q[i].ft = tt; 
     } 
     i++; 
    } 
    flag = 0; 
    for (j = 0; j < n; j++) 
     if (Q[j].rem > 0) 
      flag++; 
} while (flag != 0); 

printf("\n\n\t\tROUND ROBIN ALGORITHM"); 
printf("\n***************************"); 
printf("\nprocesses Arrival time burst time finish time tat wt ntat"); 
for (f = 0; f < n; f++) { 
    wt = Q[f].ft - Q[f].bt - Q[f].at; 
    Q[f].tat = Q[f].ft - Q[f].at; 
    Q[f].ntat = (float) Q[f].tat/Q[f].bt; 
    antat += Q[f].ntat; 
    atat += Q[f].tat; 
    awt += wt; 
    printf("\n\t%s\t%d\t\t%d\t%d\t%d\t%d %f", Q[f].na, Q[f].at, Q[f].bt, 
      Q[f].ft, Q[f].tat, wt, Q[f].ntat); 
} 
antat /= n; 
atat /= n; 
awt /= n; 
printf("\nAverage tat is %f", atat); 
printf("\nAverage normalised tat is %f", antat); 
printf("\n average waiting time is %f", awt); 
}