2021/5/23 0:54,mark这个时间以记录我还没写好的OS实验报告TATATAT
主要是对xv6还没怎么学习,现在综合实验一上来就是要修改操作系统源码。天哪噜,QAQ,只能恶补
调度
调整时间片长度
要将原来N个tick才切换进程,变成M个tick才切换进程,tick属于进程数据,因此在PCB添加相关属性就行:
分配PCB时要初始化一下:
调度切换是在trap.c中完成的,原来1个tick后进程直接yield(让出CPU资源),现在要等到slot完全用完之后才能yield,不然就一直在CPU上跑。
如何验证是否已经修改成功?编写一个长时间的计算型程序就行了。然后按几次CTRL+P,不出意外的话,时间片tick应该会在一个范围内变化。
优先级调度
在RR基础上增加优先级调度,也就是:只调度最高优先级,当优先级相同时,RR调度。一样的,再在PCB数据结构中添加一个数据成员:
初始化:
现在需要写一个系统函数,实现优先级的设置,核心代码应该是下面这样的:
其他增加调用入口、添加调用号等就走一下流程。
还差调度,如何做?算法就是优先级调度的原理,修改一下调度器:
流程基本上就是从优先级高到优先级低扫描一遍(prio越小,表示优先级越高,这样设置挺绕的。),找到可运行的进程,直接设置状态为RUNNING调上CPU。
测试程序DIY就行了,基本思路就是将进程设置为不同的优先级,成功的话一般有下面的输出模式:
pid 3 和 pid 4 优先级低,未上CPU;6和7就上CPU
信号量
xv6提供了自旋锁用于内核代码的并发同步,但并没有在用户态提供同步手段。xv6简陋,没有共享内存的概念,因此我们先定义一个内核共享变量,且为了访问kernel的变量,我们需要增加读和写的系统调用。
upd:2021/5/23 20:10 实验做好了,有空我再来补充