Linux操作系统源代码详细分析
日期:2007年10月4日 作者: 查看:[大字体 中字体 小字体]-
这样就会引起语法错误—else和任何一个if都不匹配。FREE3从本质上讲也存在同样的问题。而且在研究问题产生原因的同时,就能够明白为什么宏体里是否包含if是无关紧要的。不管宏体内部内容如何,只要使用一组括号来指定宏体,就会碰到相同的问题。
引入do/while(0)技巧能够克服前面所出现的所有问题,现在我们可以编写FREE4。
将FREE4和其他宏一样插入相同代码之后,这段代码当然可以正确执行。编译器能够优化这个伪循环,舍弃循环控制,因此执行代码并没有速度的损失,我们也从而得到了能够实现理想功能的宏。
虽然这是一个可以接受的解决方案,但是我们不能不提到的是编写函数要比编写宏好得多。不过如果你不能提供函数调用所需的开销,那么就需要使用内联函数。这种情况虽然在内核中经常出现,但是在其他地方就要少得多。(不可否认,当使用C++、gcc或者任何实现了将要出现的修正版ISO标准C的编译器时,这种方案只是一种选择,就是最后为C增加内联函数。)
3. __wait_event
16824:__wait_event使当前进程在等待队列wq中等待,直至condition为真。
16829:通过调用add_wait_queue(16791行),局部变量__wait可以被链接到队列上。注意__wait是在堆栈中而不是在内核堆中分配空间,这是内核中常用的一种技巧。在宏运行结束之前,__wait就已经被从等待队列中移走了,因此等待队列中指向它的指针总是有效的。
16830:重复分配CPU给另一个进程直至条件满足,这一点将在下面几节中讨论。
16831:进程被置为TASK_UNINTERRUPTIBLE状态(16190行)。这意味着进程处于休眠状态,不应被唤醒,即使是信号也不能打断该进程的休眠。信号在第6章中介绍,而进程状态则在第7章中介绍。
16832:如果条件已经满足,则可以退出循环。
请注意如果在第一次循环时条件就已经满足,那么前面一行的赋值就浪费了(因为在循环结束之后进程状态会立刻被再次赋值)。__wait_event假定宏开始执行时条件还没有得到满足。而且,这种对进程状态变量state的延迟赋值也并没有什么害处。在某些特殊情况下,这种方法还十分有益。例如当__wait_event开始执行时条件为假,但是在执行到16832行时就为真了。这种变化只有在为有关进程状态的代码计算condition变量值时才会出现问题。但是在代码中这种情况我没有发现。
16834:调用schedule(26686行,在第7章中讨论)将CPU转移给另一个进程。直到进程再次获得CPU时,对schedule的调用才会返回。这种情况只有当等待队列中的进程被唤醒时才会发生。
16836:进程已经退出了,因此条件必定已经得到了满足。进程重置TASK_RUNNING的状态(16188行),使其适合CPU运行。
16837:通过调用remove_wait_queue(16814行)将进程从等待队列中移去。wait_event_interruptible和__wait_event_interruptible(分别参见16868行和16847)基本上与wait_event和__wait_event相同,但不同的是它们允许休眠的进程可以被信号中断。信号将在第6章中介绍。
请注意wait_event是被如下结构所包含的。
和do/while(0)技巧一样,这样可以使被封闭起来的代码能够像一个单元一样运行。这样的封闭代码就是一个独立的表达式,而不是一个独立的语句。也就是说,它可以求值以供其他更复杂的表达式使用。发生这种情况的原因主要在于一些不可移植的gcc特有代码的存在。通过使用这类技巧,一个程序块中的最后一个表达式的值将定义为整个程序块的最终值。当在表达式中使用wait_event_interruptible时,执行宏体后赋__ret的值为宏体的值(参见16873行)。对于有Lisp背景知识的程序员来说,这是个很常见的概念。但是如果你仅仅了解一点C和其他一些相关的过程性程序设计语言,你可能就会觉得比较奇怪。
__wake_up
26829:该函数用来唤醒等待队列中正在休眠的进程。它由wake_up和wake_up_ interruptible调用(请分别参见16612行和16614行)。这些宏提供mode参数,只有状态满足mode所包含的状态之一的进程才可能被唤醒。
- 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
-
- Linux操作系统源代码详细分析 相关文章:
- ·魔法门7 攻略解析
- ·校园网网络方案设计及分析
- ·计算机一级B考试试题分析
- ·Linux操作系统源代码详细分析
- ·联讯证券同花顺软件分析系统使用
- ·ORACLE UPDATE 语句语法与性能分析的一点看法
- ·经典爱情格言爱情名句赏析
- ·网站推广计划的一个案例分析
- ·网络术语解析-ICS
- ·UML业务建模实例分析
- Linux操作系统源代码详细分析 相关软件
- ·龙卷风基金投资分析系统
- ·同花顺证券行情分析软件(同花顺)2007 V4.40.12
- ·大智慧level2行情分析系统 V2.1
- ·大福星行情分析系统 V1.52
- ·大智慧新一代高速行情分析系统(Internet) V2.05.07.0208
- ·木马分析专家2007V9.49 Build 1226
- ·科来网络分析系统 V6.5
- ·股赢天下股票证券分析系统 V1.9 Beta1
- ·和讯股道实时行情分析系统 普及版
- ·长江证券分析软件 普通版 V4.30.59
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
下一篇:linux下安装软件的办法
精品推荐
热点TOP10
- ·什么是MIS
- ·BIOS知识大全
- ·Linux操作系统源代码详细分析
- ·Linux学习手册
- ·linux知识大全
- ·Vi命令一览表
- ·Linux/Unix环境下的make命令详解
- ·Linux循序渐进(19):shell
- ·LINUX 常见问题1000个详细解答
- ·RPM命令大全
- ·Linux中QQ的配置
- ·Linux主要shell命令详解
- ·最新linux iso光盘下载点
- ·常见端口表汇总
- ·Linux发行版图标大全
- ·linux内核编译详解
- ·Linux From Scratch安装学习笔记
- ·万能声卡驱动(Alsa)的安装方法
- ·Linux下用pptp连接VPN服务器
- ·Bourne shell编程入门及脚本测试
特别推荐
- ·BIOS知识大全
- ·如何编写Linux设备驱动程序
- ·Linux管理工具介绍
- ·Linux操作系统源代码详细分析
- ·Linux下用pptp连接VPN服务器
- ·在linux7.1上安装jdk+tomcat+oracle9i笔记
- ·Linux学习手册
- ·学习Linux的八点忠告
- ·深入分析Linux防火墙
- ·UNIX系统后门的安放和日志的擦除
- ·揭开Expect的神秘面纱
- ·万能声卡驱动(Alsa)的安装方法
- ·长篇连载--arm linux演艺---序
- ·为CanonPIXMAiP1000喷墨打印机安装驱动程序
- ·详细讲解Linux系统下ADSL拨号上网方法
- ·使用ImageMagick 的提示与技巧
- ·轻松实现 Linux系统下互联网过滤功能
- ·Linux下一些故障现象以及解决的相关资源
- ·重安装gentoo 2005.1 for AMD64版经验
- ·Linux/Unix环境下的make命令详解
