type
status
slug
date
summary
tags
category
password
icon
移植上一个lab的内容花了不少时间,主要是最开始没懂测试逻辑,后面发现在ci里面测试是利用spwan来进行的,那确实直接就寄了,因为写都没写,没办法调度上来。
实现sys_spawn
实现过程我是完全参考fork和exec调用的函数,这里要注意一个地方,新建立的进程还是会作为子进程记录到当前进程,这样后续的wait_pid 才好使用
实现stride算法
在TCB里面加入一些新的字段表示优先级
目前来看只需要一个stride字段和一个优先级字段,BIG_STRIDE作为一个config
主要是改变fetch函数,从而找到高优先级函数执行
问答作业
1.
stride 算法原理非常简单,但是有一个比较大的问题。例如两个 pass = 10 的进程,使用 8bit 无符号整形储存 stride, p1.stride = 255, p2.stride = 250,在 p2 执行一个时间片后,理论上下一次应该 p1 执行。
实际情况是轮到 p1 执行吗?为什么?
不会,因为p2.stride在p2执行后,会加上一个pass(10),但是250+10会溢出,导致优先级发生反转,p2明明应该是260的stride,但是因为u8,则变成4,则下次执行还是p2,事实上,哪怕这样,直到p2又增长,变成254,仍然是p2执行,然后又一次溢出,变成8,然后又执行很多次,到p2.stride为248,然而还溢出,变成2,然后又是从252,执行,溢出,变成6,然后又执行变成246,执行,溢出,变成0,然后又变成250,回到一开始的样子,那么,p1永远不会执行,
所以实际情况是,p1永远得不到执行!!!!
2.
我们之前要求进程优先级 >= 2 其实就是为了解决这个问题。可以证明, 在不考虑溢出的情况下 , 在进程优先级全部 >= 2 的情况下,如果严格按照算法执行,那么 STRIDE_MAX – STRIDE_MIN <= BigStride / 2。
上面字写错了一个,应该是不考虑溢出☝️
已知以上结论,考虑溢出的情况下,可以为 Stride 设计特别的比较器,让 BinaryHeap<Stride> 的 pop 方法能返回真正最小的 Stride。补全下列代码中的
partial_cmp
函数,假设两个 Stride 永远不会相等。TIPS: 使用 8 bits 存储 stride, BigStride = 255, 则:
(125 < 255) == false
, (129 < 255) == true
.补全:
主要是之前的结论,保证了正常不溢出的话,一定不会超过BigStride/2(我们从64位里面截断取出8位),如果发生,说明发生了溢出,则溢出的数字一定更大,但是如果两个数字都发生了溢出,那么他们的差就不会超过BigStride/2(相当于同时都减少一个相同的数,那么差值不变),所以这个时候不用考虑溢出,从而这个比较是永远正确的(选取Bigstride为8位的最大数字,而我们的stride本身可以取64位没问题的喔)
- 作者:liamY
- 链接:https://liamy.clovy.top/article/OS_Tutorial/lab5
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。