欢迎来到天天文库
浏览记录
ID:40781023
大小:166.00 KB
页数:30页
时间:2019-08-07
《信号量,中断和时间》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、c526f1e39b0183e87e1993bc1ef2095f.doc第6章信号量,中断和时间信号量(Signal)是进程间通讯(IPC)的一种形式——是一个进程给另一个进程发送信息的方法。但是信息不可能很多——一个信号量不可能携带详细的信息,即使是传送者的身份也不能被传递;唯一能够确定的事实是信号量的确被发送了。(然而和经典信号量不同,POSIX实时信号量允许传送稍微多一点的信息。)实际上,信号量对于双向通讯是没有用处的。还有,根据某些限定,信号量的接受者不必以任何方式作出响应,甚至可以直接忽略大部分信号量。虽然有这么多的限制,然而信号量仍然是一种功能强大的十分有用的机制——
2、勿庸置疑,这是UnixIPC中使用最频繁的机制。每当进程退出或者废弃一个空指针时,每当使用Ctrl+C键终止程序运行时,都要传递信号量。第9章会更详细的讨论IPC机制。对于本章的讨论来说,信号量的内容就足够讨论了。正如在Linux内核本身的代码注释中所说明的一样,中断(Interrupt)对于内核来说和信号量是类似的。中断一般都是从磁盘之类的硬件设备送往内核,用以提示内核该设备需要加以注意。一个重要的硬件中断源就是定时器设备,它周期性地通知内核已经通过的时间。如同第5章中阐述的一样,中断也可以由用户进程通过软件产生。在本章中,我们首先讨论一下Linux中信号量和中断的实现,最后再
3、浏览一下Linux的时间处理方式。虽然内核对代码的要求标准非常严格,本章所涉及的代码仍然特别清晰明白。本章使用的一般方法是首先介绍相关的数据结构和它们之间的关系,接下来讨论操纵和查询它们的函数。锁的概述锁的基本思想是限制对共享资源的访问——共享资源包括共享的文件,共享的内存片,以及在一次只能由一个CPU执行的代码段。概括的说,在单处理器上运行的Linux内核并不需要锁,这是因为在编写Linux内核时就已经注意到要尽量避免各种可能需要锁的情况了。但是,在多处理器机器上,一个处理器有时需要防止其它处理器对它的有害的介入。include/asm-i386/spinlock.h文件(从1
4、2582行开始)并不使用难看的#ifdef把所有对锁函数的调用封装起来,它包含一系列对单处理器平台(UP)基本为空的宏,然而在多处理器平台(SMP)上这些宏将展开成为实际代码。因而内核的其它代码对UP和SMP(当涉及到这种特性时)都是相同的,但是它们两个的效果却是迥然不同的。第10章中涉及SMP的部分会对锁做深入的介绍。但是,由于你在代码中将到处都能够看到对锁宏的调用,特别是在本章所讨论到的代码中这一点尤为明显,所以你应该首先对宏的用途有初步了解——以及为什么现在在大多数情况下我们都可以安全地将其忽略(我们将在讨论的过程中对其中的异常情况进行说明)。信号量Linux内核将信号量分
5、为两类:l非实时的(Nonrealtime)——大部分是些传统的信号量,例如SIGSEGV,SIGHUP81--c526f1e39b0183e87e1993bc1ef2095f.doc和SIGKILL。l实时的(realtime)——由POSIX1003.1b标准规定,它们同非实时信号量有细微的区别。特别是实时信号量具有进程可以配置的意义——就像是非实时信号量SIGUSR1和SIGUSR2一样——额外的信息能够和这些信号量一起传送。它们也会排队,因此如果在第一个信号量处理完成之前有多个信号量实例到达,所有的信号量都能够被正确传送;这对于非实时信号量则是不可能的。在第7章中我们将会
6、对实时性对于Linux内核的意义进行更详细的介绍——特别是实时性所不能够说明的内容。信号量数目的宏定义从12048行开始。实时信号量的数目在SIGRTMIN和SIGRTMAX(分别在12087行和12088行)所定义的范围之内。数据结构本节讨论信号量代码使用的最重要的数据结构。sigset_t12035:sigset_t表示信号量的集合。根据使用地点的不同,它的意思也不同——例如,它可能记录着正在等待某一个进程的信号量(如16425行structtask_struct的signal成员)的集合,也可能是某个进程已经请求阻塞了的信号量(如同一行中定义的同一结构的blocked成员)
7、的集合。随着本书的进行,我们会逐渐看到这些类似的应用。12036:sigset_t的唯一一个组成部分是一组unsignedlong(无符号长整型数),其中的每一位都代表一个信号量。注意到无符号长整型类型在整个内核代码中是作为一个字来处理的,这和你所希望的可能有所出入——即使是在当前x86CPU的讨论中,有时候字也被用于说明16位类型。由于Linux是一个真32位操作系统,将32位看作是一个字在绝大多数情况下是正确的。(将Linux称为真32位操作系统也有一些不准确,因为在64位C
此文档下载收益归作者所有