在这之前大家可以参考一下这篇文章《操作系统》-信号量机制的初识对信息量进制有个大致的了解
信号量进制实现进程互斥
实现进程互斥时可以分为以下几个步骤:
1、分析并发进程关键活动,划分临界区(如:对临界资源打印机的访问就应放在临界区)
2、设置互斥信号量
mutex,初值为0
(信号量mutex表示“进入临界区的名额”)
3、在进入区P(mutex)——申请资源
4、在退出区V(mutex)——释放资源
注意:
对不同的临界资源
需要设置不同的互斥信息量
P、V操作必须成对出现
。缺少P操作会导致临界资源不能被互斥访问,缺少V操作会导致资源被访问后无法被释放,等待进程永不会被唤醒
信息量机制实现进程同步
进程同步:让各并发进程按照要求有序的地推进
比如说在实现过程中进程1必须比进程2先访问临界资源,这种各进程按一定要求推进就是进程同步,让本来异步并发的进程互相配合、有序推进
实现进程同步可以分为以下几个步骤:
1、分析什么地方需要进程同步关系,必须一前一后
地执行两个操作(或两句代码)
2、设置同步信号量
S,初始值为0
3、在“前操作”之后执行V(S)
4、在“后操作”之前执行P(S)
理解
信号量S代表某种资源,刚开始是没有这种资源的。P2要使用这种资源就会被锁在P(S)操作这里,直到P1被执行后V(S)将S的数量加1后P2才能被执行。
若先执行到 V(S) 操作,则 S++ 后 S=1。之后当执行到 P(S) 操作时,由于 S=1,表示有可用资源,会执行 S–,S 的值变回 0,P2 进程不会执行 block 原语,而是继续往下执行代码4。
若先执行到 P(S) 操作,由于 S=0,S-- 后 S=-1,表示此时没有可用资源,因此P操作中会执行 block 原语,主动请求阻塞。之后当执行完代码2,继而执行 V(S) 操作, S++,使 S 变回 0,由于此时有进程在该信号量对应的阻塞队列中,因此会在 V操作中执行 wakeup 原语,唤醒 P2 进程。这样 P2 就可以继续执行 代码4 了
信息量机制实现前驱关系
什么是实现前驱关系举个例子
例:进程 P1 中有句代码 S1,P2 中有句代码 S2 ,P3中有句代码S3 …… P6 中有句代码 S6。这些代码要求按如下前驱图所示的顺序来执行:
其实每一对前驱关系都是一个进程同步关系(需要保证一前一后),因此实现前驱关系可以分为以下步骤:
1、要为每一对前驱关系设置一个同步信息量
2、在“前操作”之后对相应的同步信息量执行V操作
3、在“后操作”之前对相应的同步信息量执行P操作
内容回顾: