Linux下进程间通信方式——信号量
信号量(Semaphore)本质上是一个计数器 用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。
- 临界资源:具有排他性的资源
- 临界区:访问临界资源的代码段
互斥访问
操作系统的P操作就是上锁,V操作就是解锁
上锁
上锁(){
计数器--
if(计数器<0){
进入阻塞状态
放入阻塞队列
}
}
解锁
解锁(){
计数器++
if(计数器<=){
唤醒阻塞队列
}
}
二元信号量
二元信号量(Binary Semaphore)是最简单的一种锁(互斥锁),它只用两种状态:占用与非占用。所以它的引用计数为1。
进程如何获得共享资源
- 测试控制该资源的信号量
- 信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位
- 若此时信号量的值为0,则进程进入挂起状态(进程状态改变),直到信号量的值大于0,若进程被唤醒则返回至第一步。
注:信号量通过同步与互斥保证访问资源的一致性