C xv6中在何处实施fifo和lifo

C xv6中在何处实施fifo和lifo,c,scheduling,fifo,xv6,lifo,C,Scheduling,Fifo,Xv6,Lifo,我目前正在为xv6做准备工作,我需要用以下代码风格实现FIFO和LIFO: #define IFO 1 #if IFO==1 DO FIFO HERE #endif #if IFO==2 DO LIFO HERE #endif 我应该修改哪个xv6文件来实现这些调度策略。任何关于我应该做什么的提示,我是使用xv6的新手,我不太了解我在做什么。此外,作业还包括一个名为sched_test的额外文件: #include "types.h" #include "stat.h" #incl

我目前正在为xv6做准备工作,我需要用以下代码风格实现FIFO和LIFO:

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


#if IFO==2
  DO LIFO HERE
#endif
我应该修改哪个xv6文件来实现这些调度策略。任何关于我应该做什么的提示,我是使用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(); 
} 
#包括“types.h”
#包括“stat.h”
#包括“user.h”
#包括
无效延迟(整数毫秒){
//将时间转换为毫秒
int milli_seconds=毫秒数;
int start_time=正常运行时间();
而(正常运行时间()<开始时间+毫秒);
} 
int main(){
//创建第一个孩子
int n1=fork();
整数计数=0;
整数倍=20;
int毫秒到等待=5;
//创建第二个孩子。第一个孩子
//也执行此行并创建
//孙子。
int n2=fork();
如果(n1>0&&n2>0)
{ 
printf(1,“\n0.-父ID:%d\n”,getpid());
while(计数<次){
printf(1,“0”);
延迟(毫秒至毫秒等待);
计数++;
}
} 
否则如果(n1==0&&n2>0)
{ 
printf(1,“\n1.-第一个子ID:%d\n”,getpid());
while(计数<次){
printf(1,“1”);
延迟(毫秒至毫秒等待);
计数++;
}
} 
否则如果(n1>0&&n2==0)
{ 
printf(1,“\n2.-第二个子ID:%d\n”,getpid());
while(计数<次){
printf(1,“2”);
延迟(毫秒至毫秒等待);
计数++;
}
} 
否则{
printf(1,“\n3.-第三个子ID:%d\n”,getpid());
while(计数<次){
printf(1,“3”);
延迟(毫秒至毫秒等待);
计数++;
}
} 
while(wait()>=0);
退出();
} 

我已经将它包含在MAKEFILE中,并执行、清除、生成和生成qemu。

您可以在
调度程序()中的
proc.c
中开始实现。在这里。在basicxv6中,它只是在流程表上循环查找第一个流程。您需要添加自己的数据结构,以便在
scheduler()
中使用它来确定下一步要运行的进程。这是该功能的一个重要部分,请注意:

//循环某些数据结构以查找可运行的进程
获取(&ptable.lock);
对于(p=ptable.proc;p<&ptable.proc[NPROC];p++){
如果(p->state!=RUNNABLE)
继续;
c->proc=p;
uvm(p);
p->状态=运行;
swtch(&(c->scheduler),p->context);
switchkvm();
c->proc=0;
//运行流程后,将数据结构调整为
#如果OWNSCHED==1
//添加到某些D/S的末尾
#elif OWNSCHED==2
//添加到某些D/S的开头
#恩迪夫
}
释放(&ptable.lock);
您可以在
proc.c
中的
ptable
结构中添加一个数据结构,以跟踪要运行的进程的顺序,然后在
scheduler()
中对此进行循环。当然,这意味着您必须修改一些其他函数,例如
allocproc()
,以便在适当的位置添加新进程。其余部分取决于几件事,比如是否允许使用静态数组存储进程,或者是否必须使用链表


如果您还没有,我强烈建议您阅读本手册第6章。当我不得不在xv6中实现MLFQ时,它真的很有帮助

您可以在
scheduler()
函数的
proc.c
中启动实现。在这里。在basicxv6中,它只是在流程表上循环查找第一个流程。您需要添加自己的数据结构,以便在
scheduler()
中使用它来确定下一步要运行的进程。这是该功能的一个重要部分,请注意:

//循环某些数据结构以查找可运行的进程
获取(&ptable.lock);
对于(p=ptable.proc;p<&ptable.proc[NPROC];p++){
如果(p->state!=RUNNABLE)
继续;
c->proc=p;
uvm(p);
p->状态=运行;
swtch(&(c->scheduler),p->context);
switchkvm();
c->proc=0;
//运行流程后,将数据结构调整为
#如果OWNSCHED==1
//添加到某些D/S的末尾
#elif OWNSCHED==2
//添加到某些D/S的开头
#恩迪夫
}
释放(&ptable.lock);
您可以在
proc.c
中的
ptable
结构中添加一个数据结构,以跟踪要运行的进程的顺序,然后在
scheduler()
中对此进行循环。当然,这意味着您必须修改一些其他函数,例如
allocproc()
,以便在适当的位置添加新进程。其余部分取决于几件事,比如是否允许使用静态数组存储进程,或者是否必须使用链表

如果您还没有,我强烈建议您阅读本手册第6章。当我不得不在xv6中实现MLFQ时,它真的很有帮助