实验三死锁的检测和解除

合集下载

实验三 死锁的检测与避免

实验三 死锁的检测与避免

实验三死锁的检测与避免1.实验目的通过本实验,使学生进一步了解死锁、系统安全与不安全和资源动态分配的概念,学会编程实现银行家算法检验系统状态是否安全的方法,从而为将来在实际系统中使用该方法打下基础。

2.实验内容1.输入并显示资源类型数,进程数,每类资源的个体数;2.输入每个进程对每类资源的最大需求量,已分量,算出其剩余需求量。

算出系统每类资源的当前剩余量;显示输入和计算出的数据;3.按银行家算法检测系统当前是否处于安全状态,若是,往下;若否,转1,重新设置数据;4.给出某个进程的资源分配请求,按死锁避免方法检测可否将资源分配给它?若可,输出一个进程安全序列、资源分配成功的说明和新的系统资源分配状态表;若否,输出“资源分配失败”和失败的原因:①,申请量大于系统的当前剩余量,②,申请量大于自己的剩余需求量,③,若分配系统将处于不安全状态。

4.实验方法和步骤(含设计)初始化算法流程图:银行家算法流程图:安全性算法流程图:源代码:#include<iostream>using namespace std;#define MAXPROCESS 50 //最大进程数#define MAXRESOURCE 100 //最大资源数int AVAILABLE[MAXRESOURCE]; //可用资源数组int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵int ALLOCATION[MAXPROCESS][MAXRESOURCE]; //分配矩阵int NEED[MAXPROCESS][MAXRESOURCE]; //需求矩阵intREQUEST[MAXPROCESS][MAXRESOURCE]; //进程需要资源数bool FINISH[MAXPROCESS]; //系统是否有足够的资源分配int p[MAXPROCESS]; //记录序列int m,n; //m个进程,n个资源void Init();bool Safe();void Bank();int main(){ Init();//初始化函数Safe();//安全性检测函数Bank();//银行家算法 }void Init(){ int i,j;cout<<"请输入进程的数目:";cin>>m;cout<<"请输入资源的种类:";cin>>n;cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>MAX[i][j];cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++){ for(j=0;j<n;j++){ cin>>ALLOCATION[i][j];NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];if(NEED[i][j]<0){cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;j--; continue; } } }cout<<"请输入各个资源现有的数目:"<<endl;for(i=0;i<n;i++){ cin>>AVAILABLE[i];}}void Bank(){ int i,cusneed;char again;while(1){cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl; cin>>cusneed;cout<<"请输入进程所请求的各资源的数量"<<endl;for(i=0;i<n;i++){ cin>>REQUEST[cusneed][i];}for(i=0;i<n;i++){ if(REQUEST[cusneed][i]>NEED[cusneed][i]){ cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;continue;}if(REQUEST[cusneed][i]>AVAILABLE[i]){ cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;continue;}}for(i=0;i<n;i++){ AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i]; }if(Safe()){ cout<<"同意分配请求!"<<endl;}else{ cout<<"您的请求被拒绝!"<<endl;for(i=0;i<n;i++){ AVAILABLE[i]+=REQUEST[cusneed][i];ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];NEED[cusneed][i]+=REQUEST[cusneed][i];} }for(i=0;i<m;i++){ FINISH[i]=false;}cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;cin>>again;if(again=='y'||again=='Y'){ continue;} break; }}bool Safe(){ int i,j,k,l=0;int Work[MAXRESOURCE]; /*工作数组*/for(i=0;i<n;i++) Work[i]=AVAILABLE[i];for(i=0;i<m;i++){ FINISH[i]=false;}for(i=0;i<m;i++){if(FINISH[i]==true){ continue;}else{ for(j=0;j<n;j++){ if(NEED[i][j]>Work[j]){ break;} }if(j==n){ FINISH[i]=true; for(k=0;k<n;k++){ Work[k]+=ALLOCATION[i][k];} p[l++]=i; i=-1;}else{ continue; } }if(l==m){ cout<<"系统是安全的"<<endl;cout<<"安全序列:"<<endl;for(i=0;i<l;i++){ cout<<p[i];if(i!=l-1){ cout<<"-->"; } }cout<<""<<endl;return true;} }cout<<"系统是不安全的"<<endl;return false; }数据结构设计:1.可利用资源向量矩阵AVAILABLE。

