Steve,
对于3,我觉得你的研究很仔细也很锐利,你所提到的问题不能说不会发生,但是这里有更多需要考虑的方面。
比如,如果加上这个“最长时间”的定量限制,那么某些最长时间虽然很短的待换入进程,其实需要马上被换入执行,
而没能及时换入。比如用fork(newproc)/execl创建的子进程,在xswap中p_time被设成0,但它其实需要被马上换入执行,因为
通常情况用户新起一个进程总是希望它能够立即执行。
再比如,某个进程因为等待磁盘或其他I/O读写而被换出到磁盘,如果I/O很快(在1秒内)完成,那么该进程就会被唤醒,
在这时候,根据新法则,该进程由于p_time太短而不能够被换入到系统中执行。但事实上该进程很有可能需要马上被执行,比如说
用户打开了一个文档,他不会希望多等上2秒钟。
最后,如果系统中只有一个待换入进程,但它的p_time<3,而且系统中已经没有其他进程在运行了,那么按照新法则,它也不能够
被换入运行,这样系统的CPU就白白浪费了,该进程的实时响应也不太好。
因此,加上新法则,只能在某些特定的情景下(比如系统中有很多优先级高的进程在运行,而最近一段时间内,换入换出操作很多,你有兴趣可以再想想--
事实上就是如何辨别多余/冗余/做无用功的换入换出),能够减少系统换入换出的开销,但在很多时候,它降低了系统的实时性--实时响应!
所以不加该法则既简单在很多时候又适用。
不管怎样,你的问题既尖锐又有启发性,我会考虑在下一版加上这一说明。
谢谢
郝庆丰
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_6
Date: Tue, 18 Oct 2011 21:00:45 +0800
郝先生,
谢谢你的回复。我的看法如下:
对于2,这个不同人有不同的阅读习惯,只要能让读者准确把握到文中的意思就行,我没有异议。
对
于3,我之所以有这样的想法,是因为90页第17~20行的代码里面要找的合适“待换入”进程是“最长时间得不到运行”的就绪进程,而这里面的“最长时
间”却并没有定量(比如说,像后面代码使用到的 3
秒(变量n)的判断),很有可能这个“最长时间”远少于3秒。这就可能造成进程交换过于频繁,而影响到性能。
Steve
From: qf.hao@hotmail.com
To: quntmec@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_6
Date: Mon, 17 Oct 2011 19:45:43 +0800
Steve,
再次非常感谢你的认真阅读和勘误,请见回复如下:
郝庆丰
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_6
Date: Fri, 14 Oct 2011 17:39:24 +0800
郝先生,
目前碰到的疑问如下:
1、数据交换区是否指的是数据段?如果是的,则建议统一术语
参考:
(1)75页第一行,p_addr的解释。
(2)92页最后一行 至 93页第一行(关于第86、87行代码的注释)
(3)94页图5-11里“计算换入进程pl所需的空间大小(数据段+程序段)”
郝:否,数据交换区更大,它包含了数据段,但还包含u变量,内核栈段和用户栈段。
请参见图5-6
2、对于90页的sched():
(1)选择“待换入”进程:第17~21行代码
(2)选择“待换出”进程:有2处,分别是第42~44行,第54~58行
如果上面(1)和(2)没理解错的话,那疑问如下:
(1)93页第5段第1行,“如果没有找到所需要的换入进程.....”,这里的“换入进程”是否应该为“待换出进程”?感觉
这里指的是第42~43行代码
郝:可以,但我觉得它们实际上是从不同角度描述这个事情。”换入“是现在的状态,”待换出“是将要执行的动作,也就是目的。
上面一句话完整地其实可以这样”如果没有找到所需要的换入进程来换出“,但就很罗嗦了,其实就相当于”如果没有找到所需要的待换出进程“
不知你的看法如何。
(2)93页第5段第4行,“如果换出进程过于“年轻”.....”,这里的“换出进程”是否为“待换入进程”?感觉这里指的是
第17~21行代码
(3)93页第6段第1行,“如果换出进程的“年龄”....”,这里的“换出进程”是否应为“待换入进程”?感觉这里指的是
第17~21行代码
3、这是个探讨性的问题:91页代码第51~52行,感觉也应同时放在第36行与第37行之间........
郝:我有点困惑,能说说你的理由吗?4、勘误
89 |
2 |
1 |
第26行应为第29行 |
89 |
3 |
1 |
第27行应为第30行 |
89 |
4 |
2 |
第4段下面的代码少了=。如:int swplo 4000 应为 int swplo = 4000。对于nswap也一样 |
89 |
10 |
1 |
第43行应为第42行 |
郝:除了第3个,其他都对。第3个我也有点困惑,但原代码如此,可能是老的C语法吧。
Steve
《返璞归真--UNIX技术内幕》
阅读(4746) | 评论(0) | 转发(0) |