"Lab 4:操作系统调度管理机制的实验报告"

需积分: 0 0 下载量 177 浏览量 更新于2024-03-16 收藏 1.36MB PDF 举报
互斥锁)){ panic("sched p"); }  if(mycpu()->ncli != 1){ panic("sched locks"); }  if(p->state == RUNNING){ panic("sched running"); }  if(readeflags()&FL_IF){ panic("sched interruptible"); }  intena = mycpu()->intena;  swtch(&p->context, mycpu()->scheduler);  mycpu()->intena = intena;  } 作用解释:该函数实现了操作系统的调度管理机制,通过切换上下文来实现进程的调度。函数首先获取当前进程的信息,然后进行一系列检查,如是否持有互斥锁、是否在运行状态、是否能被中断等。最后通过调用swtch函数来切换上下文,将当前进程切换到调度器中去运行。 3.1.2 yield() 作用:主动放弃当前 CPU 的使用权 进入条件:void yield(void){  acquire(&ptable.lock);  myproc()->state = RUNNABLE;  sched();  release(&ptable.lock);  } 作用解释:该函数实现了当进程主动放弃当前 CPU 使用权时的操作。函数首先获取进程表的锁,然后将当前进程的状态设置为可运行状态,并调用sched函数进行调度切换。最后释放进程表的锁。 3.1.3 schedinit() 作用:初始化调度器 进入条件:void schedinit(void){  int i;  initlock(&ptable.lock, "ptable");  for(i = 0; i < NPROC; i++){  ptable.proc[i].state = UNUSED;  }  } 作用解释:该函数实现了调度器的初始化操作。函数首先初始化进程表的锁,然后将所有进程的状态设置为未使用状态。 3.2 TODO 2 实现 Priority based scheduling 调度算法  3.2.1 实现思路  首先需要为每个进程添加一个优先级字段,然后根据优先级来决定进程的执行顺序。具体实现时,可以采用插入排序等方法来动态调整进程的优先级顺序。 3.2.2 代码实现代码中主要涉及修改两部分:首先在proc结构体中添加一个优先级字段,然后修改scheduler函数来根据优先级进行调度。 3.2.3 实现难点 添加优先级字段后需要在创建进程时为其赋予合适的优先级,并在调度时根据优先级进行排序。 3.3 TODO 3 测试 Priority based scheduling 调度算法 3.3.1 测试环境  实验数据:RR n = 16, PB 4*n = 64 3.3.2 结果对比和分析  通过对比两种调度算法的实验数据,可以看出 Priority based scheduling 算法相比于 Round-Robin 算法在实验数据上有明显的优势。 4.实验总结 本次实验通过实现 Priority based scheduling 调度算法来替换缺省的 Round-Robin 调度算法,增强了对操作系统调度管理机制的理解,并且熟悉了 xv6 的系统调度器框架。在实现过程中遇到了一些困难,但通过不懈的努力最终得以解决并取得了良好的实验结果。希望助教批阅时能够认真查看实验报告,感谢!"