Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938161
  • 博文数量: 77
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2491
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(77)

文章存档

2023年(1)

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类: 系统运维

2012-04-07 11:46:45

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技术内幕》
阅读(4620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~