中南大学操作系统课程设计文档格式.docx
《中南大学操作系统课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《中南大学操作系统课程设计文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
第三章源代码清单 10
3.1 函数清单 10
3.2 各函数的调用关系图 12
第四章运行结果测试与分析 13
4.1 程序的正常输出结果 13
4.2 程序的差错控制 15
第五章结论与心得 18
[参考文献] 18
第一章问题描述
1.1课设题目重述
设计目的:
了解多道程序系统中,多个进程并发执行的资源分配。
设计要求:
管理员可以把一定数量的作业供多个用户周转使用,为保证作业的安全,管理员规定:
当一个用户对作业的最大需求量不超过管理员现有的资金就要接纳该用户;
用户可以分期贷款,但贷款的总数不能超过最大需求量;
当管理员现有的作业不能满足用户的所需数时,对用户的请求可以推迟支付,但总能使用户在有限的时间里得到请求。
当用户得到所需的全部作业后,一定能在有限的时间里归还所有的作业。
1.2问题分析
银行家算法是最具有代表性的避免死锁的算法。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
在死锁的避免中,银行家算法把系统状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免发生死锁。
所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,使每一个进程都可以顺利完成,即可找到一个安全资源分配序列。
所以我们需要解决问题有:
1)熟悉银行家算法的工作原理,明白如何判断系统处于安全状态,避免死锁。
2)在Windows操作系统上,如何利用Win32API编写多线程应用程序实现银行家算法。
3)创建n个线程来申请或释放资源,如何保证系统安全,批准资源申请。
4)通过Win32API提供的信号量机制,实现共享数据的并发访问。
1.3实验环境
操作系统:
windows8.1
实验语言:
c++
第二章系统设计
3.1主要数据结构
1)可利用资源向量Available。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Max。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵Allocation。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
4)需求矩阵Need。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j]。
3.2银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;
若是,才分配。
设进程cusneed提出请求REQUEST[i],如果REQUEST[cusneed][i],表示进程Pi需要K个Rj类型的资源。
则银行家算法按如下规则进行判断。
1)如果REQUEST[cusneed][i]<
=NEED[cusneed][i],则转向步骤
(2);
否则,出错,为它所需要的资源数已超过它所宣布的最大值。
2)如果REQUEST[cusneed][i]<
=AVAILABLE[cusneed][i],则转向步骤(3);
否则,出错,因为它所需要的资源数已超过它所宣布的最大值。
3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
5)对于某一进程i,若对所有的j,有NEED[i][j]=0,则表此进程资源分配完毕,应将占用资源释放。
根据以上步骤,所以银行家算法流程图如下所示
调用bank()函数
输入欲申请的资源的进程号与资源量
输入是否合法?
REQUEST[cusneed][i]<
=NEED[cusneed][i]?
=VAILABLE[cusneed][i]?
预分配
安全性检查
NEED[i][j]==0?
继续分配/退出
释放资源
N
Y
图1银行家算法流程图
3.3安全性检查算法
1)设置了两个变量
①工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目。
开始时,Work:
=Available。
②Finish,表示系统是否有足够的资源分配给进程,使之运行完成。
开始时令Finish[i]:
=false;
当有足够的资源分配给进程时,再令Finish[i]:
=true。
2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false;
②Need[i,j]≤Work[j];
若找到,执行步骤(3),否则,执行步骤(4)。
3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]∶=Work[i]+Allocation[i,j];
Finish[i]∶=true;
gotostep2;
4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;
否则,系统处于不安全状态。
根据以上步骤,所以安全性检查算法流程图如下所示:
调用safe()函数
work[]=available[]
finish[]=false
need[][]<
=work[]
finish[]=false?
work[]=work[]+allocation[][]
finish[]=true
所有进程的
finish[]==true?
输出安全序列,并打印出当前资源分配情况
输出提示:
系统不安全
调用结束
图2安全性检查算法流程图
3.4银行家算法安全性序列分析
假定系统中有五个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如表1所示:
表1T0时刻的资源分配表
资源情况
进程
Max
Allocation
Need
Available
ABC
P0
753
010
743
332
P1
322
200
122
P2
902
302
600
P3
222
211
011
P4
433
002
431
1)T0时刻的安全性:
表2T0时刻的安全序列
Work
Work+Allocation
Finish
532
TRUE
745
1047
1057
2)P1请求资源:
P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查:
①Request1(1,0,2)≤Need1(1,2,2)
②Request1(1,0,2)≤Available1(3,3,2)
③系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,由此形成的资源变化情况如表2所示:
表3系统先假定可为P1分配资源时刻的资源分配表
230
020
④再利用安全性算法检查此时系统是否安全。
表4P1申请资源时的安全性检查
3)P4请求资源:
P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:
①Request4(3,3,0)≤Need4(4,3,1);
②Request4(3,3,0)<
Available(2,3,0),让P4等待。
第三章源代码清单
3.1函数清单
工程中出现的所有自己编写的函数调用系统的重要函数,他们的函数功能都被列在这张表中了,如下表所示:
表5自己编写函数及功能形参列表
函数名
函数功能及其形参介绍
Main()
主函数,工程的入口,起点
Init()
初始