xv6学习笔记

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 实验做好了,有空我再来补充

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值