1053450.doc - - 52 第6 章 信号量,中断和时间 信号量(Signal)是进程间通讯(IPC)的一种形式——是一个进程给另一个进程发送信息的方法。但是信息不可能很多——一个信号量不可能携带详细的信息,即使是传送者的身份也不能被传递;唯一能够确定的事实是信号量的确被发送了。(然而和经典信号量不同,POSIX 实时信号量允许传送稍微多一点的信息。)实际上,信号量对于双向通讯是没有用处的。还有,根据某些限定,信号量的接受者不必以任何方式作出响应,甚至可以直接忽略大部分信号量。 虽然有这么多的限制,然而信号量仍然是一种功能强大的十分有用的机制——勿庸置疑,这是Unix IPC 中使用最频繁的机制。每当进程退出或者废弃一个空指针时,每当使用Ctrl+C 键终止程序运行时,都要传递信号量。 第9 章会更详细的讨论 IPC 机制。对于本章的讨论来说,信号量的内容就足够讨论了。 正如在 Linu x 内核本身的代码注释中所说明的一样,中断(Interru pt)对于内核来说和信号量是类似的。中断一般都是从磁盘之类的硬件设备送往内核,用以提示内核该设备需要加以注意。一个重要的硬件中断源就是定时器设备,它周期性地通知内核已经通过的时间。如同第5 章中阐述的一样,中断也可以由用户进程通过软件产生。 在本章中,我们首先讨论一下 Linu x 中信号量和中断的实现,最后再浏览一下 Linu x 的时间处理方式。 虽然内核对代码的要求标准非常严格,本章所涉及的代码仍然特别清晰明白。本章使用的一般方法是首先介绍相关的数据结构和它们之间的关系,接下来讨论操纵和查询它们的函数。 锁的概述 锁的基本思想是限制对共享资源的访问——共享资源包括共享的文件,共享的内存片,以及在一次只能由一个 CPU 执行的代码段。概括的说,在单处理器上运行的Linu x 内核并不需要锁,这是因为在编写 Linu x 内核时就已经注意到要尽量避免各种可能需要锁的情况了。但是,在多处理器机器上,一个处理器有时需要防止其它处理器对它的有害的介入。 inclu de/asm-i386/spinlock.h 文件(从 12582 行开始)并不使用难看的#ifdef 把所有对锁函数的调用封装起来,它包含一系列对单处理器平台(UP)基本为空的宏,然而在多处理器平台(SMP)上这些宏将展开成为实际代码。因而内核的其它代码对 UP 和SMP(当涉及到这种特性时)都是相同的,但是它们两个的效果却是迥然不同的。 第10 章中涉及 SMP 的部分会对锁做深入的...