数据库死锁的检测与解决办法

数据库死锁的检测与解决办法

数据库死锁的检测与解决办法死锁是在并发环境下经常出现的一种资源竞争问题。

当多个进程或线程需要访问相同资源,但又无法获得对方所持有的资源时,就会导致死锁的发生。

数据库系统作为高效管理和组织数据的关键组件,也不能免于死锁问题的困扰。

本文将介绍数据库死锁的检测与解决办法,帮助管理员和开发人员更好地处理这一问题。

首先,我们需要了解死锁的产生原因。

在数据库系统中,数据访问和操作是通过事务来完成的。

事务是一组数据库操作,要么全部执行成功,要么全部回滚失败。

当多个事务同时进行并且涉及相同的数据时,就有可能出现死锁的情况。

数据库系统使用锁机制来管理并发访问,保证数据的一致性和完整性。

然而,死锁的发生可能是由于事务对锁的获取顺序不当或者资源竞争引起的。

因此,为了检测和解决死锁,我们可以采取以下几种策略:1. 死锁检测:死锁检测是通过系统周期性地对数据库资源进行扫描,检查是否存在死锁的情况。

常用的死锁检测算法有图检测算法、等待图算法和超时算法等。

其中,图检测算法是最常用的一种方法,它将事务和资源看作节点,并通过边来表示事务对资源的依赖关系。

如果图中存在环路,则表示发生了死锁。

系统可以根据这些算法提供的信息来处理死锁情况。

2. 死锁预防:死锁预防是通过约束系统资源的使用方式和事务的执行顺序来防止死锁的发生。

常见的死锁预防策略有资源有序分配法、资源抢占法和事务等待法等。

资源有序分配法要求系统为每个资源指定一个固定的获取顺序,使得事务按照相同的顺序请求资源,从而避免了死锁的产生。

资源抢占法则是在一个事务等待资源的时候,如果发现死锁可能发生,系统会选择抢占它正在使用的资源,从而打破死锁的循环。

事务等待法要求事务在获取资源之前释放已经持有的资源,避免了事务之间相互等待的情况。

3. 死锁恢复:当检测到死锁发生时,系统需要采取相应的措施来解决死锁问题。

常用的死锁恢复策略有回滚、终止和剥夺等。

回滚策略要求将所有涉及到死锁的事务回滚到某个安全点,从而解锁被死锁事务占用的资源。

死锁的检测与解除C语言代码

死锁的检测与解除C语言代码

if(i>0)
break;
printf("%2d",available[j]);
}
printf("\n");
}
}
主要数据结构
和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M]; int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];
流程图

开始 输入总进程
数 输入资源数
输入 Allocation 矩阵
输入 Request 矩阵
输入 available 矩阵
是否发生死锁 是
死锁解除
结束
运行结果
图(1)不会发生死锁时 图(1)当发生死锁时
附录
源代码如下:
# include "stdio.h" # define M 50 int allocation[M][M]; int request[M][M]; int available[M]; int line[M]; int no[M]; int n,m,i,j,f,a=0; main() {
if(f==0) { printf("该系统将发生死锁!\n");
printf("造成死锁的进程为:"); for(i=0;i<n;i++) printf("%2d",no[i]); printf("\n"); remove(); show(); } else{ printf("不会发生死锁!\n"); }

数据库死锁的检测与解决策略(三)

数据库死锁的检测与解决策略(三)

