Где реализовать fifo и lifo в xv6 - PullRequest
1 голос
/ 21 апреля 2020

В настоящее время я делаю домашнюю работу с xv6, мне нужно реализовать FIFO и LIFO со следующим стилем кода:

#define IFO 1
#if IFO==1
  DO FIFO HERE
#endif


#if IFO==2
  DO LIFO HERE
#endif

Какой файл xv6 я должен изменить, чтобы реализовать эти политики планирования. Любой совет, что я должен делать, я новичок ie с использованием xv6, и я не понимаю, что я делаю. Кроме того, домашнее задание включает дополнительный файл sched_test:

#include "types.h"
#include "stat.h"
#include "user.h"
#include <time.h> 

void delay(int number_of_milliseconds){ 
    // Converting time into milli_seconds 
    int milli_seconds = number_of_milliseconds; 

    int start_time = uptime(); 

    while (uptime() < start_time + milli_seconds) ;
} 
int main(){ 
    // Creating first child 
    int n1 = fork(); 
    int count = 0;
    int times = 20; 
    int millisec_to_wait = 5;

    // Creating second child. First child 
    // also executes this line and creates 
    // grandchild. 
    int n2 = fork(); 

    if (n1 > 0 && n2 > 0) 
    { 
        printf(1,"\n0.- parent ID: %d\n",getpid());
        while(count < times){
            printf(1,"0 ");
            delay(millisec_to_wait); 
            count++;
        }
    } 
    else if (n1 == 0 && n2 > 0) 
    { 
        printf(1,"\n1.- first child ID: %d\n",getpid()); 
        while(count < times){
            printf(1,"1 ");
            delay(millisec_to_wait); 
            count++;
        }
    } 
    else if (n1 > 0 && n2 == 0) 
    { 
        printf(1,"\n2.- second child ID: %d\n",getpid()); 
        while(count < times){
            printf(1,"2 ");
            delay(millisec_to_wait); 
            count++;
        }
    } 
    else { 
        printf(1,"\n3.- third child ID: %d\n",getpid()); 
        while(count < times){
            printf(1,"3 ");
            delay(millisec_to_wait); 
            count++;
        }
    } 

    while(wait() >= 0);
    exit(); 
} 

Я уже включил его в MAKEFILE и выполняю, очищаю, создаю и создаю qemu.

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете начать реализацию в proc.c в функции scheduler(). Вот где это в ванили xv6 . В basi c xv6 он просто перебирает таблицу процессов, чтобы найти первый процесс. Вы захотите добавить свою собственную структуру данных, которую вы будете использовать в scheduler(), чтобы определить, какие процессы будут выполняться дальше. Это важная часть этой функции с некоторыми примечаниями:

    // LOOP OVER SOME DATA STRUCTURE TO FIND A RUNNABLE PROCESS
    acquire(&ptable.lock);
    for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
      if(p->state != RUNNABLE)
        continue;

      c->proc = p;
      switchuvm(p);
      p->state = RUNNING;

      swtch(&(c->scheduler), p->context);
      switchkvm();

      c->proc = 0;

      // ADUJST YOUR DATA STRUCTURE TO AFTER RUNNING THE PROCESS
      #if OWNSCHED==1
          // Add to the end of some D/S
      #elif OWNSCHED==2
          // Add to the beginning of some D/S
      #endif
    }
    release(&ptable.lock);

Вы можете добавить структуру данных в структуру ptable в proc.c, чтобы отслеживать порядок запуска процессов, затем l oop за это в scheduler(). Конечно, это означает, что вам придется изменить некоторые другие функции, такие как allocproc(), чтобы добавить новые процессы в соответствующих местах. Остальное зависит от нескольких вещей, например, если вам разрешено использовать массив stati c для хранения процессов или если вместо этого вы должны использовать связанный список.

Если вы еще этого не сделали, Я настоятельно рекомендую прочитать главу 6 книги xv6 . Это было действительно полезно, когда мне пришлось реализовать MLFQ в xv6!

...