什么是信号量
信号量主要保护共享资源的,确保该资源在同一时刻只有一个线程占用。
换句话说它就是控制多进程(多线程)共同访问共享资源的一种手段。
信号量的定义
最初的定义:信号量是一个特殊的变量,它只能取正整数值,并且程序对其访问都是原子操作。
正式的定义:它是一个特殊的变量,只允许对它进行等待和发送信号。
信号量就是一种特殊的计数器
当其值>0时,其表示可用临界资源的个数
当其值<0,表示资源忙,至少有一个线程在等待。
信号量工作原理
先看计数器计数的方式:
自增型:开始计数为0,来一个自增1,走一个自减1,到计数最大值不允许再来
自减型:开始计数 就是最大值,来一个自减1,走一个自增1,计数到0不允许再来
信号量采用的是自减型,这里说下我个人的理解:(MAX为最大值)
1)我们一般关心资源占用完了没,而不是这个资源一共可以被几个进程占用。所以我们关心的是什么时候不允许再来。
显然自减型判断是否为0更为方便。
我们可以用公共停车场来解释
公共停车场 :信号量控制访问的临界资源的个数
车位:临界资源
想要停车的车辆:想要访问临界资源的线程
计数器:信号量
此刻停车场共有4个停车位,3个停车位分别被车D ,车F,车E占用了,还剩下车位4此刻没被占用。
理解为:信号量管理了4个临界资源,
三个临界资源此刻被占用了,一个没被占用。。
现在车A 车B 车C都想进去停车,但是车位只剩下一个。出现了一种“竞态”,谁先抢到计数器发的停车卡谁就可以进去。
进程A 进程B 进程C 同时想对信号量进行P操作,这一步是原子操作,谁先操作成功就可以进入临界区访问临界资源,其中一个进程完成了p操作后,其他两个进程会被挂起,存放入等待队列中,当信号量又>0时,排在前面的那个进程又会被唤醒,又进行p操作。
信号量分类
1)内核信号量,由内核控制路径使用
2)
用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEM
V信号量。
POSIX信号量又分为有名信号量和无名信号量。
POSIX信号量又分为有名信号量和无名信号量。