哈工大os学习笔记十(信号量与死锁)


文章目录

  • 哈工大os学习笔记十(信号量与死锁)
  • 一、 信号量临界区保护
    • 1.为什么要保护信号量
    • 2.临界区
    • 3.保护信号量的方法
      • 3.1 轮换法
      • 3.2 标记法
      • 3.3 Peterson算法
      • 3.4 面包店算法
      • 3.5 硬件方法
  • 二、 死锁的处理
    • 1.死锁的产生
    • 2.死锁的成因
    • 3.死锁的必要条件
    • 4.死锁的处理方法概述
    • 5.死锁的处理方法具体例子
      • 5.1死锁预防
      • 5.2死锁避免
      • 5.3死锁检测+恢复
      • 5.4死锁忽略

为什么要保护信号量
怎么保护信号量
信号量代码的实现
死锁

一、 信号量临界区保护

1.为什么要保护信号量


本来empty应该等于-3,但是进行了这个调度之后等于-2。不对信号量进行保护,由于多进程图像并发执行,信号量会发生错误。

这不是编程的错误,是共享的资源或者数据不进行保护都会发生错误。
但是上图中,加上空循环改变时间片改变调度的点任然不能解决,只是这次恰好可以正确运行,下次进程不一样了,调度不一样了不能保证正确执行。这种拼概率的方法完全能不可行。
保护信号量也就是保护变量。

2.临界区


读写信号量的代码一定是临界区
临界区成段成组的出现。

通过临界区保护信号量,通过信号量实现进程的同步。在多进程图像并发执行的时候,临界区的这个代码会起到保护作用,当一个进程A正在修改信号量的时候,由于调度另一个进程B,此时进程B也想修改信号量,但是临界区中的代码会保护起来,即使在临界区的时候发生调度,临界区是一些真假的判断和循环,临界区并不会由于发生调度而出错。

临界区代码的保护原则:
互斥进入,有空让进,有限等待

3.保护信号量的方法

互斥进入:反证法,如果同时进入会产生什么样的矛盾。

3.1 轮换法


互斥进入:同时进入临界区,导致turn等于0又等于1,满足
空闲让进:P0执行一次后,P1并不执行,P0想再次进入,turn等于1,P0进不来,不满足
有限等待:不满足

3.2 标记法


谁进入谁打标记,发现其他人打标记就等待sleep(),退出去就把标记置成空。
互斥进入:P0,P1同时进入 flag为真又为假,满足

空闲让进:(1)(2)(3)(4)这个顺序执行后,P0在while一直循环,进行自旋,不满足
有限等待:P0P1无限等待,不满足

3.3 Peterson算法

Peterson算法非对称标记法,两个进程

3.4 面包店算法

多进程——用面包店算法,借鉴了摇号方式,取号就表示想进入使用信号量。

每次有进程想进来,就摇号,摇的号为max的+1,进程想进来,看一下num!=0表示想进来,看是不是最小的,最小的就进来,不是就等待,空转。出去的时候num[i]=0。
号不为0并且取得是最小的,就相当于打标记并且是非对称标记。

while(choosing[j]);表示有人正在选号,也等待。

没人选号,就可以进去。
面包店算法正确性:

P0进入一次了还想再次进入,那么再次取得号一定是最大的,不会一直进入,满足有限等待。

3.5 硬件方法

软硬件协同设计
硬件方法一:可以在进入临界区之前关闭中断,从临界区出来再打开中断。没有中断就不会发生进程调度,自然不存在多进程竞争临界区资源的情况,但多核不适用,关闭一个核中断,其他核的线程依然可以访问临界区资源。比软件方法好用的多,但是适用范围有限。
实验五可以用这种方法,实验五单CPU
硬件方法二:可以使用硬件提供的原子指令法,就是几条指令的执行是原子性的,要么不执行,要么全部执行。
做一个硬件执行指令使得mutex的执行是原子的,通过硬件实现一个“1”的这种锁信号量,而不是软件信号量,再信号量反复套娃保护。修改这个变量的时候一步执行完毕。


