Please enable JavaScript.
Coggle requires JavaScript to display documents.
2.3进程同步, 管程与进程的不同, 实现临界区互斥方法, 让权等待 不忙等 - Coggle Diagram
2.3进程同步
直接相互制约关系
同步
源于进程间的相互合作
为完成某种任务建立的两个或多个进程,需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系
间接相互制约关系
互斥
互斥的共享临界资源
一次仅允许一个变量使用的资源
物理设备,打印机、磁带机
变量、数据
互斥访问
临界区
访问临界资源的代码
退出区
访问临界区标志恢复
进入区
检查是否可进入
剩余区
其余部分
准则
空闲让进,忙则等待,有限等待,让权等待
进程同步机制的主要任务,是对多个
相关进程
在
执行次序
上进行协调,使并发执行的诸进程之间能够按照一定的规则(或时序)共享资源,并能很好地相互合作,从而使程序的执行具有
可再现性
协调进程之间的
相互制约
关系
管程与进程的不同
目的
进程:实现系统的并发性
管程:解决共享资源的互斥使用
进程:动态性,产生消失
管程:是操作系统中的一个资源管理模块
并发
进程:进程之间并发执行
管程:不能与其调用者并发
数据结构
进程:私有数据结构PCB
公共数据结构,如消息队列等
对数据结构的操作
进程:顺序程序执行有关操作
管程:进行同步操作和初始化操作
关系
进程:主动工作
像调用子程序一样调用管程
管程:被动调用
实现临界区互斥方法
管程
操作系统的
资源管理模块
代表共享资源的
数据结构
对该共享数据结构实施
操作
的一组过程
进程同步工具
组成
局部于管程的共享数据结构的说明
对该数据结构进行操作的一组过程
名称
对局部于管程的共享数据设置初始值的语句
特性(语言角度)
抽象数据类型,不仅有数据还有操作
信息掩蔽、
封装
,管程中的数据结构仅能被管程中的过程访问;
管程外进程调用;
管程中的数据结构及过程(函数)对外不可见;
模块化,管程是一个基本的
程序单位
,可以单独编译
每次仅允许一个进程进入管程,从而实现
进程互斥
,
进程只有通过
调用
管程内的
过程
,才能进入管程访问共享数据
程序设计语言的
结构成分
,与信号量具有同等表达能力
条件变量
条件变量condition,
对条件变量的访问只能在管程中进行,条件变量也是抽象数据类型
提供两个操作x.wait和x.signal,根据x对应的条件是否满足调用
与信号量比较
条件变量没有值,仅实现排队等待功能
信号量有值,反应剩余资源数,
管程中剩余资源数用共享数据结构记录
利用管程实现进程同步,必须设置
同步工具
软件实现
双标志先检查
检查和上锁不是一气呵成,违反忙则等待
双标志后检查
饥饿,违背空闲让进和有限等待
单标志法
两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能
被另一个进程赋予
轮流访问,不符合空闲让进
Peterson
让成功则等待
不让权等待,会忙等
在进入区前设置并检查一些额标志来标明是否有进程在临界区,若有,在进入区循环检查进行等待
信号量
记录型信号量
P操作:请求一个单位的该类资源
S.value--,资源数减1
如果S.value<0,资源已分配完毕,用block原语自我阻塞,插入等待队列S.L
V操作:释放一个单位的该类资源
S.value++,资源数加1
如果S.value<=0,表示依然有进程在等待此类资源,调用wakeup原语,唤醒队列中第一个
S.value的初值表示系统中某种资源的数目
增加一个进程链表指针list,用于链接上述所有等待进程
信号量实现互斥
成对出现,夹紧临界资源
初始化信号量semaphore mutex=1
整形信号量
检查、上锁一气呵成
忙等
整形信号量被定义为一个用于表示资源数目的整形量S,除初始化外,仅能通过原子操作P、V来访问
信号量实现同步(前驱)
让各并发的进程按要求有序推进
为每一对前驱关系各设置一个同步信号量
前V后P
信号量初值为0
硬件实现
硬件指令方法
通过原子操作的指令实现互斥
Swap指令
TestAndSet指令
检查上锁一气呵成
优点:适用于多处理机
缺点:其他访问进程必须不断访问测试,忙等,不能让权等待,造成处理机十分浪费
随机选择,可能饥饿
中断屏蔽方法
不响应中断,不会引发调度,进程或线程不切换
缺点
关中时间过长,效率降低,限制处理器
交替执行
程序的能力
不适用于多CPU系统,在一个处理器上关中断不能防止进程在其他处理器上执行相同临界段代码
滥用关中断权力,只适用于内核进程
计算机提供特殊的硬件指令
通过硬件支持实现临界段问题的方法:低级方法/元方法
让权等待
不忙等