c-在xv6中实现fifo和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"
#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: %dn",getpid());
while(count < times){
printf(1,"0 ");
delay(millisec_to_wait); 
count++;
}
} 
else if (n1 == 0 && n2 > 0) 
{ 
printf(1,"n1.- first child ID: %dn",getpid()); 
while(count < times){
printf(1,"1 ");
delay(millisec_to_wait); 
count++;
}
} 
else if (n1 > 0 && n2 == 0) 
{ 
printf(1,"n2.- second child ID: %dn",getpid()); 
while(count < times){
printf(1,"2 ");
delay(millisec_to_wait); 
count++;
}
} 
else { 
printf(1,"n3.- third child ID: %dn",getpid()); 
while(count < times){
printf(1,"3 ");
delay(millisec_to_wait); 
count++;
}
} 
while(wait() >= 0);
exit(); 
} 

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

您可以在scheduler()函数的proc.c中开始实现。这是它在香草xv6中的位置。在基本的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);

您可以在proc.c中的ptable结构中添加一个数据结构,以跟踪要运行的进程的顺序,然后在scheduler()中对此进行循环。当然,这意味着您必须修改一些其他函数,如allocproc(),以便在适当的位置添加新的进程。剩下的部分取决于一些事情,比如是否允许使用静态数组来存储进程,或者是否必须使用链表。

如果你还没有,我强烈建议你阅读xv6书的第6章。当我不得不在xv6中实现MLFQ时,这真的很有帮助!

相关内容

  • 没有找到相关文章

最新更新