TestAndSet(&lock)一次执行完毕,不会由于进程调度被打断。退出的时候被打开。
互斥进入:P0能进入开始lock=false进入后返回rv,rv=false,执行后lock为真 (硬件原子指令)P1想进入lock为真进不去,满足
空闲让进:没人使用,必然lock=false,满足
有限等待:
多CPU锁住总线也适用。

总结:临界区保护信号量,信号量实现进程同步

二、 死锁的处理

1.死锁的产生

将mutex与empty换一下就会产生死锁,形成环路等待,一个进程必须等待,依赖于自己的继续进行,互相等待资源的释放。死锁会导致,资源无法释放,资源锁的越来越多,进程锁的越来越多,进程,资源都无法进行,计算机无法工作,特别慢,CPU没有程序执行,CPU利用率非常低。
我们将这种多个进程由于互相等待对方持有的资源而造成谁都无法执行的情况叫死锁

2.死锁的成因

3.死锁的必要条件


互斥使用和不可抢占是资源的固有属性,不可消除。

4.死锁的处理方法概述


以火灾为例
死锁预防:破坏死锁的必要条件(不许点火)
死锁避免:检测每个资源请求,假如造成死锁就拒绝(检测到煤气超标,自动切断电源)
死锁检测+恢复:已经发生死锁了。检测到死锁出现时,让一些进程回滚,让出资源。(发现火灾时,立即拿起灭火器)
死锁忽略:就好像没有出现死锁一样(在太阳上可以对火灾全然不顾)对于普通的PC机可以,对于不重启的机器不好使。PC机通常死锁,然后重启,重新来过。
现实中,Windows,Linux,在普通pc机上都不做死锁,对于一些专业性的场合,比如放在卫星,银行的操作系统就必须处理死锁,因为,不重启。

5.死锁的处理方法具体例子

5.1死锁预防


第一种方法就是不占有资源一次性申请全部的资源,把所用的信号量全部申请,但是申请的资源并不会都用上,可能先申请的资源要等很久才能用上。
第二种方法是对资源进行排序,例如有10个线程, 每个都要访问多个资源, 对资源排序以后, 大家都先锁住1号资源进行访问(注意同一时刻,只有一个线程能获得锁, 别的都得等待) 然后是2号, 3号…由于大家访问的次序是一样的, 就不会出现死锁的的情况。
死锁的预防会引出很多的不合理性,造成资源的浪费。

5.2死锁避免

 可以随意的请求,但是会对请求做下判断,判断是否产生死锁,产生死锁就拒绝这次资源申请。
通过银行家算法进行判断。
银行家算法:判断一下,按照某种执行序列,能否执行下去,所有进程都能执行完毕。能执行下去的序列叫安全序列

available可用的资源,need进程需要的资源,allocation进程占有的资源。

银行家算法的时间复杂度 T(n)=O(mn^2)。
n是进程数,m是资源种类。每一个进程最坏比较n次,n个进程,n^2次,每次比较m个资源。
然而一个系统中的资源是非常多的,进程也很多,假如100,个进程,100个资源,那就是说每次申请资源都要执行 一百万,10^6次。

一个进程申请资源,先把进程加入进来,假设分配一下,看看如果分配了会不会产生死锁,产生死锁就不给分配,不产生允许分配。
P0申请(0,2,0)假装分配给P0,上图中就从右边的表格变成左边的表格,然后,找安全序列,看产生不产生死锁。发生死锁就不分配,否则就分配。左边表格里面available都不满足need,会产生死锁,所以不予分配。

5.3死锁检测+恢复

把银行家算法往后推一推,不是每次都做,发现系统慢了,再看看是不是产生了死锁。