数据库死锁的检测与解决策略引言:数据库是现代应用程序中广泛使用的关键组件之一。

然而,当多个事务同时访问数据库时,死锁问题是一个常见而严重的挑战。

本文将讨论数据库死锁的检测与解决策略,以帮助读者更好地理解和解决这一问题。

一、死锁的定义和原因死锁指的是两个或多个事务相互等待对方释放资源,导致所有事务都无法继续执行的状态。

造成死锁的原因通常包括以下情况:1. 争夺相同资源:当多个事务同时请求相同的资源时,可能会因互相等待对方释放资源而导致死锁。

2. 循环等待:多个事务之间存在循环依赖关系,例如,事务A等待事务B占用的资源,而事务B又等待事务C占用的资源,以此类推,形成循环依赖关系导致死锁。

二、死锁的检测方法为了及时发现和解决死锁问题,数据库系统通常采用以下两种主要的死锁检测算法:1. 等待图算法(Wait-for Graph Algorithm):该算法通过构建一个等待图来检测死锁。

等待图是一个有向图,其中每个事务表示为一个节点,每个边表示一个事务等待另一个事务所占用的资源。

通过检测等待图中是否存在环,可以判断是否存在死锁。

如果存在环,则表示出现死锁。

2. 死锁检测器算法(Deadlock Detector Algorithm):该算法周期性地扫描数据库系统中的所有事务和资源,查找潜在的死锁。

这种方法的优点是实时性强,但计算复杂度较高。

三、死锁的解决策略一旦死锁被检测到,数据库系统可以采取以下几种策略来解决死锁问题:1. 死锁回滚(Deadlock Rollback):将其中一个或多个死锁事务回滚到最初的状态,以解除死锁。

这种策略的优点是简单快速,但可能会导致数据的不一致性,因为回滚可能会撤销已经提交的事务。

2. 死锁剥夺(Deadlock Preemption):当检测到死锁时,主动中断一个或多个事务,以解除死锁。

被中断的事务可以选择重新执行或放弃执行。

这种策略的优点是确保数据库系统继续运行,但会影响正在运行的事务的性能。

死锁的检测与解除

死锁的检测与解除

操作系统(实验报告)死锁的检测与解除姓名:*****学号:****专业班级:***学验日期:2011/12/2指导老师:***一、实验名称:死锁的检测和解除二、实验内容:编程实现对操作系统死锁的检测和解除,利用数据的动态输入,解锁时采用的是释放占用系统资源最大的进程的方法来实现。

三、实验目的:熟悉死锁检测与的解除的算法,深入理解死锁的检测与解锁的具体方法,加深对死锁问题深刻记意。

并且进一步掌握死锁的条件,死锁定理等相关知识。

四、实验过程1.基本思想:利用资源分配图来理解此问题,可以认为此图就是由一组结点N和一组边E 所组成的一个对偶G=(N1E);把N分为互斥的两个子集进程P结点和资源R 结点,进程结点集和资源结点集,凡是属于E中的一个边,都连接着P中的一个结点和R中的一个结点由P中的一个结点指向R中的一个结点是资源请求边,而由R中的一个结点指向P中的一个结点的边称为资源分配边,在这个图中找到一个既不阻塞又不独立的结点Pi,如果是在顺利的情况下,则该进程可以获得足够资源而继续运行,运行完释放所有资源,这就可以说是消除了它的请求边和分配边,让它成为一个孤立的点,再继续,分配给请求资源的进程……这样循环下去直到所有的进程都能成为孤立的点,或是出现了无法消除的环状,若是出现了环状,即出现了死锁,采取释放占用资源最多的进程的方法来解决问题,直到最后所有的进程结点P均成为孤立的点。

解锁才算成功,程序才能结束。

2.主要数据结构:(1)可利用资源向量Available.这是一个含有m类资源的数组,用来表示每种资源可用的的数量。

(2)把不占用任何资源,且没有申请资源的进程,列入数组finish中,并赋值true。

