L16&17&18&19 【哈工大_操作系统】进程同步与信号量&信号量临界区保护&信号量的代码实现&死锁处理

L2.9 进程同步与信号量

让进程走走停停,实现进程同步。

1.、信号量的定义

  1. 生产者Producer需要判断是否还有空闲缓冲区生产资源,所以定义一个标志empty,初始值为最大可用资源数,在开头维护;同时,在消费者Consumer中释放了一个资源后,需要释放一个empty,在结尾维护。
  2. 消费者Consumer需要判断是否有资源需要去执行,所以定义一个标志full,初始值为0,在开头维护;同时,在生产者Producer产生新的资源需要增加full,在结尾维护。
  3. 共享缓冲区 定义在文件中,所以要考虑文件读写的互斥,定义了一个锁mutex,初始值为1。任何一个使用时,调用P(),mutex--,则mutex=0。当另外一个调用P()时,mutex=-1,此时小于零,将等待。

L2.10 信号量临界区保护

用临界保护信号量,用信号量实现同步

1、竞争条件:和调度有关的共享数据语义错误

若empty修改到一半,跳转到其他进程运行,将导致少减一个。

2、临界区

临界区:一次只允许一个进程进入的一段代码。

  • 互斥进入
  • 有空让进
  • 有限等待

3、两个进程的临界区策略

4、临界区保护:面包店算法(软件方法)

  • 每次进来取个号,取号值为当前最大号再+1
  • while中判断如果别人想进 且 别人的号比我的小,则我等着
  • choossing 用来保证:有人在选号时,我就等着,等选完好再进行判断

5、临界区保护:硬件方法

  1. 关中断:两个进程不能同时进入临界区 -> 阻止调度 -> 关中断(cli)。

    • 缺点:在多CPU下失效,关中断只能控制一个CPU,另一个CPU不管用
  2. 硬件原子指令法

修改empty需要 mutex 保护,但其实mutex也是一个变量,将导致修改mutex也需要保护,修改mutex的保护也需要保护,没完没了。进而引出了一种硬件原子指令法,使得mutex锁时不能被打断,即硬件实现保护

  • 如果变量已经被锁上(x=1),返回的就是true,就会陷入无限循环等待;
  • 如果没有被锁上(x=0),此时会将x锁上(x=1),并且返回false,此时就可以进入临界区,执行完毕再解锁(x=0)。

L2.11 信号量的代码实现

  • 定义了一个信号量结构体,包含信号量名称、值、等待唤醒进程队列

  • sem_open根据信号名打开信号量,若没有则创建

  • sem_wait中通过开关中断实现保护临界区,信号量值小于零阻塞

  • 开关中断来实现信号量的保护

  • 根据信号量来判断是否睡眠等待

  • 磁盘读完后,睡眠的进程将由中断唤醒

  • 隐蔽的队列:tmp作为局部变量,存放在当前进程内核栈中。所以当前进程能找到tmp,建立了索引;而tmp指向下一个进程的PCB;下个进程PCB找到下个进程的内核栈,内核栈找到tmp;tmp再指向下下个进程的PCB...构成了一个队列。

  • sleep_on 把自己放到队列中,变成阻塞态,然后schedule切出去

  • 变成阻塞态的睡眠队列,在磁盘中断中被唤醒

  • whilesleep_on实现将队列中所有进程进行唤醒


L2.12 死锁处理

1、死锁四个必要条件

  • 互斥使用
  • 不可抢占
  • 请求和保持
  • 循环等待

2、死锁处理方法

分析死锁

  • 死锁的产生:如果将生产者和消费者的各自的一二行代码交换一下顺序。对于生产者,当empty=0时,mutex执行后锁住,执行empty时阻塞,等待消费者执行V(empty);对于消费者,此时mutex=0,还要等待生产者执行V(mutex),互相需要对方资源,造成死锁。
  • 而相对于原本正确的实现:对于生产者,当empty=0时,P(empty)就阻塞了,等待消费者;消费者可以正常执行,因为mutex没有被锁住。
  1. 死锁预防:破坏出现的条件
  • 一次性申请所有需要的资源
  • 资源申请必须按序申请
  1. 死锁避免:检查每个请求资源
  • 银行家算法:判断此次请求是否引起死锁
  1. 死锁检测+恢复:让一些进程回滚,让出资源
  • 定时监测或发现CPU资源利用率低时检测,检测到时通过银行家算法看需要回滚多少
  1. 死锁忽略:直接忽略
  • 重启
相关推荐
肖老师+2 小时前
期末复习.操作系统课后习题答案
操作系统
p@nd@1 天前
Oracle筑基篇-调度算法-LRU的引入
数据库·oracle·操作系统·lru
肖老师+2 天前
“从零到一:揭秘操作系统的奇妙世界”【操作系统中断和异常】
操作系统
GoGeekBaird3 天前
69天探索操作系统-第20天:页替换算法 - 深度剖析
后端·操作系统
IT 青年4 天前
操作系统(12)内存分配
操作系统
IT 青年5 天前
操作系统(15)I/O硬件
操作系统
killsime6 天前
操作系统笔记
笔记·操作系统
IT 青年7 天前
操作系统(11)程序处理
操作系统
千千寰宇7 天前
[操作系统] 计算机资源虚拟化技术
操作系统·docker/k8s/虚拟化/容器化
終不似少年遊*7 天前
华为云(openstack)常用命令行
linux·服务器·网络·华为云·云计算·操作系统·openstack