王道操作系统___第二章03

2.3_1_进程同步、进程互斥

进程同步

  • 异步性:各并发执行的进程以各自独立的、不可预知的速度向前推进。
  • 同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

进程互斥

  • 两种资源共享方式:
    • 互斥共享方式:在一个时间段内只允许一个进程访问该资源
    • 同时共享方式:允许一个时间段内由多个进程同时对它们进行访问。
  • 一个时间段内只允许一个进程使用的资源称为临界资源
  • 对临界资源的访问必须互斥的进行。互斥,亦称间接制约关系。
  • 进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。
  • 进程互斥的四个部分:进入区、临界区、退出区、剩余区。
  • 临界区是进程中访问临界资源的代码段。进入区和退出区是实现互斥的代码段。
  • 为了实现对临界资源的互斥访问,同时保证系统的整体性能,需要遵循以下原则:
    • 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
    • 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待
    • 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区
    • 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

2.3_2_进程互斥的软件实现方法

单标志法

  • 算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
  • 可以实现同一时刻最多只允许一个进程访问临界区。但违背了空闲让进的原则。

双标志先检查法

  • 算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志位flag[i]设为true,之后开始访问临近区。
  • 违反忙则等待原则。原因在于进入区的检查和上锁两个处理不是一气呵成的,检查后,上锁前可能发生进程切换。

双标志后检查法

  • 算法思想:先上锁,后检查。
  • 解决了忙则等待的问题,但是又违背了空闲让进和有限等待原则,会因各进程都长期无法访问临界资源而产生饥饿现象。

Peterson算法

  • 算法思想:如果双方都争着想进入临界区的化,那可以让进程尝试孔融让梨,主动让对方先使用临界资源。
  • 进入区:主动争取,主动谦让,检查对方是否也想使用,且最后一次是不是自己说了客气话。
  • 解决了进程互斥的问题,遵循了空闲让进,忙则等待,有限等待三个原则,但是依然未遵循让权等待的原则。

2.3_3_进程互斥的硬件实现方式

中断屏蔽方法

  • 利用开/关中断指令实现
  • 不适用于多处理机,只适用于操作系统内核进程,不适用于用户进程。特权指令。

TestAndSet指令

  • 用硬件实现的,上锁和检查操作用硬件的方式变成了一气呵成的原子操作。
  • 适用于多处理机的环境。不满足让权等待的原则。

Swap指令

  • 硬件实现,执行过程中不允许被中断,只能一气呵成。
  • 和TestAndSet指令类似。

2.3_4_信号量机制

  • 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥,进程同步。
  • 信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量) ,可以用一个信号量来表示系统中某种资源的数量。
  • 原语是一种特殊的程序段,其执行只能一气呵成,不可能被中断,是由关中断/开中断指令实现的。
  • 一对原语:wait(s),signal(s), 简称为P,V操作。

整型信号量

  • 对信号量的操作只有三种:初始化,P操作,V操作。
  • 检查和上锁一气呵成,避免了并发、异步导致的问题。
  • 不满足让权等待原则,会发生忙等。

记录型信号量

  • 用记录型数据结构表示的信号量。
  • 如果剩余资源数量不够,使用block原语使进程从运行态进入阻塞态,并把该进程挂到信号量S的等待队列中。
  • 释放资源后,若还有别的进程在等待这种资源,则使用wakeup原语唤醒等待队列中的一个进程,该进程从阻塞态变为就绪态。
  • PV操作中,先执行++或者–操作,在根据实际情况执行原语。

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

信号量机制实现进程互斥

  • 分析并发进程的关键活动,划定临界区
  • 设置互斥信号量mutex,初值为1
  • 在临界区之前执行P,缺少P(mutex)就不能保证临界资源的互斥访问
  • 在临界区之后执行V,缺少V(mutex)就会导致资源永远不会被释放,等待进程永不会被唤醒。

用信号量机制实现进程同步

  • 进程同步:要让各并发进程按要求有序的推进。
  • 分析什么地方需要实现同步关系,即必须保证一前一后执行的两个操作
  • 设置同步信号量S,初始化为0
  • 在前操作之后执行V(S)
  • 在后操作之前执行P(S)

用信号量机制实现前驱关系

  • 要为每一对前驱关系各设置一个同步变量
  • 前V(S),后P(S)

2.3_11_管程

管程的组成

  • 局部于管程的共享数据结构说明
  • 对数据结构进行操作的一组过程(函数)
  • 对局部于管程的共享数据结构设置初始值的语句
  • 管程有一个名字
  • 引入管程的目的无非就是要更方便地实现进程互斥和同步。

管程的基本特征

  • 局部于管程的数据只能被局部于管程的过程所访问
  • 一个进程只有通过调用管程内的函数才能进入管程访问共享数据
  • 每次仅允许一个进程在管程内执行某个内部函数。
  • 由编译器负责实现各进程互斥地进入管程中的函数
  • 管程中设置条件变量和等待/唤醒操作,以解决同步问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值