From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_7
Date: Sat, 15 Oct 2011 12:48:06 +0800
郝先生,
75页第3段的p_wchan,该字段在73页的结构体定义里是定义为int
的,即16位整数。参看95页的sleep()和96页的wake()后,感觉 p_wchan 里记录的应该是一个地址,即类似 &runin
或 &runou。建议书中提到的有关chan时,是否可将“锁变量”改为“锁变量地址”更为合适?
这里并非咬文嚼字,而是我
被这个问题困了一个早上。在之前的理解里,一直认为chan是类似0,1,2,3等的数值,因而百思不得其解:在sleep()里的14~17行代码里,
在wakeup()调用前,“竟然”将runin置0(那后面wakeup()里的do循环比较(wakeup()第9行)就显得没有意义了)!后来反复
仔细阅读代码才发现 p_wchan
里记录的应该是一个地址。我不太了解其他读者是否也会碰到这样的问题,但还是建议在这部分提示一下读者会比较好(不一定像上面提到的改为“所变量地址”,
采用其他方式提示也行)。
郝:你的建议有道理,虽不一定要改成锁变量地址,因为这里p_wchan本身是个变量,当然它记录的是一个地址,但地址从广义上讲也是一个变量不是吗。其实主要还是考虑习惯性,因为一般书上都是锁变量。我再考虑如何写的更明白。
此外,关于p_wchan,我还有一些疑问,如下:
sleep()
和wakeup()等应该是存放在UNIX的内核空间里的,包括 runin 和 runout
也应该是这样的(是吗?)。也就是说,对于任何进程而言,runin 和 runout
的地址是一样的。那是否可以这样认为,wakeup(&runin)的作用是将sleep在 runin
上的所有进程(不管runin的值是多少,反正 &runin 是一样的)都唤醒?
郝:对。如
果是的话,那到目前为止,我在书中只碰到2个锁变量: runin 和
runout(不知道还有没有其他锁变量?)如果没有其他锁变量的话,那是否每次调用 wakeup()所实现的无非就是“要不就是唤醒所有sleep在
&runin 上的进程”,“要不就是唤醒所有sleep在 &runout 上的进程”?
郝:还有很多,比如runrun,
另外请参照第8章文件系统。最后,勘误如下:
页 |
段 |
行 |
内容 |
98 |
|
|
wakeup(chan)里do循环里 setrun(p)这句中少了一个e,即原文为:s
trun(p); |
郝:对。谢谢。Steve
《返璞归真--UNIX技术内幕》
阅读(4658) | 评论(0) | 转发(0) |