前言:学习信号量之前先弄清两个概念:
- 什么是临界资源,什么是临界区
(1)临界资源:一次仅允许一个进程使用的共享资源。
(2)临界区:每个进程中访问临界资源的那段程序称为临界区
一、什么是信号量
信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信的;它本身是一种外部资源的标识;信号量在这个过程中负责数据操作的互斥和同步功能;
二、为什么要使用信号量来管理共享资源
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。 临界区域是指执⾏数据更新的代码需要独占式地执⾏。⽽信号量就可以提供这样的⼀种访问机制,让⼀个临界区同⼀时间只有⼀个线程在访问它, 也就是说信号量是⽤来调协进程对共享资源的访问的。其中共享内存的使⽤就要⽤到信号量。(信号量用来保护临界资源,实际上是用来保护临界区)
三、信号量是怎么管理资源的
当请求⼀个使⽤信号量来表⽰的资源时,进程需要先读取信号量的值来判断资源是否可⽤*。⼤于0,资源可以请求,等于0,⽆资源可⽤,进程会进⼊睡眠状态直⾄资源可⽤*。
当进程不再使⽤⼀个信号量控制的共享资源时,信号量的值+1,对信号量的值进⾏的增减操作均为原⼦操作,这是由于信号量主要的作⽤是维护资源的互斥或多进程的同步访问。⽽在信号量的创建及初始化上,不能保证操作均为原⼦性
四、信号量的工作原理
信号量进⾏两种操作,P(sv)和V(sv)
sv为一个共享资源的信号量;
- p(sv):如果sv的值⼤于零,就给sv减1;如果sv的值为零,就挂起该进程的执⾏.
- V(sv):如果有其他进程因等待sv⽽被挂起,就让它恢复运⾏,如果没有进程因等待sv⽽挂起,就给它加1;
举个例⼦,就是两个进程共享一个共享资源的信号量sv,⼀旦其中⼀个进程执⾏了P(sv)操作,它将得到信号量,并可以进⼊临界区,