操作系统银行家算法课设
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)//如果存在着不能顺利进行的进程,说明无法找到安全序列;
{