Steve,
请参见答复。
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_13
Date: Thu, 3 Nov 2011 15:10:59 +0800
郝先生,
目前碰到的疑问如下:
1、第169页,第2行下面的表格,对于“shell进程”记录的“p_pri”项,为何为0?我重现再看99~100页的有关 newproc()的代码,也没有发现该项的赋值。
[郝]:就本例而言,shell是系统第一次创建的,那么它确实为0,因为它在系统初始化时被清除为0,具体参见第61页start函数的31~35行,bss段是所有未初始化的全局变量段,
当然也包括proc数组。不过这里确实需要加以说明更好。当然对以后新进程的创建,就不一定为0了。
2、第169页,第7段,第一行:“新优先级=PUSER+p_nice+p_cpu/16=100+0+28/16=101”。其中,p_nice为0,这个不太明白?或者说,p_nice是在哪里被赋值为0的?
[郝]:同上。
3、第170页,第5段,第一行:“....shell进程挂起(挂起优先级=10)....”。我查阅了一下第117页里有关挂起优先级的定义值(第12段下面的6个#define语句),但并未查到有优先级为10的挂起操作.....
[郝]:好发现! 它事实上指TTIPRI,在 第九章 351页下方定义,因为shell是和用户交互的,所以通常情况下它会挂起在字符终端上。下版会加说明。
4、第174页,第2段,第3行:“由于调度进程优先级高于当前运行的shell进程,runrun标记被设...”。这句不太理解?我查了一下相关的代码,但都没有发现这里提到的有关优先级的比较和runrun被设的代码。请问这些代码出现在哪个函数里?
[郝]:clock函数(第153页)。
5、第176页,第2段下面的表格(即本页第3个表格)处,为何进程B的优先级没有被调整?参看第156页,代码60~61,进程B的p_pri应该被调整为100。
[郝]:对,谢谢。
6、第177页,第2段,第一行:“进程B的优先级被调低,这样runrun标志被设.....”。这里是否应该这样理解:
1)第176页,第3段,在进程A的优先级被调低后,call函数调用swtch重新分配CPU。在第104页的swtch函数里的第45行,curpri会被设置成“下一个将要被调度的进程的优先级(即进程B的优先级)”,大小为100.
2)当第60个时钟滴答过后,在clock()函数的第60~61行处会跳转至setpri()函数处,并在这里将进程B的优先级调整为103(即p为103)。则在该函数的第9、10行里设置了runrun。
是这样理解吗?
[郝]:是。
7、第177页,第4段,第一行:“最后swtch函数执行 rts pc 返回时....”,我的问题如下:
1)swtch函数里似乎没有 rts pc 这样的语句,只有 return(1).....
[郝]:就是return,说的是它的汇编码。
2)cret函数是作什么用的?
[郝]:恢复寄存器值,在第2章有说明。
3)r2~r5是如何保存到栈里面的?具体代码出处在哪里?
[郝]:csav,编译器生成代码调的。
此外,勘误如下:
[郝]:检查中。
Steve
请参见答复。
From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_13
Date: Thu, 3 Nov 2011 15:10:59 +0800
郝先生,
目前碰到的疑问如下:
1、第169页,第2行下面的表格,对于“shell进程”记录的“p_pri”项,为何为0?我重现再看99~100页的有关 newproc()的代码,也没有发现该项的赋值。
[郝]:就本例而言,shell是系统第一次创建的,那么它确实为0,因为它在系统初始化时被清除为0,具体参见第61页start函数的31~35行,bss段是所有未初始化的全局变量段,
当然也包括proc数组。不过这里确实需要加以说明更好。当然对以后新进程的创建,就不一定为0了。
2、第169页,第7段,第一行:“新优先级=PUSER+p_nice+p_cpu/16=100+0+28/16=101”。其中,p_nice为0,这个不太明白?或者说,p_nice是在哪里被赋值为0的?
[郝]:同上。
3、第170页,第5段,第一行:“....shell进程挂起(挂起优先级=10)....”。我查阅了一下第117页里有关挂起优先级的定义值(第12段下面的6个#define语句),但并未查到有优先级为10的挂起操作.....
[郝]:好发现! 它事实上指TTIPRI,在 第九章 351页下方定义,因为shell是和用户交互的,所以通常情况下它会挂起在字符终端上。下版会加说明。
4、第174页,第2段,第3行:“由于调度进程优先级高于当前运行的shell进程,runrun标记被设...”。这句不太理解?我查了一下相关的代码,但都没有发现这里提到的有关优先级的比较和runrun被设的代码。请问这些代码出现在哪个函数里?
[郝]:clock函数(第153页)。
5、第176页,第2段下面的表格(即本页第3个表格)处,为何进程B的优先级没有被调整?参看第156页,代码60~61,进程B的p_pri应该被调整为100。
[郝]:对,谢谢。
6、第177页,第2段,第一行:“进程B的优先级被调低,这样runrun标志被设.....”。这里是否应该这样理解:
1)第176页,第3段,在进程A的优先级被调低后,call函数调用swtch重新分配CPU。在第104页的swtch函数里的第45行,curpri会被设置成“下一个将要被调度的进程的优先级(即进程B的优先级)”,大小为100.
2)当第60个时钟滴答过后,在clock()函数的第60~61行处会跳转至setpri()函数处,并在这里将进程B的优先级调整为103(即p为103)。则在该函数的第9、10行里设置了runrun。
是这样理解吗?
[郝]:是。
7、第177页,第4段,第一行:“最后swtch函数执行 rts pc 返回时....”,我的问题如下:
1)swtch函数里似乎没有 rts pc 这样的语句,只有 return(1).....
[郝]:就是return,说的是它的汇编码。
2)cret函数是作什么用的?
[郝]:恢复寄存器值,在第2章有说明。
3)r2~r5是如何保存到栈里面的?具体代码出处在哪里?
[郝]:csav,编译器生成代码调的。
此外,勘误如下:
174 | 2 | 第2段下面的表格(即本页的第2个表格),在“shell进程”记录处,p_cpu的值是50(应为80),p_time为110(应为80)。同理,第3个表格的“shell进程”记录处,p_cpu的值应改为70,p_time为81,p_pri为104;第4个表格的“shell进程”记录处,p_cpu的值应改为70,p_time为81,p_pri为104; | |
177 | 3 | 3 | 否则,如果建立此映射(应改为如果“并未”建立此映射)….. |
177 | 4 | 1 | 图5-12,这个标识应该有问题,但我也不太清楚你要表述的是哪个图(是图6-22吗?) |
178 | 2 | 1 | 图5-12,问题同上 |
[郝]:检查中。
Steve