欢迎来到天天文库
浏览记录
ID:27538823
大小:224.83 KB
页数:18页
时间:2018-12-04
《linux之信号量,比较全面,个人总结》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、信号量什么是信号量信号量的使川主要是川来保护井享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的位为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。二.信号量的分类在学习信号量之前,我们必须先知道一一Linux提供两种信号量:(1)内核信号量,由内核控制路径使用(2)用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEMV信号量。POSIX信号量又分为有名信号量和无名信号量。有名信号量,其值保存在文件中,所以它可以用于线程也可
2、以用于进程间的同步。无名信号量,其值保存在内存中。倘若对信号M没有以上的全而认识的话,你就会很快发现自己在信号S:的森林里迷失了方向。三.内核信号量1.内核信号量的构成内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。然而,当内核控制路径试图获取内核信号量锁保护的忙资源吋,相应的进程就被挂起。只有在资源被释放时,进程才再次变为可运行。只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。内核信号量是structsemaphore类型的对象,它在〈asm/semapho
3、re.hM1定义:structsemaphore{atomictcount;intsleepers;wait_queue_head_twait;}count:相当于信号S的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠。1.内核信号量中的等待队列(删除,没有联系)上而已经提到了内核信号量使用了等待队列wait.
4、queue来实现阻塞操作。当某任务由于没有某种条件没有得到满足时,它就被挂到等待队列中睡眠。当条件得到满足吋,该任务就被移出等待队列,此吋并不意味着该任务就被马上执行,因为它又被移进工作队列中等待CPU资源,在适当的时机被调度。内核信号量是在内部使用等待队列的,也就是说该等待队列对用户是隐藏的,无须用户干涉。巾用户真正使用的等待队列我们将在另外的篇章进行详解。2.内核信号量的相关函数(1)初始化:voidsema_init(structsemaphore*sem,intval);voidinit_MUTEX(struc
5、tsemaphore*sem);//将sem的值置为1,表示资源空闲voidinitMUTEXLOCKED(structsemaphore*sem);//将sem的值罝为0,表示资源忙(2)申请内核信号量所保护的资源:voiddown(structsemaphore*sem);//可引起睡眠intdown_interruptible(structsemaphore*sem);//down_interruptible能被信号fj•断intdown_trylock(structsemaphore*sem);//非阻塞函数,
6、不会睡眠。无法锁定资源则马上返回(3)释放内核信号量所保护的资源:voidup(structsemaphore*sem);3.内核信号量的使用例程在驱动程序巾,当多个线程同时访问相同的资源时(驱动巾的全局变量时一种典型的共享资源),可能会引发“竞态“,因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号S(绝大多数时候作为互斥锁使用)。ssize_tglobcilvar_write($tructfile*filp,constchar*buf,size_tlen,loff_t*off
7、){//获得信号量if(down_inteiTLiptible(&sem)){return-ERESTARTSYS;}//将用户空间的数裾复制到内核空间的global.varif(copy_from_u$er(&global_var,buf,$izeof(int))){up(&sem);return-EFAULT;}//释放信号量up(&sem);returnsizeof(int);}U!POSIX信号量与SYSTEMV信号量的比较1.对POSIX来说,信号釐是个非负整数。常用于线程间同步。而SYSTEMV信号量则是一
8、个或多个信号量的集合,它对应的是一个信号量结构体,这个结构体是为SYSTEMVIPC服务的,信号量只不过是它的•-部分。常用于进程间同步。2.POSIX信号量的引用头文件是“〈semaphore.h〉”,而SYSTEMV信号量的引用头文件是“
此文档下载收益归作者所有