(3)从进程集合中找到一个Request<=Work的进程,做如下的处理:将其资源分配图简化,释放出资源,增加Work的量,做Work=Work+Allocation 并将它的标志位finish也设为true.(4)如果不能把所有的进程标志位都赋值为true,则出现了死锁,开始采取解锁的方案。

死锁的检测与解除(操作系统实验报告)

死锁的检测与解除(操作系统实验报告)
三、设计思路:
1.输入系统进程数量n和资源类型数量m。
2.输入每类资源的数量。
3.输入每个进程每类资源的最大需求量和已获资源量。
4.检验系统的安全系。
5.若检测结果为系统不安全,可以对死锁进行解除,直到安全为止,再检测。
6.重复5操作,直到所有进程运行完毕。
四、实验结果与结论:(经调试正确的源程序和程序的运行结果)
composite4.setData("name","composite4");
formToolkit.adapt(composite4);
formToolkit.paintBordersFor(composite4);
/*--------------------------------标签---------------------------------------*/
formToolkit.adapt(composite3);
formToolkit.paintBordersFor(composite3);
composite3.setLayout(stackLayout2);
composite4=newComposite(composite3, SWT.BORDER);
label_5.setBounds(0, 55, 112, 26);
label_5.setData("name","label_5");
formToolkit.adapt(label_5,true,true);
label_5.setText("最大资源需求量");
label_6=newLabel(composite4, SWT.NONE);

实验3(死锁)

实验3(死锁)

实验3 死锁一、目的与要求1. 目的学生应独立的采用高级语言编写一个动态分配系统资源的程序,模拟死锁现象,观察死锁发生的条件,并采用适当的算法,有效地防止死锁的发生。

学生应通过本次实验,更直观的了解死锁发生的原因,初步掌握防止死锁、解除死锁的简单方法,加深理解教材中有关死锁的内容。

2. 要求(1)设计一个几个并发进程共享m个系统资源的系统。

进程可动态的申请资源和释放资源,系统按各进程的申请动态的分配资源。

(2)系统应能显示各进程申请和释放资源的过程,能显示系统动态分配资源的过程,便于观察和分析。

(3)系统应能选择是否采用防止死锁的算法,应设计多种防止死锁的算法,并能任意选择其中任何一种投入运行,同时要求,在不采用防止死锁算法时观察死锁现象发生的过程,在使用防止死锁的算法时,了解在同样条件下防止死锁发生的过程。

(4)本次实验的上机时间为2~4学时。

(5)所有程序均应采用C语言编写程序,特别需要的部分可采用汇编语言便程序。

二、实验内容1.题目本次实验采用银行算法防止死锁的发生。

设有3个并发进程共享10个系统资源。

在3个进程申请系统资源之和不超过10时,当然不可能发生死锁,因为各个进程资源都能满足。

在有一个进程申请的系统资源数超过10时,必然会发生死锁。

应该排队这两种情况。

程序采用人工输入各进程的申请资源序列。

如果随机给各进程分配资源,就可能发生死锁,这也就是不采用防止死锁算法的情况。

假如,按照一定的规则,为各进程分配资源,就可以防止死锁的发生。

示例采用银行算法。

这是一种犹如“瞎子爬山”的方法,即探索一步,前进一步,行不通,再往其它方向试探,直至爬上山顶。

这种方法是比较保守的,所花的代价也不小。

2.算法与框图银行算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应付各种客户的借贷周转,为了防止银行因资金无法周转而倒闭,对每一笔贷款,必须考察其最后是否能归还。

研究死锁现象时就碰到类似的问题,有限资源为多个进程共享,分配不好就会发生每个进程都无法继续下去的死锁僵局。

死锁的检测与解除

死锁的检测与解除

