1、0青岛理工大学操作系统课程设计报告院(系): 专业: 学 生 姓 名 : 班级: 学号: 题目: 银行家算法通用演示程序 起迄日期: 设计地点: 指 导 教 师: 20102011 年度 第 2 学期完成日期: 2011 年 7 月 2 日1目录一、 课程设计目的 2二、课程设计内容 .2三、系统分析与设计 .31、系统分析 .32、系统设计: .42.1、模块设计: 42.2、数据结构说明: 62.3、算法流程图: 7四、模块调试与系统测试 .121、模块调试 .122、系统测试 .123、调试分析: .14五、用户手册 .15六、程序清单 .17七、体会与自我评价 .26八、参考文献 .2
2、7九、课程设计评价 .272一、 课程设计目的操作系统是一门重要的专业基础课,是涉及较多硬件知识的计算机系统软件课程。操作系统是计算机系统的核心软件,它负责控制和管理整个系统的资源,并组织用户协调使用这些资源,提高计算机的工作效率。在计算机软硬件课程的设置上,它起着承上启下的作用。进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软
3、件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。银行家算法主要用于解决多种资源被多个独立执行的程序使用的安全算法。银行家算法采用矩阵存储资源的数据,通过对系统资源预分配后检查系统状态,以避免死锁的产生。Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。这里将客户比作进程,贷款比作设备,银行家比作系统。客户们各自做自己的生意
4、,在某些时刻需要贷款。在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。检查状态是否安全的方法是看他是否有足够的资源满足一个客户。如果可以,则这笔投资认为是能够收回的,然后接着检查下一个客户,如此反复
5、下去。如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。二、课程设计内容本次课程设计是编写一个银行家算法通用演示程序。银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全序列是指一个进程序列P1,Pn是安全的,如果对于每一个进程Pi(1in) ,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj (j =Available2
6、,3,0 让 P4 等待其它测试用例:测试项目 测试数据 预期结果 实际结果 结论打开文件 错误的例子.txt 提示:读取文件错误,请检查提示:读取文件错误,请检查符合打开文件 课本案例.txt 打开文件成功,显示出读取文件中的信息打开文件成功,显示出读取文件中的信息符合修改资源 空 提示:请选择一个项目 提示:请选择一个项目 符合修改资源 输入 a 提示:输入信息有误,请检查提示:输入信息有误,请检查符合修改资源 输入 8 将资源数量修改成输入的数值将资源数量修改成输入的数值符合添加资源 资源名称(aa) 提示:输入信息有误,请检 提示:输入信息有误,请 符合14和资源数目(a)查 检查添加
7、资源 资源名称(aa)和资源数目(10)提示:添加成功!显示添加资源的名称和资源的数量提示:添加成功!显示添加资源的名称和资源的数量符合添加进程 输入进程名称 pp提示:添加进程成功! 提示:添加进程成功! 符合添加进程 输入进程名称 pp重复输入进程 pp提示:添加进程失败!/n 此进程已存在或进程名称有误!提示:添加进程失败!/n此进程已存在或进程名称有误!符合修改进程 最大需求(aa)已分配(8)提示:输入信息有误,请检查!提示:输入信息有误,请检查!符合修改进程 最大需求(4)已分配(4)显示出修改的进程的最大需求和已分配数量显示出修改的进程的最大需求和已分配数量符合3、调试分析:在设
8、计本程序时,遇到的问题:(1). 问题:打开文件,当执行打开文件操作时,如何从文本文档载入数据,并将数据填充到主界面的 ListView 控件中。解决:通过在文本设置两个数字 m 和 n,分别代表资源数和进程数,通过 for 循环 m和 n 次来实现对资源和进程的读取,通过创建 ListViewItem的实例将数据填入主界面的 ListView 控件中。(2). 问题:计算安全序列时,如何判断系统资源满足进程的需要,如何实现查找所有的安全序列,以及代码优化。解决:程序中定义了一个 compare函数,用来比较系统资源和进程所需资源之间的关系。CheckSecurity 函数用来判断系统中,是否
9、有满足进程需要的资源,若无,则返回 false,若有,则将满足需求的进程放到集合 rq_able中,ExistSecurity函数实现了判断是否存在安全序列,并找出所有安全序列的功能,若程序中无安全序列,则返回 false,有安全序列,则将所有安全序列信息保存到 security_string字符串中。在此函数中用到类 SystemInfo,该类用来保存当前系统的信息,包括满足需求的资源,当前系统可用资源,进程 i是否满足,用 finishi保存。集合 resultClo中存放 SystemInfo类的实例,为查找后续的查找安全序列用,这样做能做到优化代码的作用。(3). 问题:删除操作(添加
10、操作雷同),当执行删除操作时,如何删除当前选定的资源,以及删除用到了本资源的进程中的资源。解决: 因为本程序中的资源信息都是放在 ArrayList 集合中的,当选定一个资源时,通过选定的行数 index,用 RemoveAt()方法删除第 index 个的资源信息,然后依次删除每个进程的第 index 个资源。(4). 问题:当一个进程满足所有资源分配后释放所有资源时,发现 available 中的数值没变。15解决:在 frmMain 中加载进程 loodProcess()信息时,进行判断,当进程的 Max 和Allocation 相等时应删除此进程,同时要将其所分配的资源加入到 avai
11、lable中。五、用户手册1、本程序是在 Windows7 操作系统下,用 Visual Studio 2010 .NET 平台开发平台下开发的软件。2、运行程序,将进入程序的主界面,弹出对话框,如下图所示:用户可以自己添加进程信息和资源信息,也可以通过打开已存在的文本来实现载入进程和资源信息,打开文件“课本案例” ,程序加载后,运行结果如下打开资源信息对话框,如下图所示:16点击添加资源按钮,弹出添加资源对话框,如下图所示:打开进程信息对话框,弹出对话框,如下图所示:打开检查中的安全序列,程序弹出显示出全部安全序列的对话框,如下图所示:17打开请求资源对话框,程序如下图所示:六、程序清单系统
12、中的关键算法有:CProcess类:public bool AddResource(int max, int alloc)/增加资源if (max 0; /置最后一个进程的finish值为truecurrent.rq_finish(int)current.rq_ablecurrent.rq_pcount = true; /获取该进程p = (CProcess)plist(int)current.rq_ablecurrent.rq_pcount; /系统当前可用资源为当前资源和进程p已分配资源之和Add(current.work, p.r_allocation);current.rq_pcoun
13、t = -1;/置当前满足需求进程为-1for (i = 0; i “; /遍历resultClo,超找出安全序列for (i = 0; i “;/添加最后一个系统状态信息中的进程sysInfo2 = (SystemInfo)resultCloi;p = (CProcess)plist(int)(sysInfo2.rq_able(int)sysInfo2.rq_pcount);security_string += p.p_name + “rn“;else if (resultClo.Count 0;/最后一个进程相关信息赋给current current.CopyFrom(SystemInfo
14、)resultCloresultClo.Count - 1); /移除resultClo最后一个进程有关信息resultClo.Remove(resultCloresultClo.Count - 1);/当最后一个resultClo元素满足需求数目为0while (current.rq_pcount = 0 /移除该系统状态resultClo.Remove(resultCloresultClo.Count - 1);23current.rq_pcount-;/当前系统信息满足需求进程数目-1/释放的资源和当前资源总和,在请求资源中作request+allocation用public void
15、Add(ArrayList a, ArrayList b)for (int i = 0; i = this.plist.Count)return false;if (index = this.r_available.Count)return false;this.rqindex = count;return true; public bool LoadFile(string filename)/读取文本内容,初始化进程信息和资源信息 FileStream f1;f1 = System.IO.File.OpenRead(filename);if (f1 = null) return false;
16、this.r_name.Clear();this.r_available.Clear();this.plist.Clear();StreamReader sr = new StreamReader(f1); try/读取资源信息string s1 = sr.ReadLine();int count = Convert.ToInt32(sr.ReadLine();/该数为系统资源数目for (int i = 0; i count; i+)24string sa = new string2;string s = sr.ReadLine();sa = s.Split( ); /以空格将读到的字符串分
17、割r_name.Add(sa0); /资源名称r_available.Add(Convert.ToInt32(sa1);/资源数量/读取进程信息s1 = sr.ReadLine();int pCount = Convert.ToInt32(sr.ReadLine();/进程数目 for (int i = 0; i pCount; i+)string sa = new string9;string s = sr.ReadLine();sa = s.Split( );CProcess p = new CProcess(sa0, 0);for (int j = 0; j 2 * count - 1;
18、 j = j + 2)int n1 = Convert.ToInt32(Convert.ToInt32(saj + 1);/进程所需的最大资源数目int n2 = Convert.ToInt32(Convert.ToInt32(saj + 2);/进程已分配的资源数目p.AddResource(n1, n2);plist.Add(p);/将其添加到进程列表中 catch (Exception)MessageBox.Show(“读取文件错误,请检查! “, “提示信息“, MessageBoxButtons.OK, MessageBoxIcon.Information);sr.Close();f
19、1.Close();return true; 主窗体 frmMain.cs/载入进程信息public void LoadProcess()/当进程满足所有资源分配后能够进行释放所有资源,退出资源竞争for (int i = 0; i banker.plist.Count; i+)int j;for (j = 0; j banker.r_name.Count; j+)25if (int)(CProcess)banker.plisti).r_needj = 0)continue;else break;if (j = banker.r_name.Count)MessageBox.Show(“进程“
20、+ (CProcess)banker.plisti).p_name + “已满足需求,释放资源“, “提示信息“, MessageBoxButtons.OK, MessageBoxIcon.Information);banker.DelProcess(CProcess)banker.plisti).p_name);listView1.Items.Clear();for (int i = 0; i banker.plist.Count + 1; i+)/依次读入每个进程string str1;if (i = 0)/载入资源名称ListViewItem tmp1 = new ListViewIte
21、m(“ “);str1 = “;for (int j = 0; j banker.r_name.Count; j+)str1 += banker.r_namej.ToString() + “ “;tmp1.SubItems.Add(str1);tmp1.SubItems.Add(str1);tmp1.SubItems.Add(str1);tmp1.SubItems.Add(str1);listView1.Items.Add(tmp1);continue;CProcess p = (CProcess)banker.plisti - 1;ListViewItem tmp = new ListVie
22、wItem(p.p_name);str1 = “;for (int j = 0; j banker.r_name.Count; j+)str1 += (int)p.r_maxj).ToString(“0 “);tmp.SubItems.Add(str1);str1 = “;for (int j = 0; j banker.r_name.Count; j+)26str1 += (int)p.r_allocationj).ToString(“0 “);tmp.SubItems.Add(str1);str1 = “;for (int j = 0; j banker.r_name.Count; j+)
23、str1 += (int)p.r_needj).ToString(“0 “);tmp.SubItems.Add(str1);if (i = 1)/载入系统可分配的资源str1 = “;for (int j = 0; j banker.r_available.Count; j+)str1 += (int)banker.r_availablej).ToString(“0 “);tmp.SubItems.Add(str1);listView1.Items.Add(tmp);七、体会与自我评价操作系统的基本特征是并发和共享。系统允许多个进程并发执行,并且共享系统的硬件、软件资源。为了最大限度的利用计算
24、机系统资源,操作系统应采用动态分配的策略,但是这样就可能因资源不足,分配不当而引起“死锁”。而这次课程设计就是利用银行家算法来避免死锁。本次操作系统课程设计按照上面的思路展开,逐步分析,逐渐实现了该项目的各个功能。本程序较完整的实现了“银行家算法”,包括资源信息、进程信息的编辑,检查安全序列,请求资源,进程资源的释放等,为用户展示了银行家算法的实现过程。实现了程序所需的数据可读取样例数据进行资源种类、数目与进程数的初始化。在程序设计过程中,也遇到了一些问题,这些问题主要是实现银行家算法,用到的一些数据结构,以及如何利用这些数据结构来实现算法,通过反复思考,对课本知识的再次复习,以及查阅资料,使
25、这些问题一一得到解决。通过这次课程设计,我有很多收获,从中学到了很多东西。这次课程设计不仅使我对课本知识有了深刻的理解,更对计算机操作系统的功能,特征等有了进一步的认识。除了知识上的东西,我也锻炼了自己的快速学习能力,我学会了如何快速有效地从书本、网络等获取自己所需要的信息,如何通过一个程序开发平台(.NET 平台),将程序设计思路付诸现实,编写成一个可视化的程序。同时,也锻炼了自己解决实际问题的能力,在程序开发过程中,难免遇到各种各样的问题,每次的课程设计总会锻炼我们在解决这方面问题的能力,使我受益匪浅。总之,课程设计是很有必要的,我们要利用好每次课程设计的机会,认真做好课程设计题目,从中发现问题,解决问题,以此来提高我们各方面的能力。27由于课程设计时间有限,程序难免有些不足,但基本实现了本次课程设计的要求。在此要感谢老师,在我课程设计过程中给予我的帮助。八、参考文献1 汤子瀛 编著, 计算机操作系统(第三版) ,西安电子科技大学出版社, 2007 年2 谭桂华等编著, visual C# 高级编程范例 , 清华大学出版社 2004 年 5 月3 郑耀东编著, ASP.NET2.0 编程指南 ,人民邮电出版社, 2007 年4 MSDN http:/ 九、课程设计评价课程设计评价成绩: 教师:年 月 日