Linux下进程间通信方式——信号量

Posted by A Chang on March 16, 2020

Linux下进程间通信方式——信号量

信号量(Semaphore)本质上是一个计数器 用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

  • 临界资源:具有排他性的资源
  • 临界区:访问临界资源的代码段

互斥访问 

操作系统的P操作就是上锁,V操作就是解锁

上锁

上锁(){
    计数器--
    if(计数器<0){
        进入阻塞状态
        放入阻塞队列
    }
}

解锁

解锁(){
    计数器++
    if(计数器<=){
        唤醒阻塞队列
    }
}

二元信号量

二元信号量(Binary Semaphore)是最简单的一种锁(互斥锁),它只用两种状态:占用与非占用。所以它的引用计数为1。

进程如何获得共享资源

  1. 测试控制该资源的信号量
  2. 信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位
  3. 若此时信号量的值为0,则进程进入挂起状态(进程状态改变),直到信号量的值大于0,若进程被唤醒则返回至第一步。

注:信号量通过同步与互斥保证访问资源的一致性