《操作系统》——进程管理(中)

进程同步

  • 为什么要引入进程同步的概念?
    因为进程有异步性,各进程以各自独立的、不可预知的速度向前推进。但实际应用中,某两个操作的顺序是固定的(例如读数据和写数据),如何解决这种异步问题,就是“进程同步”所讨论的内容。
  • 不同的进程之间会存在什么关系?
  • 当单纯用本节介绍的方法解决这些问题时会遇到什么新的问题吗?

一、进程同步、进程互斥

(一)进程同步

讨论具有合作关系的两个进程的顺序问题
同步也称直接制约关系,是指未完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调工作次序而产生的制约关系。直接制约关系就是源于他们之间的相互合作。

(二)进程互斥

1、互斥概念

讨论共享某种资源(临界资源)的两个进程的访问方式问题
共享方式分为:互斥共享方式(需要互斥)、同时共享方式
对临界资源的访问必须互斥地进行,互斥,也称间接制约关系,进程互斥指当一个进程访问某临界资源时,另一个想要访问临界资源的进程必须等待,当前访问临界资源的进程访问结束,释放该资源后,另一个进程才能去访问该临界资源。

2、对临界资源互斥访问的四个部分
  • 进入区:检查是否可以进入临界区,若可以进入,上锁,实现互斥
  • 临界区:访问临界资源的那段代码
  • 退出区:负责解除正在访问临界资源的标准,解锁,实现互斥
  • 剩余区:做其他处理
3、互斥的原则

如果一个进程暂时不能进入临界区,那么该进程是否应该一直占着处理机?该进程是否有可能一直进不了临界区?——引出互斥的原则:

  • 空闲让进:临界区空闲时,允许一个进程立即进入
  • 忙则等待:如果临界区内有进程,其他申请临界区的进程必须等待
  • 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(防止饥饿)
  • 让权等待:当进程不能进入临界区,应立即释放处理机,防止进程忙等

二、进程互斥的软件实现方法

(一)单标志法

在这里插入图片描述
在这里插入图片描述

(二)双标志先检查

在这里插入图片描述
在这里插入图片描述

(三)双标志后检查

在这里插入图片描述
在这里插入图片描述

(四)Peterson算法

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

三、进程互斥的硬件实现方法

(一)中断屏蔽法

在这里插入图片描述

(二)TestAndSet(TS指令/TSL指令)

将“检查”和“上锁”一气呵成
在这里插入图片描述

(三)Swap指令(XCHG)指令

在这里插入图片描述

在这里插入图片描述

四、信号量机制

总结:
1、在双标志先检查法中,进入区的检查和上锁无法一气呵成,从而导致了两个进程有可能无法同时进入临界区的问题;
2、所有的解决方案都无法实现让权等待,会出现忙等

Dijkstra提出信号量机制——一种卓有成效的实现进程互斥、同步的方法

(一)信号量机制

  • 信号量是一个变量(可以是一个整数,也可以是一个记录型变量),用来表示系统中某种资源的数量
  • 通过wait(S)/P(S)和signal(S)/V(S)原语对信号量进行操作

(二)信号量分类

1、整型信号量

用一个整数变量,标识系统中某种资源的数量
只能有三种操作:初始化、P操作、V操作
优点:利用原语实现了检查和上锁一气呵成,避免了并发、异步导致的问题
缺点:不满足“让权等待”原则,会发生忙等
在这里插入图片描述

2、记录型信号量

用一个记录型数据结构表示的信号量:整型剩余资源数、指针指向等待队列
如果信号量值小于0,说明此时有进程在等待这种资源,绝对值为当前等待队列中的进程数
在这里插入图片描述
在这里插入图片描述
要知道P、V原语实现了哪些操作
在这里插入图片描述
在这里插入图片描述

五、用信号量实现进程互斥、同步、前驱关系

(一)实现进程互斥

1、注意
  • 信号量mutex表示进入临界区的名额
  • semaphore mutex=1;初始化信号量,表示记录型信号量(是一个数据结构(资源数+等待队列)而不是整型)
  • 对不同的临界资源需要设置不同的互斥信号量
  • PV操作必须成对出现
2、步骤
  1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
  2. 设置互斥信号量mutex,初值为1(打印机一台)
  3. 在进入区P(mutex)
  4. 在退出区V(mutex)
    在这里插入图片描述

(二)实现进程同步

进程同步:要让各并发进程按要求有序地推进

1、步骤
  1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
  2. 设置同步信号量S,初始值为0
    信号量S代表某种资源,刚开始是没有这种资源的,P2需要使用这种资源,而又只能由P1产生这种资源
  3. 在“前操作”之后执行V(S)
  4. 在“后操作”之前执行P(S)
    在这里插入图片描述

(三)实现前驱关系(多级同步)

  • 在前驱关系图中,要为每一对前驱关系各设置一个同步信号量,初值为0;

在这里插入图片描述
在这里插入图片描述

六、生产者-消费者问题

请添加图片描述

七、多生产者-多消费者问题

请添加图片描述

八、吸烟者问题

请添加图片描述

九、读着写着问题

请添加图片描述

十、哲学家问题

请添加图片描述

十一、管程——封装思想encapsulation

管程将同步互斥复杂的细节隐藏在管程定义的“过程”(函数)中,对外提供简单的调用接口

(一)为什么引入管程

  • 信号量机制存在的问题,编写程序困难,易出错。例如需要关注PV操作的顺序。
  • 能否设计出让程序员不需要再关心复杂的PV操作的机制
  • 引入管程——管程是一种高级的同步机制

(二)管程的定义和基本特征

1、管程的组成
  • 局部于管程的共享数据结构
  • 对该数据结构进行操作的一组过程
  • 对局部于管程的共享数据设置初始值
  • 管程有一个名字
2、管程的基本特征
  • 局部于管程的数据只能被局部于管程的过程所访问
  • 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  • 每次仅仅允许一个进程在管程内执行某个内部过程

(三)拓展1:用管程解决生产者消费者问题

  • 个进程必须互斥访问管程的特性是由编译器实现的
  • 可在管程中设置条件变量及等待P/唤醒V操作以解决同步问题

在这里插入图片描述

在这里插入图片描述

(四)拓展2:Java中类似于管程的机制

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值