死锁的检测与解除--操作系统实验报告题目:死锁的检测与解除指导老师:班级:姓名:学号:时间:实验二 死锁的检测与解除一、实验目的系统为进程分配资源时并不一定能满足进程的需求,因此检测系统的安全性是非常有必要的。

安全性的检测在之前的实验中用银行家算法得以实现,此次实验增加了另一个问题:即当系统死锁时如何解除死锁。

通过此次实验,可以深刻的体会死锁的检测与解除的方法。

二、实验内容编程实现死锁的检测与解除,并上机验证。

实验环境:Microsoft Visual Studio 2010三、算法描述程序中的数据结构:1) 可用资源向量Available : 这是一个含有m 个元素的数组,其中的每一个元素代表一类可利用资源数目。

2) 最大需求矩阵Max : 它是一个n m ⨯的矩阵,定义了系统中n 个进程中得每一个进程对m 类资源的最大需求。

3) 可分配矩阵Allocation : 这也一个n m ⨯的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。

4) 需求矩阵Need : 这表示每一个进程尚需的各类资源数。

5) 综上所述:[][][][][][]Need i j Max i j Allocation i j =-。

该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。

1) 设i request 是进程i P 的请求向量,如果[]i request j K =,表示进程i P 需要K 个j R 类型起源。

当i P 发出资源请求后,进行检查,如果合格,修改Available 、Allocation 、Need 的值。

2) 用安全性算法检查是否存在安全序列,如果存在,输出安全序列;如果不存在,即为死锁,进行解锁操作。

3) 统计[,]Allocation i j 的值,找出占用资源最多的进程i P ,将其撤销,回收占用的资源,修改一下的数据结构中的值:[]:[]+[,]Available j Available j Allocation i j =;[,]:0Allocation i j =;用安全性算法进行检查,如果仍有死锁,重复步骤3,知道解锁为止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南华大学计算机科学与技术学院实验报告课程名称操作系统I姓名学号专业班级任课教师日期一、实验内容死锁的检测与解除二、实验目的掌握操作系统的进程管理与资源分配原理,掌握对操作系统安全性检验和死锁的解除的原理和方法。

三、实验题目系统中有m 个同类资源被n 个进程共享,每个进程对资源的最大需求数分别为S1,S2,…,Sn,且Max(Si)<=m, (i=1,2,…n)。

进程可以动态地申请资源和释放资源。

编写一个程序,实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。

否则,推迟分配,并显示适当的信息。

分别使用检测“进程—资源循环等待链”的方法和Coffman 的算法来检测进程的死锁状态。

对于相同的进程资源分配、占用次序,比较两个算法的结果。

四、设计思路和流程图1.输入系统进程数量n和资源类型数量m。

2.输入每类资源的数量。

3.输入每个进程每类资源的最大需求量和已获资源量。

4.检验系统的安全。

5.若检测结果为系统不安全,可以对死锁进行解除,直到安全为止再检测。

6.重复5操作,直到所有进程运行完毕。

