21-死锁-2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当有一个进程要求分配若干资源时系统根据该算法判断此次分配是否会导致系统进入不安全状态若会则拒绝分配
第七章
死锁
资源分配状态 系统安全状态及安全序列 银行家算法
一、死锁的避免
死锁的避免是在产生死锁的四个充要条件可能 成立的情况下,使用一些方法以避免死锁的产生。 成立的情况下,使用一些方法以避免死锁的产生。 为讨论死锁的避免,我们引进一些新的概念: 为讨论死锁的避免,我们引进一些新的概念: 资源分配状态 系统的安全状态
P1 P2 P3
5 2 2
5 2 7
T0时刻资源占用和需要情况,还空闲3台
例(续):假定在时刻T0它们分别占有磁带机 假定在时刻T0它们分别占有磁带机 T0 数为P1 P1: P2: P3: 数为P1:5台,P2:2台,P3:3台(1台空 ),此时系统处于一个不安全状态 此时系统处于一个不安全状态, 闲),此时系统处于一个不安全状态,因 为此时不存在任何安全序列。 为此时不存在任何安全序列。
例:考虑一个系统有12台磁带机和3个进程P1、P2、 P3。它们分别需要磁带机10台、4台和9台。假定 在某一时刻T0,它们分别占有磁带机数为P1:5台, P2:2台,P3:2台,系统还有3台空闲。此时系统 处于一种安全状态,因为序列〈P2,P1,P3〉是 一个安全序列。
进程 已占用资源 还需要资源
死锁避免算法---银行家算法 死锁避免算法
思想:当有一个进程要求分配若干资 源时,系统根据该算法判断此次分配是否 会导致系统进入不安全状态,若会,则拒: 为了简化算法的表述,引入一些记号: 为长度是n的向量, x≤y, * 令x、y为长度是n的向量,则x≤y,当且仅当 x[i]≤y[i]对所有i=1,2,,n都成立 对所有i=1,2,,n都成立。 x[i]≤y[i]对所有i=1,2,,n都成立。 如果x≤y x≤y且 x<y。 如果x≤y且x≠y, 则x<y。 矩阵的每一行当做一个向量, * 将Allocation 矩阵的每一行当做一个向量,第 i行表示 Pi 进程当前分得的资源,类似地对Need 进程当前分得的资源,类似地对Need 矩阵也作这种处理。 矩阵也作这种处理。
银行家算法描述如下: 银行家算法描述如下: 如下 进程的请求向量, 令Re quest i 是 Pi 进程的请求向量,如果Re quest i [ j ] = k 希望请求k i 类资源, 则进程 Pi 希望请求k个 r 类资源,当进程 Pi 提出一 个资源请求时,系统进行以下工作: 个资源请求时,系统进行以下工作: 则执行ⅱ 否则出错。 ⅰ,如果Re quest i ≤ Need i 则执行ⅱ,否则出错。 则执行ⅲ ⅱ,如果 Re quest i ≤ Available ,则执行ⅲ,否则 Pi 必须等待。 必须等待。 Pi 系统“假装” 所请求的资源, ⅲ,系统“假装”已分给 所请求的资源,并对系 统状态作如下修改: 统状态作如下修改:
我们还是回到前一个例子,系统有磁带机12台, 我们还是回到前一个例子,系统有磁带机12台 12 个进程, t0时刻 时刻: 3个进程,在t0时刻: P1 :有5台(还需5台) 还需5 P2 :有2台(还需2台) 还需2 P3 :有2台(还需7台) 还需7 系统余下3 系统余下3台。 在给进程分配余下的磁带机时, 在给进程分配余下的磁带机时,我们用银行家 算法来避免死锁的产生。 算法来避免死锁的产生。
Available = 3 2 = 1
Allocation2 = 2 + 2 = 4
Need 2 = 2 2 = 0
下面检查安全状态(调用安全性算法): 下面检查安全状态(调用安全性算法): ① work = Available = 1 i=1,2,3) Finish[i]=false (i=1,2,3) ② Need 2 = 0 < work = 1 Finish[2]=true 找到i=1 转② Need1 = 5 ≤ work = 5 找到i=1 ③ work = work + Allocation1 = 5 + 5 = 10 Finish[1]=true 找到i=3 转② Need 3 = 7 ≤ work = 10 找到i=3 找到i=2 找到i=2 ③ work = work + Allocation2 = 1 + 4 = 5
系统安全状态 如果系统可以按某种顺序把资源分 配给每个进程(直至最大要求), ),并且 配给每个进程(直至最大要求),并且 不出现死锁,那么系统的状态是安全的。 不出现死锁,那么系统的状态是安全的。 一个系统处于一个安全状态, 一个系统处于一个安全状态,仅当 存在一个安全序列 安全序列。 存在一个安全序列。
(3)分配矩阵Allocation 分配矩阵Allocation 这也是一个n*m矩阵, n*m矩阵 的意义同上, 这也是一个n*m矩阵,n、m的意义同上,若 Allocation[i,j]=k,则说明进程Pi当前已分 Allocation[i,j]=k,则说明进程Pi当前已分 Pi 类资源。 到k个 rj 类资源。 剩余需求矩阵Need (4)剩余需求矩阵Need 这也是一个n*m矩阵,n、m的意义同上,若 这也是一个n*m矩阵, 的意义同上, n*m矩阵 Need[i,j]=k,则说明进程Pi还需要k Pi还需要 Need[i,j]=k,则说明进程Pi还需要k个rj 类 资源。 资源。 存在关系: Need[i,j]=Max(i,j)-Allocation(i,j)
安全序列:一个进程序列〈 安全序列:一个进程序列〈Pi1, 1≤ik≤n,1≤k≤n, Pi2,…,Pin〉,1≤ik≤n,1≤k≤n,如 果对每个进程P 果对每个进程Pik ,其资源剩余需求量均可 由可用资源数加上所有P 由可用资源数加上所有Pir(r<k)当前已 占有的资源来满足的话, 占有的资源来满足的话,则称此序列是安 全序列。 全序列。 在此情况下,如果进程P 在此情况下,如果进程Pik 不能立即 成为可用的,Pik 要等待,直至所有Pir 成为可用的, 要等待,直至所有P 完成工作,然后P 完成工作,然后Pik 可获得它所需的全部 资源。 资源。
用于描述资源分配状态的数据结构有: 用于描述资源分配状态的数据结构有: 可用资源向量Available (1)可用资源向量Available 该向量的长度为系统内的资源类型数, 该向量的长度为系统内的资源类型数, Available[j]=k,则说明rj 若Available[j]=k,则说明rj 类资源当 前可用数为k 前可用数为k。 最大需求矩阵max (2)最大需求矩阵max 这是一个n*m矩阵, 为进程数, n*m矩阵 这是一个n*m矩阵,n为进程数,m为资 源类型数。 max[i,j]=k, 源类型数。若max[i,j]=k,则说明进程 Pi至多可以申请 至多可以申请k 类资源。 Pi至多可以申请k个rj 类资源。
③ work = work + Allocation3 = 10 + 2 = 12 Finish[3]=true 所有Finish[i]=true 则系统是安全的, Finish[i]=true, ④所有Finish[i]=true,则系统是安全的,即找到了 一个安全序列< P2 ,P1 , P3 >。 一个安全序列< >。
Available = Available Re questi
Allocationi = Allocationi + Re quest i
Need i = Need i Re quest i
作上述处理后,调用安全性算法检查系统状态, ⅳ,作上述处理后,调用安全性算法检查系统状态, 若系统仍处于安全状态,则真正实施分配;否则, 若系统仍处于安全状态,则真正实施分配;否则, Pi 拒绝该分配,恢复原来的状态, 等待。 拒绝该分配,恢复原来的状态,进程 等待。 那么,如何判断系统是否仍处于安全状态呢? 那么,如何判断系统是否仍处于安全状态呢?
P 很显然, 很显然,1 ,P3 所请求磁带机都大于余下的磁带 机数,因而若它们提出请求都必须等待, 机数,因而若它们提出请求都必须等待,若 P2 请求 余下的磁带机时, <Available(=3), 余下的磁带机时,则 Re quest2 = 2 <Available(=3), 执行ⅲ 执行ⅲ得:
进程 已占用资源 还需要资源
P1 P2 P3
5 2 3
5 2 6
T0时刻资源占用和需要情况,还空闲2台
所谓死锁的避免, 所谓死锁的避免,就是在资源动态分配过 程中,通过某种算法, 程中,通过某种算法,避免系统进入不安全状 态,从而就不会进入死锁状态。 从而就不会进入死锁状态。 说明: 说明: ①死锁是不安全状态 ②不安全状态并不一定就是死锁状态,它只 不安全状态并不一定就是死锁状态, 意味着存在导致死锁的可能。 意味着存在导致死锁的可能。
资源分配状态
资源分配状态, 资源分配状态,是指操作系统用一些数据结构 表示系统中各个时刻的每种资源分配给各个进程的 情况。 情况。 资源分配状态涉及的两个主体,一是进程,二 资源分配状态涉及的两个主体,一是进程, 是资源。为了提高系统资源的利用率, 是资源。为了提高系统资源的利用率,一个系统中 的资源往往是动态发配的, 的资源往往是动态发配的,资源分配状态数据结构 中的值是在不断变化的。 中的值是在不断变化的。
那么,如何判断系统是否仍处于安全状态呢? 那么,如何判断系统是否仍处于安全状态呢?安全 性检查算法如下: 性检查算法如下:
安全性检查算法: 安全性检查算法: work和Finish分别是长度为 分别是长度为m 的向量, 1、令work和Finish分别是长度为m和n的向量,初始 化:work=Available,Finish[i]=false i=1,2,,n ,n)。 (i=1,2, ,n)。 找到一个这样的i 2、找到一个这样的i: Finish[i]=false并且 ≤work, Finish[i]=false并且 Need i ≤work,如果没有这样 存在,转向步骤4 的i存在,转向步骤4。 Finish[i]=true,转步骤2 3、 work = work + Allocationi ,Finish[i]=true,转步骤2。 如果Finish[i]=true对于所有i都成立, Finish[i]=true对于所有 4、如果Finish[i]=true对于所有i都成立,则系统是 安全的,否则是不安全的。 安全的,否则是不安全的。 由上可见, 由上可见,安全性检查算法是银行家算法的子 算法,是由银行家算法调用的。 算法,是由银行家算法调用的。
第七章
死锁
资源分配状态 系统安全状态及安全序列 银行家算法
一、死锁的避免
死锁的避免是在产生死锁的四个充要条件可能 成立的情况下,使用一些方法以避免死锁的产生。 成立的情况下,使用一些方法以避免死锁的产生。 为讨论死锁的避免,我们引进一些新的概念: 为讨论死锁的避免,我们引进一些新的概念: 资源分配状态 系统的安全状态
P1 P2 P3
5 2 2
5 2 7
T0时刻资源占用和需要情况,还空闲3台
例(续):假定在时刻T0它们分别占有磁带机 假定在时刻T0它们分别占有磁带机 T0 数为P1 P1: P2: P3: 数为P1:5台,P2:2台,P3:3台(1台空 ),此时系统处于一个不安全状态 此时系统处于一个不安全状态, 闲),此时系统处于一个不安全状态,因 为此时不存在任何安全序列。 为此时不存在任何安全序列。
例:考虑一个系统有12台磁带机和3个进程P1、P2、 P3。它们分别需要磁带机10台、4台和9台。假定 在某一时刻T0,它们分别占有磁带机数为P1:5台, P2:2台,P3:2台,系统还有3台空闲。此时系统 处于一种安全状态,因为序列〈P2,P1,P3〉是 一个安全序列。
进程 已占用资源 还需要资源
死锁避免算法---银行家算法 死锁避免算法
思想:当有一个进程要求分配若干资 源时,系统根据该算法判断此次分配是否 会导致系统进入不安全状态,若会,则拒: 为了简化算法的表述,引入一些记号: 为长度是n的向量, x≤y, * 令x、y为长度是n的向量,则x≤y,当且仅当 x[i]≤y[i]对所有i=1,2,,n都成立 对所有i=1,2,,n都成立。 x[i]≤y[i]对所有i=1,2,,n都成立。 如果x≤y x≤y且 x<y。 如果x≤y且x≠y, 则x<y。 矩阵的每一行当做一个向量, * 将Allocation 矩阵的每一行当做一个向量,第 i行表示 Pi 进程当前分得的资源,类似地对Need 进程当前分得的资源,类似地对Need 矩阵也作这种处理。 矩阵也作这种处理。
银行家算法描述如下: 银行家算法描述如下: 如下 进程的请求向量, 令Re quest i 是 Pi 进程的请求向量,如果Re quest i [ j ] = k 希望请求k i 类资源, 则进程 Pi 希望请求k个 r 类资源,当进程 Pi 提出一 个资源请求时,系统进行以下工作: 个资源请求时,系统进行以下工作: 则执行ⅱ 否则出错。 ⅰ,如果Re quest i ≤ Need i 则执行ⅱ,否则出错。 则执行ⅲ ⅱ,如果 Re quest i ≤ Available ,则执行ⅲ,否则 Pi 必须等待。 必须等待。 Pi 系统“假装” 所请求的资源, ⅲ,系统“假装”已分给 所请求的资源,并对系 统状态作如下修改: 统状态作如下修改:
我们还是回到前一个例子,系统有磁带机12台, 我们还是回到前一个例子,系统有磁带机12台 12 个进程, t0时刻 时刻: 3个进程,在t0时刻: P1 :有5台(还需5台) 还需5 P2 :有2台(还需2台) 还需2 P3 :有2台(还需7台) 还需7 系统余下3 系统余下3台。 在给进程分配余下的磁带机时, 在给进程分配余下的磁带机时,我们用银行家 算法来避免死锁的产生。 算法来避免死锁的产生。
Available = 3 2 = 1
Allocation2 = 2 + 2 = 4
Need 2 = 2 2 = 0
下面检查安全状态(调用安全性算法): 下面检查安全状态(调用安全性算法): ① work = Available = 1 i=1,2,3) Finish[i]=false (i=1,2,3) ② Need 2 = 0 < work = 1 Finish[2]=true 找到i=1 转② Need1 = 5 ≤ work = 5 找到i=1 ③ work = work + Allocation1 = 5 + 5 = 10 Finish[1]=true 找到i=3 转② Need 3 = 7 ≤ work = 10 找到i=3 找到i=2 找到i=2 ③ work = work + Allocation2 = 1 + 4 = 5
系统安全状态 如果系统可以按某种顺序把资源分 配给每个进程(直至最大要求), ),并且 配给每个进程(直至最大要求),并且 不出现死锁,那么系统的状态是安全的。 不出现死锁,那么系统的状态是安全的。 一个系统处于一个安全状态, 一个系统处于一个安全状态,仅当 存在一个安全序列 安全序列。 存在一个安全序列。
(3)分配矩阵Allocation 分配矩阵Allocation 这也是一个n*m矩阵, n*m矩阵 的意义同上, 这也是一个n*m矩阵,n、m的意义同上,若 Allocation[i,j]=k,则说明进程Pi当前已分 Allocation[i,j]=k,则说明进程Pi当前已分 Pi 类资源。 到k个 rj 类资源。 剩余需求矩阵Need (4)剩余需求矩阵Need 这也是一个n*m矩阵,n、m的意义同上,若 这也是一个n*m矩阵, 的意义同上, n*m矩阵 Need[i,j]=k,则说明进程Pi还需要k Pi还需要 Need[i,j]=k,则说明进程Pi还需要k个rj 类 资源。 资源。 存在关系: Need[i,j]=Max(i,j)-Allocation(i,j)
安全序列:一个进程序列〈 安全序列:一个进程序列〈Pi1, 1≤ik≤n,1≤k≤n, Pi2,…,Pin〉,1≤ik≤n,1≤k≤n,如 果对每个进程P 果对每个进程Pik ,其资源剩余需求量均可 由可用资源数加上所有P 由可用资源数加上所有Pir(r<k)当前已 占有的资源来满足的话, 占有的资源来满足的话,则称此序列是安 全序列。 全序列。 在此情况下,如果进程P 在此情况下,如果进程Pik 不能立即 成为可用的,Pik 要等待,直至所有Pir 成为可用的, 要等待,直至所有P 完成工作,然后P 完成工作,然后Pik 可获得它所需的全部 资源。 资源。
用于描述资源分配状态的数据结构有: 用于描述资源分配状态的数据结构有: 可用资源向量Available (1)可用资源向量Available 该向量的长度为系统内的资源类型数, 该向量的长度为系统内的资源类型数, Available[j]=k,则说明rj 若Available[j]=k,则说明rj 类资源当 前可用数为k 前可用数为k。 最大需求矩阵max (2)最大需求矩阵max 这是一个n*m矩阵, 为进程数, n*m矩阵 这是一个n*m矩阵,n为进程数,m为资 源类型数。 max[i,j]=k, 源类型数。若max[i,j]=k,则说明进程 Pi至多可以申请 至多可以申请k 类资源。 Pi至多可以申请k个rj 类资源。
③ work = work + Allocation3 = 10 + 2 = 12 Finish[3]=true 所有Finish[i]=true 则系统是安全的, Finish[i]=true, ④所有Finish[i]=true,则系统是安全的,即找到了 一个安全序列< P2 ,P1 , P3 >。 一个安全序列< >。
Available = Available Re questi
Allocationi = Allocationi + Re quest i
Need i = Need i Re quest i
作上述处理后,调用安全性算法检查系统状态, ⅳ,作上述处理后,调用安全性算法检查系统状态, 若系统仍处于安全状态,则真正实施分配;否则, 若系统仍处于安全状态,则真正实施分配;否则, Pi 拒绝该分配,恢复原来的状态, 等待。 拒绝该分配,恢复原来的状态,进程 等待。 那么,如何判断系统是否仍处于安全状态呢? 那么,如何判断系统是否仍处于安全状态呢?
P 很显然, 很显然,1 ,P3 所请求磁带机都大于余下的磁带 机数,因而若它们提出请求都必须等待, 机数,因而若它们提出请求都必须等待,若 P2 请求 余下的磁带机时, <Available(=3), 余下的磁带机时,则 Re quest2 = 2 <Available(=3), 执行ⅲ 执行ⅲ得:
进程 已占用资源 还需要资源
P1 P2 P3
5 2 3
5 2 6
T0时刻资源占用和需要情况,还空闲2台
所谓死锁的避免, 所谓死锁的避免,就是在资源动态分配过 程中,通过某种算法, 程中,通过某种算法,避免系统进入不安全状 态,从而就不会进入死锁状态。 从而就不会进入死锁状态。 说明: 说明: ①死锁是不安全状态 ②不安全状态并不一定就是死锁状态,它只 不安全状态并不一定就是死锁状态, 意味着存在导致死锁的可能。 意味着存在导致死锁的可能。
资源分配状态
资源分配状态, 资源分配状态,是指操作系统用一些数据结构 表示系统中各个时刻的每种资源分配给各个进程的 情况。 情况。 资源分配状态涉及的两个主体,一是进程,二 资源分配状态涉及的两个主体,一是进程, 是资源。为了提高系统资源的利用率, 是资源。为了提高系统资源的利用率,一个系统中 的资源往往是动态发配的, 的资源往往是动态发配的,资源分配状态数据结构 中的值是在不断变化的。 中的值是在不断变化的。
那么,如何判断系统是否仍处于安全状态呢? 那么,如何判断系统是否仍处于安全状态呢?安全 性检查算法如下: 性检查算法如下:
安全性检查算法: 安全性检查算法: work和Finish分别是长度为 分别是长度为m 的向量, 1、令work和Finish分别是长度为m和n的向量,初始 化:work=Available,Finish[i]=false i=1,2,,n ,n)。 (i=1,2, ,n)。 找到一个这样的i 2、找到一个这样的i: Finish[i]=false并且 ≤work, Finish[i]=false并且 Need i ≤work,如果没有这样 存在,转向步骤4 的i存在,转向步骤4。 Finish[i]=true,转步骤2 3、 work = work + Allocationi ,Finish[i]=true,转步骤2。 如果Finish[i]=true对于所有i都成立, Finish[i]=true对于所有 4、如果Finish[i]=true对于所有i都成立,则系统是 安全的,否则是不安全的。 安全的,否则是不安全的。 由上可见, 由上可见,安全性检查算法是银行家算法的子 算法,是由银行家算法调用的。 算法,是由银行家算法调用的。