博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(二)内核锁的使用之信号量【转】
阅读量:5956 次
发布时间:2019-06-19

本文共 751 字,大约阅读时间需要 2 分钟。

转自:

信号量是一种睡眠锁,也就是说我调用了获取信号量的接口,但是这个时候信号量获取不到,那么对应的任务就会睡眠,从而让出cpu运行其他程序;一旦有人释放的信号量,都会重新出发任务调度,能获取到信号量的任务就会得到机会执行。上节中所说的自旋锁是非睡眠锁,他会一直占有CPU直到获取到对应的锁。

 

1、计数信号量

 

计数信号量创建时,资源可以设置为大于1,这个时候就可以有多个任务获取到信号量从而得到访问资源的机会;举个例子,银行有5个业务窗口,这就好比值为5的信号量,这个时候可以有5个人可以同时得到服务,第6个往后就得等待信号量的释放了,直到有人办完业务(释放信号量),他才能去办理业务(访问资源);

 

2、二值信号量

 

如果计数信号量的值为1,那么就是二值信号量了,他可以用来做同步,也可以用来做互斥;

作为同步使用时,通常是中断和任务搭配完成的,任务一般是一个死循环,最开始是一个down信号量的操作,通常情况下任务会卡在此处,当配对的中断到来时,也就意味着任务到了运行的时机,这个时候中断上下文中会释放一个信号量,中断上下文退出时,任务就会被调度到执行。

 

此外,内核中还有一种同步方法叫完成变量;对应的接口分别是wait_for_completion()和complete(),主要使用在一个任务发出信号通知另一任务发生了某个特定事件,从而使两个任务得到同步;等待方调用wait_for_completion(),通知方调用complete(),函数声明在<linux/completion.h>中,感兴趣的同学可以去看一下具体实现。

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5333663.html,如需转载请自行联系原作者

你可能感兴趣的文章
php用来删除当前目录的函数,PHP删除当前目录及其目录下的所有文件
查看>>
oracle 多个分组函数,oracle之4多行函数之分组函数
查看>>
禅道怎么连接oracle数据库,禅道项目管理系统整合Selenium IDE的思路
查看>>
linux 禁止文件修改时间,linux 修改文件的时间属性
查看>>
x86 linux 根文件系统6,Linux系列六之根文件系统
查看>>
linux下运行brew,安装 Linuxbrew(示例代码)
查看>>
linux下svn安装教程,linux下安装svn的方法
查看>>
linux 删除不需要的软件,怎么查找并删除不常用的软件包呢?
查看>>
linux图形界面sdk,Linux SDK入门指南
查看>>
linux 修改proc目录,Linux_Linux中系统参数修改命令sysctl的使用讲解,sysctl配置与显示在/proc/sys目录 - phpStudy...
查看>>
linux自启动的无关服务,linux 自启动服务 · Nankle
查看>>
telnet linux root登录,CentOS允许telnet通过root用户进行访问
查看>>
linux下yum安装zabbix,yum安装zabbix4.2
查看>>
Linux下qt注册表,解析 Qt 4.7.0 SDK for Windows 安装后注册表中选项
查看>>
国际学院c语言作业,C语言程序的国际化
查看>>
四阶龙格库塔法c语言程序,四阶龙格库塔法C语言(西安交大)
查看>>
c语言中无windows函数库,关于C语言, GCC/MSVC中,如何写出一个真正意义上的不依赖库的程序?...
查看>>
c语言中break可以用在swift,我可以在Swift中的if语句中使用范围运算符吗?
查看>>
c语言期末考试题库大题及详解答案,C语言期末复习题答案.doc
查看>>
欧洲语言框架A1到C2,法语等级 A1、A2、B1、B2、C1、C2
查看>>