信号量
信号量(semaphore)是一种用于提供不同进程之间或者一个给定的不同线程间同步手段的原语。信号量多用于进程间的同步与互斥。
原理
当有进程要求使用共享资源时,需要执行以下操作:
1.系统首先要检测该资源的信号量;
2.若该资源的信号量值大于0,则进程可以使用该资源,此时进程对该信号量执行P操作(wait()) ,将该资源的信号量值减1;
3.若该资源的信号量值为0,表明所有资源都在使用中,则进程进入阻塞状态,直到信号量值大于0时进程被唤醒,访问该资源。阻塞操作将一个进程放到与信号量相关的等待队列中,并且将该进程状态切换成等待状态。
4.当进程释放共享资源时,对该信号量执行V操作(signal()),将信号量值增加1,如果此时有进程处于休眠状态等待此信号量,则等待进程会被唤醒。
5.信号量操作应原子执行。即对同一信号量,没有两个进程可以同时执行操作P操作和V操作。这是一个临界区问题。
分类
Linux提供两种信号量:
(1)内核信号量,由内核控制路径使用;
(2)用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEM V信号量。
POS