转自:http://blog.csdn.net/lixiaojie1012/article/details/23708377
信号量是一种睡眠锁,也就是说我调用了获取信号量的接口,但是这个时候信号量获取不到,那么对应的任务就会睡眠,从而让出cpu运行其他程序;一旦有人释放的信号量,都会重新出发任务调度,能获取到信号量的任务就会得到机会执行。上节中所说的自旋锁是非睡眠锁,他会一直占有CPU直到获取到对应的锁。
1、计数信号量
计数信号量创建时,资源可以设置为大于1,这个时候就可以有多个任务获取到信号量从而得到访问资源的机会;举个例子,银行有5个业务窗口,这就好比值为5的信号量,这个时候可以有5个人可以同时得到服务,第6个往后就得等待信号量的释放了,直到有人办完业务(释放信号量),他才能去办理业务(访问资源);
2、二值信号量
如果计数信号量的值为1,那么就是二值信号量了,他可以用来做同步,也可以用来做互斥;
作为同步使用时,通常是中断和任务搭配完成的,任务一般是一个死循环,最开始是一个down信号量的操作,通常情况下任务会卡在此处,当配对的中断到来时,也就意味着任务到了运行的时机,这个时候中断上下文中会释放一个信号量,中断上下文退出时,任务就会被调度到执行。
此外,内核中还有一种同步方法叫完成变量;对应的接口分别是wait_for_completion()和complete(),主要使用在一个任务发出信号通知另一任务发生了某个特定事件,从而使两个任务得到同步;等待方调用wait_for_completion(),通知方调用complete(),函数声明在<linux/completion.h>中,感兴趣的同学可以去看一下具体实现。