一、信号量机制 --图
- 信息量其实就是一个变量(一个整数,也可以是更复杂的记录变量),可以用一个信号量表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置为1的信号量
- 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而实现进程互斥,进程同步
- 一对原语:wait(s) 和 signal(s) 简称P、V 操作(来自荷兰语proberen,verhogen)
- 原语:是一种特殊的程序,最接近底层硬件,其执行操作只能一气呵成,不能被中断。是由关中断 / 开中断指令实现的。软件解决方案的主要问题就是进入区的操作不能一气呵成,因此把进入区、退出区的操作都用原语来实现,就能避免问题
1、整型信号量
2、记录型信号量
例子:
1、p0执行,wait操作s.value--,剩余资源1,切换p1 等待队列 null
2、p1执行,wait操作s.value--,剩余资源0,切换p2 等待队列 null
3、p2执行,wait操作s.value--,剩余资源-1表示有1进程等待,执行wait里block操作进入等待队列 等待队p2
4、p3执行,wait操作s.value--,剩余资源-2表示有2进程等待,执行wait里block操作进入等待队列 等待队p2->p3
5、p0执行,signal操作s.value++,剩余资源<0表示有进程等待,执行signal里wakeup操作唤醒等待队列队头p2进程 等待队列p3
6、p2执行,signal操作s.value++,剩余资源<0表示有进程等待,执行signal里wakeup操作唤醒等待队列队头p3进程 等待队列null
7、p1执行,signal操作s.value++,剩余资源1 等待队列null
8、p3执行,signal操作s.value++,剩余资源2 等待队列null
解析:
二、信号机制实现进程互斥 --图
当没有进程在临界区时,任意一个进程要进入临界区执行P操作,把mutex--,然后进入临界区
而当有进程存在于临界区时,mutex的值为0,再有进程要进临界区,执行p操作将会被阻塞,直至在临界区中的进程推出这样便实现了临界区的互斥
三、信号机制实现进程同步
进程同步:让各并发进程按要求有序地推进
简单总结:
- 同步问题中,信号量设为0,如果某个行为要用到某种资源,那么就再那个行为前面p那种资源,如果某个行为会提供某种资源,就再那个行为后面v那种资源(前操作之后V,后操作之前P)
- 互斥问题:信号量设为1,P、V操作要仅仅夹着使用互斥资源的那个行为(临界区),中间不能有其他冗余代码
四、信号机制实现前驱关系