- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信号量、互斥体和自旋锁
分类: 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-- ,以确保别的进程能否获得该信号量,然后函数返
回,其调用者开
您可能关注的文档
- 第八章 客户端虚拟化技术.pdf
- 第十一章 多用户多房间Tcp聊天Python.doc
- 用户在声明类时可以不定义构造函数资料.docx
- 用友财务软件初始化以及日常流程——适用于各个版本资料.doc
- UML系统建模和分析设计课后习题答案.doc
- 试谈当前农村小学的文化缺失和重构.doc
- 引文前为什么不用冒号摘要.doc
- 夏令营活动小游戏讲述.doc
- 三菱可编程特殊继电器及特殊寄存器.doc
- 第五章 市场细分广告.doc
- Unit 6 Get Close to Nauture Lesson 22 -课件-2025-2026学年度北京版英语四年级上册.pptx
- Unit 7 Be Together Lesson 23 -课件-2025-2026学年度北京版英语四年级上册.pptx
- 2025食品饮料行业AI转型白皮书-2025食品饮料行业数智化转型领先实践.pdf
- Unit 7 Be Together Lesson 24 -课件-2025-2026学年度北京版英语四年级上册.pptx
- Unit 7 Be Together Lesson 25 -课件-2025-2026学年度北京版英语四年级上册.pptx
- Unit 7 Be Together Lesson 26 -课件-2025-2026学年度北京版英语四年级上册.pptx
- 2025年广州体育职业技术学院单招职业倾向性考试题库完美版.docx
- 软件公司员工考勤异常处理.doc
- 2025年土地登记代理人之土地登记相关法律知识题库500道及完整答案【有一套】.docx
- 2025年四平职业大学单招职业适应性考试题库含答案.docx
最近下载
- 深入贯彻中央八项规定精神学习教育知识测试题库(含答案)_可搜索.pdf VIP
- 飞行控制系统(FCS)系列:Honeywell Primus Epic_(5).自动飞行控制功能.docx VIP
- 瘦终端thinos安装使用手册.pdf VIP
- 飞行控制系统(FCS)系列:Honeywell Primus Epic_(8).飞行仪表显示与界面.docx VIP
- 施工升降机拆除作业安全技术交底完整版.doc VIP
- 《脑淀粉样血管病》课件 .ppt VIP
- 飞行控制系统(FCS)系列:Honeywell Primus Epic_(12).安全与合规性要求.docx VIP
- 雕塑艺术行业发展预测分析.docx
- 新员工三级安全培训考试试题(含答案).docx VIP
- 高中新教材历史选择性必修一课件单元整合.pptx VIP
文档评论(0)