操作系统lab6实验报告
实验五完成了用户进程的管理,可在用户态运行多个进程。可是目前的进程调度策略是FIFO策略,而本实验则会实现Stride Scheduling
调度算法。
练习0:填写已有实验
同样使用一款名为meld
的软件进行对比即可,大致截图如下:
现在将需要修改的文件罗列如下:
proc.c
default_pmm.c
pmm.c
swap_fifo.c
vmm.c
trap.c
然后是一些需要简单修改的部分,根据注释的提示,主要是一下两个函数需要额外加以修改。
alloc_proc函数
这里alloc_proc
还需要修改一下,完整的代码如下:
static struct proc_struct *
alloc_proc(void) {
struct proc_struct *proc = kmalloc(sizeof(struct proc_struct));
if (proc != NULL) {
proc->state = PROC_UNINIT;
proc->pid = -1;
proc->runs = 0;
proc->kstack = 0;
proc->need_resched = 0;
proc->parent = NULL;
proc->mm = NULL;
memset(&(proc->context), 0, sizeof(struct context));
proc->tf = NULL;
proc->cr3 = boot_cr3;
proc->flags = 0;
memset(proc->name, 0, PROC_NAME_LEN);
proc->wait_state = 0;
proc->cptr = proc->optr = proc->yptr = NULL;
proc->rq = NULL;
list_init(&(proc->run_link));
proc->time_slice = 0;
proc->lab6_run_pool.left = proc->lab6_run_pool.right = proc->lab6_run_pool.parent = NULL;
proc->lab6_stride = 0;
proc->lab6_priority = 0;
}
return proc;
}
相比于lab5,lab6对proc_struct
结构体再次做了扩展,这里主要是多出了以下部分
proc->rq = NULL;//初始化运行队列为空
list_init(&(proc->run_link));//初始化运行队列的指针
proc->time_slice = 0;//初始化时间片
proc->lab6_run_pool.left = proc->lab6_run_pool.right proc->lab6_run_pool.parent = NULL; //初始化各类指针为空,包括父进程等待
proc->lab6_stride = 0;//步数初始化
proc->lab6_priority = 0;//初始化优先级
具体的解释见注释。
trap_dispatch函数
这里在时钟产生的地方需要对定时器做初始化,修改的部分如下:
static void
trap_dispatch(struct trapframe *tf) {
......
......
ticks ++;
assert(current != NULL);
run_timer_list(); //更新定时器,并根据参数调用调度算法
break;
......
......
}
练习1 使用Round Robin调度算法
Round Robin
调度算法的调度思想是让所有 runnable 态的进程分时轮流使用 CPU 时间。Round Robin
调度器维护当前 runnable进程的有序运行队列。当前进程的时间片用完之后,调度器将当前进程放置到运行队列的尾部