操作系统银行家算法课设

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

《操作系统原理B》

期末报告——

资源分配与调度

学生姓名

学生学号

学生班级

日期: 2020年4月23日

目录

资源分配与调度 (1)

1.设计目的 (1)

2.软件环境 (1)

3.要求 (1)

4. 需求分析 (1)

测试数据与测试结果(详见7.调试与测试)应该对应。 (1)

5.总体设计 (1)

(1) 逻辑结构与存储结构 (1)

(2) 主要算法基本思想 (1)

①主要算法 (1)

②程序流程图 (2)

6.详细设计 (2)

(1) 部分函数 (2)

(2) 源程序清单 (4)

7. 调试与测试 (12)

(1) 调试过程 (12)

(2) 测试数据 (12)

(3) 测试结果 (12)

①进入界面 (12)

②输入申请分配的进程号与资源量 (13)

③分配成功 (13)

④分配失败 (13)

8.总结 (13)

资源分配与调度

1.设计目的

(1)理解死锁的概念,了解导致死锁的原因。

(2)掌握死锁的避免方法,理解安全状态和不安全状态的概念。

(3)理解按银行家算法如何进行资源分配,能保证不发生死锁。

2.软件环境

在Visual C++ 6.0集成开发环境下,使用C语言编写程序实现资源分配,并对其进行测试与验证。

3.要求

(1)典型的避免死锁算法——银行家算法,其思想是分配资源之前,先判断系统是否处于安

全状态。若处于安全状态则分配资源,否则不进行分配。

(2)通过读文件操作来读取进程数量,已分配资源数矩阵,最大需求矩阵,以及各类资源的

总数。

(3)显示所有的安全序列。

(4)当进程动态申请资源时,设计银行家算法的数据结构和程序结构,判定是否存在资源分

配的安全序列。

(5)交互界面尽可能美观。

4.需求分析

(1)能够通过读取磁盘上的文件获得测试数据,用户能通过可视化的界面输入所需的对于各

个进程的资源分配;系统可以进行资源分配、安全性测试,提示用户分配结果。

(2)程序以人机对话的方式执行,即在计算机终端上显示相关提示信息后,由用户在键盘上

输入相应的运算命令或数据;相应的输入数据和运算结果显示在其后。

测试数据与测试结果(详见7.调试与测试)应该对应。

5.总体设计

(1)逻辑结构与存储结构

均使用数组连续存储。其中,已分配资源数矩阵Allocation、最大需求矩阵Max、各类资源All使用以矩阵的形式存储在磁盘上的txt文件中。

(2)主要算法基本思想

①主要算法

显示出已知的各类资源量,包括已分配资源数矩阵Allocation、最大需求矩阵Max、各个进程还需要的资源量Need、可用的资源量Available等。读入这些数据,利用数组的结构,以银行家算法的思想,按照输入申请分配的资源量进行分配,其间是进行了数组元素之间的加减运算,代表着一定的现实含义。然后进行安全性检测,如果能够找到安全序列则直接输出,若不能找到安全序列则重置资源量,询问是否再次分配,或进行下一次分配。

②程序流程图

6.详细设计

(1)部分函数

①void ChangeData(int k)//系统对进程请求响应,资源向量改变{

int j;

for (j = 0;j < N;j++)

{

Available[j] = Available[j] - Request[j];//响应请求,可用资源量减去请求资源量

Allocation[k][j] = Allocation[k][j] + Request[j];//已分配资源量加请求资源量

Need[k][j] = Need[k][j] - Request[j];//仍需要资源量减请求资源量

}

}

②void ResetData(int k)//未通过安全性检测后重置资源量

{

int j;

for (j = 0;j < N;j++)

{

Available[j] = Available[j] + Request[j];//恢复到假定分配以前

Allocation[k][j] = Allocation[k][j] - Request[j];

Need[k][j] = Need[k][j] + Request[j];

}

}

③int CheckSafe()//安全性检查函数:在假定分配资源的情况下检查系统的安全性

{

int Work[N], Finish[M], temp[M];//temp[]用来记录进程安全执行的顺序,以便输出安全序列

int i, j, m, k = 0, count;

for (i = 0;i < M;i++)

Finish[i] = FALSE;//作为标志

for (j = 0;j < N;j++)

Work[j] = Available[j];//把可利用资源数赋给Work[]:待进程使用完资源后,可用于此后其它进程for (i = 0;i < M;i++)//对于M个进程中的第i个

{

count = 0;//计数器

for (j = 0;j < N;j++)

if (Finish[i] == FALSE && Need[i][j] <= Work[j])//当第i个进程第j类类资源满足Need<=Work时count++;//计数器加1

if (count == N)//如果第i个进程各类资源都满足

{

for (m = 0;m < N;m++)

Work[m] = Work[m] + Allocation[i][m];//进程使用完资源后释放

Finish[i] = TRUE;//说明该进程可以进行

temp[k] = i;//记录下满足条件的进程号

k++;

i = -1;

}

}

for (i = 0;i < M;i++)

if (Finish[i] == FALSE)//如果存在着不能顺利进行的进程,说明无法找到安全序列;

{

相关文档
最新文档