(二)内核锁的使用之信号量

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

 

1、计数信号量

 

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

 

2、二值信号量

 

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

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

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值