操作系统知识——互斥和死锁

银行家算法

银行家算法是最有代表性的避免死锁算法,是Dijkstra提出的。这是由于该算法能用于银行系统现金贷款的发放而得名。

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

  • 关于安全状态的概述

    系统处于安全状态时,一定不会发生死锁;系统处于不安全状态时,不一定会发生死锁;

    (1)安全状态
    如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。

    (2)不安全状态
    不存在一个安全序列。不安全状态不一定导致死锁。

  • 基本思想

    银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全,银行家规定:

    • 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
    • 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
    • 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
    • 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

      银行家算法是通过动态地检测系统中资源分配情况和进程对资源的需求情况来决定如何分配资源的,在能确保系统处于安全状态时才能把资源分配给申请者,从而避免系统发生死锁。

  • 相关的变量

    • Available(可利用资源总数)
      某类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。
      
    • Max:某个进程对某类资源的最大需求数
    • Allocation: 某类资源已分配给某进程的资源数。
    • Need:某个进程还需要的各类资源数。
      Need= Max-Allocation
      
  • 银行家算法描述

    设Request i是进程Pi的申请向量,如果Request i[j]=K,则表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

    • 如果Request i[j]<=Need[i,j],便转向步骤2);否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。

    • 如果Request i[j]<=Available[i,j],便转向步骤3);否则,表示尚无足够资源,Pi需等待。

    • 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

      1
      2
      3
      Available[j]:=Available[j]-Request i[j];
      Allocation[i,j]:=Allocation[i,j]+Request i[j];
      Need[i,j]:=Need[i,j]-Request i[j];

4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

参考:银行家算法

死锁的概念

  死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

产生死锁的必要条件

  • 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

  • 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

  • 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

  • 循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

针对死锁的解决方案

  1. 预防死锁

    这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

    预防死锁方法(3种):

    • 破坏请求和保持条件,如资源静态分配法(也称为预分配资源)
    • 破坏不可抢占条件
    • 破坏循环等待条件
  1. 避免死锁

    该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。如银行家算法

  1. 检测死锁

    这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。如资源分配图简化法

  1. 解除死锁

    这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

    死锁的解除方法(2种):

    • 抢占资源,如剥夺资源法
    • 终止(或撤销)进程。

具体方案:

  1. 抢占式资源分配策略 :要使不可抢占其它进程占有的资源不成立,可以约定如下:如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足必须等待时,系统可以抢夺该进程已有的资源。 它只适合于主存和处理器。
  2. 释放已占资源策略——这种分配策略是仅当进程没有占有资源时才允许它去申请资源。如果进程已占用了某些资源而又要再申请资源,则它应先归还所占的资源后再申请新资源。
  3. 按序分配资源——要使循环等待条件不成立可采用按序分配的资源分配策略。具体做法是把系统中所有资源排序,对每个资源确定一个编号,规定任何一个进程申请两个以上的资源时,总是先申请编号最小的资源,再申请编号大的资源。
  4. 关于

链接:https://www.nowcoder.com/questionTerminal/b8ade2458fe94e59827f8adbf58efe2c
来源:牛客网

系统中的资源

  • 一类是可剥夺资源,即CPU 和 内存 ,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的 处理机 。
  • 另一类资源是不可剥夺资源,如 磁带机 、打印机等,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放。

链接:https://www.nowcoder.com/questionTerminal/d7375249214648c6b3b12ce8184efea2
来源:牛客网

互斥

各进程采取互斥的方式,实现共享的资源称作临界资源。

信号量机制的引入解决了进程同步的描述问题,但信号量的大量同步操作分散在各个进程中不便于管理,还有可能导致系统死锁。如:生产者消费者问题中将P、V颠倒可能死锁。
为此Dijkstra于1971年提出:把所有进程对某一种临界资源的同步操作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。

链接:https://www.nowcoder.com/questionTerminal/401d52fe872a4473857f8b795ccc6783
来源:牛客网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#常用的控件

C#常用的控件 窗体 菜单、工具栏、对话框 用户控件及控件的继承

C++输入函数的应用

最近因为找工作的事情&#xff0c;在刷一些编程题&#xff0c;也陆陆续续参加了一些笔试&#xff0c;一般编程中使用的语言是C&#xff0c;因为编程题会有时间的限制&#xff0c;C的效率最高&#xff0c;不容易出现超时的问题所以使用最多的语言就是C。 在编程中&#xff0c;其…

