信号量就是代码世界里的红绿灯,没有它,许多代码横冲直撞必将导致严重的“车祸”。
拓展:
LINUX中可能用到的信号量有3种:
- Ststem-V信号量
- POSIX有名信号量
- POSIX无名信号量
他们虽然有很多显著不同的地方,但是最基本的功能室一致的:用来表征一种资源的数量,当多个进程或者线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源,而不会陷入逻辑谬误之中。
System-V的信号量非常类似于停车场的卡牌,想象一个有N个车位的停车场,每个车位是立体的可升降的,能停n辆车,那么我们可以用一个拥有N个信号量元素,每个信号量元素的初始值等于n的信号量来代表这个停车场的车位资源——某位车主要把他的m辆车开进停车场,如果需要1个车位,那么必须对代表这个车位的信号量元素申请资源,如果n大于等于m,则申请成功,否则不能把车开进去。
从这个比喻中得知:System-V的信号量并不是单个的值,而是一组(事实上是一个数组)信号量元素构成的,当我们需要多个资源,比如多个车位时,可以同时向多个信号量元素申请。
信号量的P、V操作最核心的特征是:他们是原子性的,也就是说对信号量元素的值的增加和减少,系统保证在CPU的电气特性级别上不可分割,这跟整型数据的加减法有本质的区别。