信号量、互斥体与自旋锁.pdf

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信号量、互斥体和自旋锁 分类: linux 系统 linux 驱动2014-02-20 11:06 83人阅读 评论(0) 收藏举报 一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共 享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享 内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2 ) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3 ) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大 于0,进程被唤醒,转入步骤(1)。 (4 ) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正 在睡眠等待此信号量,则唤醒此进程。 维护信号量状态的是Linux 内核操作系统而不是用户进程。我们可以从头文件 /usr/src/linux/include/linux/sem.h 中看到内核用来维护信号量状态的各个结构的定义。信号 量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是 semget ,用以获得一个信号量ID。Linux2.6.26下定义的信号量结构体: struct semaphore { spinlock_t lock; unsigned int count; struct list_head wait_list; }; 从以上信号量的定义中,可以看到信号量底层使用到了spin lock 的锁定机制,这个spinlock 主要用来确保对count 成员的原子性的操作(count--)和测试(count 0)。 1.信号量的P 操作: (1).void down(struct semaphore *sem); (2).int down_interruptible(struct semaphore *sem); (3).int down_trylock(struct semaphore *sem); 说明: (1)中的函数根据2.6.26 中的代码注释,这个函数已经out 了(Use of this function is deprecated) ,所以从实用角度,彻底忘了它吧。 (2)最常用,函数原型 /** * down_interruptible - acquirethe semaphore unless interrupted * @sem: the semaphore to beacquired * * Attempts to acquire thesemaphore. If no more tasks are allowedto * acquire the semaphore,calling this function will put the task to sleep. * If the sleep is interruptedby a signal, this function will return -EINTR. * If the semaphore issuccessfully acquired, this function returns 0. */ int down_interruptible(structsemaphore *sem) { unsigned long flags; int result = 0; spin_lock_irqsave(sem-lock,flags); if (likely(sem-count 0)) sem-count--; else result = __down_interruptible(sem); spin_unlock_irqrestore(sem-lock,flags); return result; } 对此函数的理解:在保证原子操作的前提下,先测试count 是否大于0,如果是说明可以获 得信号量,这种情况下需要先将count-- ,以确保别的进程能否获得该信号量,然后函数返 回,其调用者开

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档