在xv6中哪里实现fifo和lifo
Where to implement fifo and lifo in xv6
我目前正在做 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();
}
我已经将它包含在 MAKEFILE 中,并执行、make clean、make 和 make qemu。
您可以在 proc.c
的 scheduler()
函数中开始实施。这是 in vanilla xv6 的位置。在基本的 xv6 中,它只是循环遍历进程 table 以找到第一个进程。您需要添加自己的数据结构,您将在 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()
以在适当的位置添加新进程。其余部分取决于一些事情,例如是否允许您使用静态数组来存储进程,或者是否必须改用链表。
如果您还没有阅读过,我强烈建议您阅读 the xv6 book 的第 6 章。当我不得不在 xv6 中实现 MLFQ 时,它真的很有帮助!
我目前正在做 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();
}
我已经将它包含在 MAKEFILE 中,并执行、make clean、make 和 make qemu。
您可以在 proc.c
的 scheduler()
函数中开始实施。这是 in vanilla xv6 的位置。在基本的 xv6 中,它只是循环遍历进程 table 以找到第一个进程。您需要添加自己的数据结构,您将在 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()
以在适当的位置添加新进程。其余部分取决于一些事情,例如是否允许您使用静态数组来存储进程,或者是否必须改用链表。
如果您还没有阅读过,我强烈建议您阅读 the xv6 book 的第 6 章。当我不得不在 xv6 中实现 MLFQ 时,它真的很有帮助!