C#绘图及图像

C#绘图及图像 绘图的基本方法 绘图的应用

PHP开发API

引言如何使用 PHP 开发 API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09; 呢&#xff1f; 做过 API 的人应该了解&#xff0c;其实开发 API 比开发 WEB 更简洁&#xff0c;但可能逻辑更复杂&#xff0c;因为 API 其实就是数据输出&a…

热部署和热加载

2018-8-22今天入职第二天&#xff0c;看到老大在群里发了一个go热加载实现的链接&#xff0c;之前没有听说过热加载&#xff0c;所以搜索了一下&#xff0c;下面是关于热部署和热加载的相关整理。 引言在项目线上更新时&#xff0c;可能会遇到需要热部署的情况&#xff0c;虽然…

C#实现定时器

C#实现定时器 方法一 布局 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace…

HTTP请求流程

hhtp请求流程首先http是一个应用层的协议&#xff0c;在这个层的协议&#xff0c;只是一种通讯规范&#xff0c;也就是因为双方要进行通讯&#xff0c;大家要事先约定一个规范。 http请求与响应的步骤如下&#xff1a; URL解析、域名解析 输入URL的时候&#xff0c;首先浏览器会…

PHP执行外部程序的方法

引言在一些特殊情况下&#xff0c;会使用PHP调用外部程序执行&#xff0c;比如&#xff1a;调用shell命令、shell脚本、可执行程序等等 PHP执行外部程序的方法 system()&#xff0c;system函数将执行的结果直接输出exec()&#xff1a;执行一个外部程序&#xff0c;将输出结果保…

C语言函数变量的引用

C语言函数变量的引用 有时候&#xff0c;你想引用函数中的某些变量。 #include <stdio.h>int main() {struct guoba{int pang;int piqi;};void tong(int *p){int month1 3;int month5 8;struct guoba xiaoguoba;xiaoguoba.pang month1 month5;*p xiaoguoba.pang ;…

php 终止程序的方法——return、exit()、die()

php中终止程序的运行有三种方式&#xff1a; return&#xff0c;主脚本程序中使用exit()&#xff0c;脚本中使用die()&#xff0c; 脚本中使用三者所在的脚本文件他们之后的代码都不会执行了。php开发模式下想直接看到变量的值使用exit()、die()。 returnreturn是语言结构而不是…

Eric Evans说DDD还未结束

在Explore DDD 2018大会上&#xff0c;Eric Evans做了“怀疑、乐观和实用主义”的主题演讲&#xff0c;他在演讲中表示&#xff0c;“DDD还没有结束”。在“领域驱动设计”这本书出版十五年之后&#xff0c;作者对这个想法长期以来如此流行表示了惊讶之情。他强调&#xff0c;D…

mark

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C语言的进阶-指针的应用

指针的应用 #include <stdio.h> void swap(int *p,int *q); int main() {int a 5;int b 8;swap(&a,&b);printf("a%d,b%d\n",a,b);return 0; }void swap(int *p,int *q) {int t *p;*p *q;*q t; }函数只能返回一个值&#xff01; 可以通过参数返回多…

Go简单开始

Go是一门编译型语言&#xff0c;Go语言的工具链将源代码及其依赖转换成计算机的机器指令2。Go语言提供的工具都通过一个单独的命令 go 调用&#xff0c; go 命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件&#xff0c;链接库文件&am…

C语言进阶-指针与数组

C语言进阶-指针与数组 q可以改变指向的内容&#xff0c;但不能改变指向的地址 p可以改变指向地址&#xff0c;但不能改变指向内容

测试下文章

这是一篇测试 编辑

发布文章测试

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C语言进阶-指针运算

C语言进阶-指针运算 #include <stdio.h>int main() {char a[] {0,1,2,3,4,5,6,7,8,9};char *p a;printf("p%d\n",p);printf("p1%d\n",p1);int b[] {0,1,2,3,4,5,6,7,8,9};int *q b;printf("q%d\n",q);printf("q1%d\n",q1);r…

vim的模式及常用命令

vim的模式正常模式 (Normal-mode) &#xff1a; 左下角显示文件名或为空。 启动vim后默认处于正常模式。不论位于什么模式&#xff0c;按下<Esc>键(有时需要按两下&#xff09;都会进入正常模式。 插入模式 (Insert-mode)&#xff1a;左下角显示–INSERT– 在正常模式中…