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