有几个进程阻塞了,发生死锁,形成了deadlock队列。
回滚:把他曾经执行的的东西全部退回去,回滚到什么状态,再用银行家算法测一下,可以执行,不发生死锁,就停下回滚。
选择回滚进程的考虑因子:优先级,占用资源,但是不好,毕竟人家这个进程已经执行很长时间了。
怎么实现回滚也很困难,有的进程执行的时候已经把进程写到磁盘上了,让他回滚,那进程就要从磁盘上擦除退回。比如银行,已经把5W存到银行的记录上了,在回滚回去太有可能出错了,要想实现回滚要有很多机制要跟上。
死锁检测恢复方法是一个效率很高的方法,也能实现死锁的 处理。由于会过一段时间在处理,这里银行家算法就不是核心了,但是实现回滚是困难的。

5.4死锁忽略


哈工大操作系统学习笔记十——信号量与死锁相关推荐

  1. 哈工大操作系统学习笔记五——内核级线程实现

    哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...

  2. 计算机操作系统学习笔记_6_进程管理 --死锁

    一.死锁的概念 1.死锁的概念 系统中两个或两个以上的进程无限期地相互等待永远不会发生的条件,系统处于一种停滞状态,这种情况称为死锁. 2.死锁产生的原因 (1)进程推进顺序不当 (2)对互斥资源的分 ...

  3. UC/OS III操作系统学习笔记

    UCOS操作系统学习笔记 1.UCOSIII任务 1.1任务管理 1.2 任务创建和删除.挂起和恢复 1.3 系统内部任务 2.UCOSIII中断和时间管理 2.1 中断管理 2.2 时间管理 3.U ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. Linux操作系统学习笔记【入门必备】

    Linux操作系统学习笔记[入门必备] 文章目录 Linux操作系统学习笔记[入门必备] 1.Linux入门 2.Linux目录结构 3.远程登录 3.1 远程登录Linux-Xshell5 3.2 ...

  6. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  7. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  8. 学习笔记--RTOS信号量

    学习笔记–RTOS信号量 本文基于正点原子RTOS开发指南,笔记自用,获取详细信息请关注正点原子官方账号 简介:信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问.和linux中的信号量差不 ...

  9. freeRtos学习笔记 (7)信号量

    freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...

最新文章

  1. LeetCode Unique Binary Search Trees II(递归或者dp)
  2. 【数字信号处理】相关函数 ( 自相关函数示例 )
  3. SEO那些事:一句代码一键分享网站
  4. sdk编程改变static控件字体和颜色
  5. Cocos2d JS 之消灭星星(九) 处理星星类之——移动和消灭星星
  6. 最详细的docker安装rocketMQ教程来了
  7. 新版python安装包(直接提取安装)
  8. Scrapy框架学习笔记 - 爬取腾讯招聘网数据
  9. 被马云逼上绝路,睡了12年宾馆!中国最狠会计,拿下4600亿
  10. 苹果如何分屏_玩转mac—苹果电脑操作教程
  11. 抽奖滚动文字如何透明地覆盖在动态视频背景上?-活动现场双屏管理系统操作提示
  12. SVN 使用beyondcompare 来版本对比
  13. UPS不间断电源原理与选用配备技巧
  14. Linux抓包命令tcpdump以及常见抓包使用方法
  15. Protel 99 SE 应用技术问答
  16. python神经网络编程 代码,python神经网络编程 豆瓣
  17. Java开发一年经验北京薪资,全网首发!
  18. TeX家族整理(扫盲文)
  19. win10计算机管理看不见蓝牙,Win10设备管理器找不到蓝牙设备的解决方案
  20. windows 10中使用docker Client.Timeout exceeded while awaiting headers

热门文章

  1. 教你几种方法最大限度减轻酒精对你身体的伤害
  2. C++的内联函数和非内联函数的区别
  3. Android之人脸识别
  4. python识别图片文字、并返回文字坐标_PyAutoGui 图片识别+定位+截图函数文档
  5. 字符串类型的算法面试
  6. 《数字语音处理》- 实验4. 基于MATLAB与VQ的特定人孤立词语音识别研究(附代码)
  7. python二进制和图片转换
  8. 信息系统项目管理师与系统集成项目管理工程师5大区别
  9. 拼多多微信登陆服务器请求失败,拼多多客服网页无法登陆/卡死,怎么办?
  10. 手机怎么实现图片转文字操作?学会这三招就够了