From 677df776c3b6d57655ab7df6a2420b4a28d2a9b7 Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Thu, 28 Nov 2019 16:05:21 +0800 Subject: [PATCH] update conclusion on BIGSTRIDE. --- thu_os/lab6_report.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/thu_os/lab6_report.md b/thu_os/lab6_report.md index 656eecc..c22d452 100644 --- a/thu_os/lab6_report.md +++ b/thu_os/lab6_report.md @@ -488,13 +488,13 @@ stride_pick_next(struct run_queue *rq) { 容易证明,在任何一次进行调度时,就绪队列中的任意两个进程都满足 $$ -| pass_1 - pass_2 | \le stride\_max +| pass__1 - pass__2 | \le stride__max $$ 其中,`stride_max`表示所有进程中的最大步进值。这样,可以进一步 $$ -passMax - passMin \le BIG\_STRIDE +pass__max - pass__min \le BIG__STRIDE $$ 因此一种解决方案是,对两个`pass`之差的结果进行分析,如果它是介于`-BIG_STRIDE`到`BIG_STRIDE`之间的,则认为是一个合理值,返回正常的结果。若这个差值在上述区间之外,则认为其中一个`pass`已经发生了溢出,因此取相反的结果,对应的比较函数的实现如下: @@ -528,6 +528,12 @@ proc_stride_comp_f(void *a, void *b) } ``` -在这样的情况下,就需要正确选择`BIG_STRIDE`的值,使得两个无符号32位整数之差,在`pass_1`的确大于`pass_2`时(指真值,而不是溢出之后的值),`pass_1 - pass_2`为正的有符号整数;在`pass_1`小于`pass_2`时,为负的有符号整数。 +在这样的情况下,就需要合理选择`BIG_STRIDE`的值,使得两个无符号32位整数之差,在`pass_1`的确大于`pass_2`时(指真值,而不是溢出之后的值),`pass_1 - pass_2`为正的有符号整数;在`pass_1`小于`pass_2`时,为负的有符号整数。 -经过我的深思熟虑(我也说不清中间的逻辑是什么,这里比较复杂啊,设计比较底层的知识),可以验证,当`BIG_STRIDE = ~(1 << 31)`时,正好满足这个条件,此时就可以使用第二个版本那个简明的比较函数了。 +此时仍然有: + +$$ +|pass__1 - pass__2| \le BIG__STRIDE +$$ + +因此,只需要选择32位下最大的有符号整数`0x7fffffff`,当`BIG_STRIDE = 0X7fffffff`时,上面的式子总是满足的,此时就可以用第二个版本简单的比较函数了。需要注意的是,两个版本的比较函数在实质上仍然是相同的。