资源描述:
《linux内核信号量分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第4卷第3期西安外事学院学报No13,20082008年9月JournalofXipanInternationalUniversitySerialNo112Linux内核信号量分析王亚军(中国人民武装警察部队学院计算机教研室,河北廊坊065000)摘要:信号量机制是Linux内核对于访问同一个临界区的多个进程进行同步的有效手段。在深入分析内核信号量操作源代码的基础上,阐述了这种进程同步机制在内核中的实现,并基于嵌入式应用对其中存在的优先级倒转问题作进一步剖析。关键词:信号量;临界区;优先级倒转中图分类号:TP3文献标识码:A文章编号:(2008)03-0100-
2、05问题作具体剖析。一、引论二、Linux内核信号量操作代码分析一般来说,信号量是操作系统内核对访问共享在Linux-216110内核中,内核信号量的数据资源的多个进程进行同步的一种手段。Linux内核结构类型是在includePasm-i386Psemaphore1h中定提供了两种类型的信号量:一种是由内核来支持,义的:在系统空间实现的,供用户进程在用户空间使用的structsemaphore{“用户空间信号量”;另一种是由内核提供的,供内atomic-tcount;核自身在系统空间使用的“内核信号量”,本文旨在分析这种信号量。intsleepers;wait
3、-queue-head-twait;Linux内核信号量又分为两种,一种是互斥信号量,这种信号量在一个时刻仅允许一个持有者,};即使用者计数为1,从而强制多个进程对临界区进其中的成员wait就是等待进入临界区的进程链行互斥访问;另一种是计数信号量,这种信号量的表头。可以通过下面的方式静态地声明一个信号量使用者计数可以大于1,即同一时刻允许有两个或(计数信号量或互斥信号量):两个以上的进程访问临界区。如果一个进程试图获static-DECLARE-SEMAPHORE-GENERIC得一个已经被占用的信号量,该进程就可能会被推(name,count);进一个等待队列
4、进入“睡眠”状态,从而释放处理其中name是信号量变量名,而count是使用者数器,使处理器可以执行其他进程的代码。当持有信量,当count值大于1时,该信号量就是计数信号量。号量的进程释放信号量以后,在等待队列中睡眠的创建互斥信号量还可以使用下面地快捷方式之一:进程可能被唤醒,并试图获得该信号量以进入临界staticDECLARE-MUTEX(name);P3name1count区。下面首先以Linux-216110内核为例分析内核初值为13P中运用信号量实现进程同步机制的源代码,然后结staticDECLARE-MUTEX-LOCKED(name);P3合嵌
5、入式应用对信号量的使用中存在的优先级倒转name1count初值为03P收稿日期:2008-07-15作者简介:王亚军(1978-),男,黑龙江绥化市人,中国人民武装警察部队学院计算机教研室讲师,研究方向为嵌入式Linux系统设计。1002008年第3期(总第12期)王亚军:Linux内核信号量分析两者用途不同,但都是通过前面的宏定义--}DECLARE-SEMAPHORE-GENERIC()来实现的。对从函数--down()代码中可以看见进程进入休信号量的down()和up()等操作函数也是在同一文眠和唤醒后的工作过程:件中定义的,函数头如下:(1)进程先调用
6、DECLARE-WAITQUEUE()创建staticinlinevoiddown(structsemaphore3sem)一个等待队列的项wait,该项结构中的成员指针staticinlinevoidup(structsemaphore3sem)wait1task指向这个进程的控制块结构tsk->task-其中down()操作的主要作用是先使sem->struct。count减1,减了以后的结果若为0或大于0,表明当(2)进程将自己的运行状态修改为“睡眠”状态。前进程可以进入临界区,则down()操作结束;减了(3)进程调用add-wait-queue-exc
7、lusive-locked以后的结果若为负数,表明进程不能进入临界区,则()先将代表该进程的等待项wait中的成员wait1flags进程在down()操作中调用-down-failed()进入深度的标志位WQ-FLAG-EXCLUSIVE设置成1,然后把睡眠状态。函数-down-failed()以及有关的代码在自己加入到等待队列的尾部。archPi386PkernelPsemaphore1c中,该函数的主要目的(4)在for循环中,进程再次判断自己是否可以在于调用另一个关键函数--down(),代码如下:进入临界区,如果可以,那么循环会退出,进程不会错误地进入
8、休眠状态;如果不可以进入