五、主要数据结构及其说明int Max[100][100]={0}; //各进程所需各类资源的最大需求; int Available[100]={0}; //系统可用资源;char Name[100]={0}; //资源的名称;int Allocation[100][100]={0}; //系统已分配资源;int Need[100][100]={0}; //还需要资源int Request[100]={0}; //请求资源向量;int Temp[100]={0}; //存放安全序列;int Work[100]={0}; //存放系统可提供资源;bool Finish[100]={0};//存放已完成的序列六、源程序并附上注释#include "stdafx.h"#include<iostream>#define False 0#define True 1using namespace std;int Max[100][100]={0}; //各进程所需各类资源的最大需求;int Available[100]={0}; //系统可用资源;char Name[100]={0}; //资源的名称;int Allocation[100][100]={0}; //系统已分配资源;int Need[100][100]={0}; //还需要资源int Request[100]={0}; //请求资源向量;int Temp[100]={0}; //存放安全序列;int Work[100]={0}; //存放系统可提供资源;bool Finish[100]={0};int M=100; //作业的最大数int N=100; //资源的最大数int l=0;//记录安全进程的TEMP下标void ShowData()//初始化资源矩阵{int i,j;cout<<"系统可用资源[Available]:"<<endl;for(i=0;i<N;i++)cout<<Name[i]<<" ";cout<<endl;for(j=0;j<N;j++)cout<<Available[j]<<" ";//显示可分配的资源cout<<endl;cout<<" Max Allocation Need"<<endl;cout<<"进程名";for (j=0;j<3;j++)//MAX ALLOCATION NEED 共列{for (i=0;i<N;i++){cout<<Name[i]<<" ";}cout<<" ";} cout<<endl;for(i=0;i<M;i++){cout<<" "<<i<<" ";//输出进程名for(j=0;j<N;j++)cout<<Max[i][j]<<" ";//输出最大cout<<" ";for(j=0;j<N;j++)cout<<Allocation[i][j]<<" ";//输出已分配cout<<" ";for(j=0;j<N;j++)cout<<Need[i][j]<<" ";//输出需求cout<<endl;}}bool Safe() //安全性算法{int i,j,k;for(i=0;i<N;i++)Work[i]=Available[i]; //初始化工作向量for(i=0;i<M;i++){Finish[i]=false; //判断进程i是否已执行}for(i=0;i<M;i++){if(Finish[i]==true){continue;} else{for(j=0;j<N;j++) //验证每一个资源的需求量是否小于可用资源量{if(Need[i][j]>Work[j]){break;}}if(j==N)//若Need都小于Work{Finish[i]=true;for(k=0;k<N;k++){Work[k]+=Allocation[i][k]; //进程i执行完后回收资源}Temp[l++]=i;i=-1;}else{continue;}}if(l==M){cout<<"系统是安全的"<<endl;cout<<"安全序列:"<<endl;for(i=0;i<l;i++){cout<<Temp[i];if(i!=l-1){cout<<"-->";}}cout<<""<<endl;return true;}}for(i=0;i<M;i++)if(Finish[i]==false)cout<<"会发生死锁,发生死锁的进程是:"<<i<<" "<<endl;cout<<endl;return false;}void unlock(){int i,j;i=0;cout<<"死锁解除开始";cout<<endl;while(i<M&&Finish[i]==false) //查找未完成的进程{for(j=0;j<N;j++){Available[j]+=Allocation[i][j]; //回收该进程所有资源Allocation[i][j]=0;}if(Safe())cout<<"死锁已解除"<<endl;elsei++;//到下一个进程Safe();}}int main(){int i,j,number,m,n,flag;int over;char mc;cout<<"--------------------------死锁的检测与解除----------------------------------";cout<<endl;cout<<endl;cout<<"输入当前系统可供使用资源种类的数量:";cin>>n;N=n;for (i=0;i<n;i++){cout<<"资源"<<i+1<<"的名称:";cin>>mc;Name[i]=mc;cout<<"资源"<<i+1<<"的数量:";cin>>number;Available[i]=number;cout<<endl;}cout<<endl;cout<<"请输入作业的数量:";cin>>m;M=m;cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;for (int i=0;i<m;i++)for (int j=0;j<n;j++){cin>>Max[i][j];}do{flag=0;cout<<"请输入各进程已经分配资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;for (int i=0;i<m;i++)for (j=0;j<n;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j])flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)cout<<"首次输入的已分配资源已经大于最大需求量请重新输入!\n";}while(flag);// 当申请资源符合要求时end doShowData();//显示Safe();//安全检测if(l!=m)//当安全进程数不等于所有进程数unlock();cout<<"运行结束"<<endl;cin>>over;}七、程序运行时的初值和运行结果八、实验体会通过本次实验,比较完整的掌握了操作系统的进程管理与资源分配原理,以及对操作系统安全性检验和死锁的解除的原理和方法。

相关文档
最新文档