持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
什么是信号量?
在我的理解中,信号量其实就是一个特殊变量,当一个进程在某一个特殊点上被迫停止执行直到接收到一个特殊变量时,通过这个特殊变量,任何复杂的进程交互都能够得到满足。
关于信号量的组成
信号量本质上是一种变量类型,它有两个分量,一个是信号量的值,一个是信号量队列的队列指针。对于信号量,除了赋初始值外,信号量只能由同步原语对其进行操作,没有任何其他方法可以检查和操作信号量。原语是一种原子操作,即不可分割,原语的执行必须是连续的。
信号量是如何分类的呢?
整型信号量(integer semaphore):信号量是整数
记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识
二进制信号量(binary semaphore):只允许信号量取0或1值。
信号量如何操作
荷兰著名的计算机科学家Dijkstra 发明了两个信号量操作原语:P 操作和V操作,(wait 和 signal)。利用信号量和PV操作可以解决并发进程的竞争问题,也能够解决并发进程的协作问题。 p原语所执行的操作可以用函数wait(S)来表示:
void wait(semaphore S)
{
S.value--;
if S.value<0
{
Block(S.squeue);
}
}
V 原语所执行的操作可用函数signal(S)来表示:
void signal(semaphore S)
{
S.value=S.value+1;
if( S.value<=0)
wakeup(S.value);
}
信号量的物理意义
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。 以上就是我关于信号量和PV操作的理解,信号量其实就是一个纪录型数据结构。