Реализация FCFS для xv6 - PullRequest
0 голосов
/ 12 апреля 2020

В настоящее время для своего проекта в колледже я пытаюсь реализовать алгоритмы планирования FCFS и Priority для xv6. Я сделал с приоритетом и теперь пытаюсь заставить FCFS работать. Ниже приведено изменение, которое я внес в код:

void
scheduler(void)
{
  struct proc *p = 0;

  struct cpu *c = mycpu();
  c->proc = 0;

  for(;;)
  {
      // Enable interrupts on this processor.
      sti();

      // Loop over process table looking for process to run.
      acquire(&ptable.lock);
      for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
      {

            struct proc *minP = 0;

            if(p->state != RUNNABLE)
              continue;

            // ignore init and sh processes from FCFS
            if(p->pid > 1)
            {
              if (minP != 0){
                // here I find the process with the lowest creation time (the first one that was created)
                if(p->ctime < minP->ctime)
                  minP = p;
              }
              else
                  minP = p;
            }

            // If I found the process which I created first and it is runnable I run it
            //(in the real FCFS I should not check if it is runnable, but for testing purposes I have to make this control, otherwise every time I launch
            // a process which does I/0 operation (every simple command) everything will be blocked
            if(minP != 0 && p->state == RUNNABLE)
                p = minP;

          if(p != 0)
          {

            // Switch to chosen process.  It is the process's job
            // to release ptable.lock and then reacquire it
            // before jumping back to us.
            c->proc = p;
            switchuvm(p);
            p->state = RUNNING;

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

            // Process is done running for now.
            // It should have changed its p->state before coming back.
            c->proc = 0;
          }
        }

        release(&ptable.lock);
  }
}

Теперь я хотел бы спросить: когда я запускаю два фиктивных процесса (в соответствии с соглашением, foo. c для создания дочерних процессов чтобы делать бесполезные вычисления, которые требуют времени) каждый из которых производит ребенка, почему я все еще могу запускать ps?

Технически, каждый из 2 доступных процессоров должен быть занят, выполняя правильный процесс двух пустышек?

Кроме того, я установил время создания как Приоритет, используя алгоритм, который я написал для Приоритетного планирования. Оказывается, после создания двух процессов я ничего не могу запустить, то есть оба процессора сейчас используются.

1 Ответ

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

Я думаю, что вы допустили две ошибки:

  1. контекст процесса внутри ваш for l oop, должно быть после:

    schedule()
    {
        // for ever
        for(;;) 
        {
             // select process to run
             for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
             {                 
                ...
             }
    
             // run proc
             if (p != 0)
             {                 
                ...
             }
        }
    
  2. Вы допустили небольшую ошибку в minP выборе:

    if(minP != 0 && p->state == RUNNABLE)  
        p = minP;
    

    должно быть

    if(minP != 0 && minP->state == RUNNABLE)
       p = minP;
    

    , но с тех пор minP необходимо state необходимо RUNNABLE, и чтобы вы проверили, что перед запуском его значение не равно нулю, вы можете написать

       p = minP; 
    

Итак, вы исправленный код может быть:

void
scheduler(void)
{
    struct proc *p = 0;
    struct cpu *c = mycpu();
    c->proc = 0;

    for(;;)
    {
        sti();

        struct proc *minP = 0;

        // Loop over process table looking for process to run.
        acquire(&ptable.lock);
        for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
        {
            if(p->state != RUNNABLE)
                continue;

                // ignore init and sh processes from FCFS
                if(p->pid > 1)
                {
                    if (minP != 0) {
                        // here I find the process with the lowest creation time (the first one that was created)
                        if(p->ctime < minP->ctime)
                            minP = p;
                    }
                    else
                        minP = p;
                }

        }
        p = minP;
        release(&ptable.lock);

        if(p != 0)
        {

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

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

            c->proc = 0;
        }
    }
}
...