Реализация FCFS для xv6

В настоящее время для моего проекта в колледже я пытаюсь реализовать алгоритмы планирования 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 для создания дочерних процессов для выполнения бесполезных вычислений, требующих времени), каждый из которых создает дочерний процесс, почему я все еще могу запустить пс?

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

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


person Shabbir Khandwala    schedule 12.04.2020    source источник


Ответы (1)


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

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

    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;
    

    но поскольку state minP необходим 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;
        }
    }
}
person Mathieu    schedule 14.04.2020
comment
Для меня это впервые! Я получаю ошибку отступа в C! Как бы то ни было, чтобы это исправить? Просто небольшое изменение в обновлении, я думаю, что minP должен быть объявлен вне цикла for, чтобы предотвратить любую ошибку объявления! - person Shabbir Khandwala; 20.04.2020
comment
@ShabbirKhandwala действительно, minP должен быть объявлен перед forloop. Насчет отступа (?) Странно, что за сообщение об ошибке? - person Mathieu; 21.04.2020