操作系统课程设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
计算机工程学院
计算机科学与技术专业
__
: 仿真模拟银行家算法对死锁的避免 _
____
1、本次课程设计通过编写和调试一个仿真模拟银行家算法避免死锁的程序,观察产生
死锁的,条件,并采用银行家算法,有效地避免死锁的发生。
2、了解多道程序系统中,多个进程并发的动态资源分配。在多道程序系统中,由于在
内存中驻留了多道程序,他们共享资源,并发执行,动态的申请资源。
3、掌握产生死锁的原因、产生死锁的必要的条件和处理死锁的基本方法。
4、掌握死锁的方法,系统安全的基本概念。
5、掌握最具有代表性的避免死锁的算法——银行家算法,了解资源在进程并发执行过
程中的资源分配策略。
6、提高运用操作系统知识解决实际问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
的能力,锻炼实际的编程能力,提高调查研究
的能力,提高查阅技术文献、
资料
新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单
以及编写软件设计文档的能力。
本次课程设计的内容是采用银行家算法,编写和调试一个仿真模拟银行家算法避免死锁
的程序。设计n个并发进程共享3类不同的系统资源,即1类资源、2类资源、3类资源。进程可以动态的申请资源,系统按各个进程的申请动态的分配资源。可以添加进程,进程动
态的申请资源,系统进行安全性检查,判断是否可以为申请资源的进程分配资源。如果能够
找到安全序列,则系统为进程分配资源,否则原先的试探分配资源作废。 1
系统分析是指把要解决的问题作为一个系统,对系统要素进行综合分析,找出解
决问题的可行
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
的咨询方法。系统分析是一种研究方略,它能在不确定的情况下,
确定问题的本质和起因,明确咨询目标,找出各种可行方案,并通过一定
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
对这些
方案进行比较,帮助决策者在复杂的问题和环境中做出科学抉择。系统分析是咨询研
究的最基本的方法,我们可以把一个复杂的咨询项目看成为系统工程,通过系统目标
分析、系统要素分析、系统环境分析、系统资源分析和系统管理分析,可以准确地诊
断问题,深刻地揭示问题起因,有效地提出解决方案和满足客户的需求。
本系统是仿真模拟银行家算法避免死锁。系统中存在3类进程可共享的资源,3类资源的数目分别为:10、5、7。进程可动态的申请资源。进程申请资源后,系统首先判断其申
请的资源数目是否小于其需求资源数目和目前系统可利用资源数目。如果小于,系统试探着
把资源分配给进程,并修改进程对应的数据结构中的数值。然后系统执行安全性算法,检查
此次资源分配后系统是否处于安全状态。若安全,才真正将资源分配给进程,以完成本次分
配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让此次申请资源的进程等待。 2
本系统设计两个窗体,主窗体用来添加进程,副窗体用来检查资源分配后系统是否出于
安全状态。
1、主窗体含有三个板块,一个添加进程板块,一个用来显示目前系统内资源分配情况
的板块,一个进程申请资源的板块。
(1)添加进程板块:需在一个textbox中给出进程名,而且进程名必须是唯一的,使用
三个combobox让用户选择进程执行所需要系统为之分配的最大资源数目,一个button按钮,用来提交用户进行的操作,如果用户没有给出进程名,那么进程名默认为进程+系统内总进程数目减一。
(2)显示板块:使用listview控件以表格形式显示,当用户提交新添加的进程后,在
显示板块会显示出此进程的进程名、所需各种资源的最大数目、系统已分配的资源数目、此
进程还需的各种资源数目,而且将系统目前可利用各种资源数目显示出来。
(3)申请资源板块:使用一个combobox让用户选择需要申请资源的进程名,在控件combobox中只含有用户已经输入的进程名,用户只需选择。使用三个combobox让用户选择进程申请各种资源的数目,一个button按钮,用来提交是哪个进程申请了什么资源及其数目。
2、副窗体含有两个板块,一个是显示系统试探着把资源分配给进程的后板块,一个是
利用安全算法显示安全的资源分配情况板块。
(1)显示资源分配后的板块:系统试探着将资源分配给申请资源的进程,并将分配后
的结果使用listview控件以表格形式显示到窗体上,并将系统剩余资源显示到窗体上。listview控件上还应该显示是哪个进程申请的资源。
(2)显示安全的资源分配情况板块:一个button按钮,用来检查系统是否处于安全状
态,若处于安全状态,则在listview控件中列出对资源分配情况的分析,并在只读的textbox中输出安全序列。
3、本系统附带一个例子,假定在系统中有5个进程{p0,p1,p2,p3,p4},在t0时刻的资源分配情况如图所示:
资源 Max Allocation Need Available 进程 1类 2类 3类 1类 2类 3类 1类 2类 3类 1类 2类 3类 P0 7 5 3 0 1 0 7 4 3 3 3 2 P1 3 2 2 2 0 0 1 2 2 P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P4 4 3 3 0 0 2 4 3 1
表3.1 系统附带课本实例表格
使用一个button按钮,命名为课本实例。点击此按钮后,进程数组被初始化为{p0,p1,p2,p3,p4},各个进程的信息如上图所示,然后进程进行资源申请。
3
本系统含有三个模块,即添加进程模块、申请资源模块、检查安全性模块。这三个模块
全部都使用到类Progress,其定义如下:
public class Progress
{
private string name; //进程名,是唯一的,任两个进程不能重名
public int[] Max = new int[3]; //进程最大可申请的各种资源的数目
public int[] Allocation = new int[3];//系统已分配给进程的各种资源的数目
public int[] Need = new int[3]; //进程还需要的各种资源的数目
public int[] Request = new int[3]; //存放进程提出申请各种资源的数目
}
各模块之间的调用关系如图:
主窗体
添加进程申请资源
副窗体
图3.1 模块间调用关系 检查系统(1)添加进程模块
安全性本模块包括一个textbox,3个combobox,一个button,在textbox中输入进程名,在combobox中选择进程所需要申请的最大资源数,点击button按钮进程提交用户的操作。 本模块所用到的数据类型有:
Progress progress = new Progress();//创建新进程
Progress[] allProgress = new Progress[50];//存放添加的所有进程
progressNumber = 0;//进程数目,每添加一个新进程都加1 (2)申请资源模块
本模块进程动态的申请资源,包括4个combobox,一个button。在第一个combobox中选择申请资源的进程名,在此combobox中的进程名都是用户已添加的进程名。另外三个
combobox选择进程申请的各种资源的数目。点击button按钮提交用户所做的操作。 本模块所用的数据类型有:
Progress[] allProgress = new Progress[50];//系统已含有的所有进程
int[] Available = new int[3] { 10, 5, 7 };//资源数组
int temp; //提出申请的资源号
Progress pro = new Progress(); //创建新进程
BankForm bankfrm = new BankForm(this); //创建新的副窗体 (3)检查安全性模块
本模块是系统进行安全性检查模块,检查在此时刻系统是否处于安全状态,如果能够找
到一个安全序列,说明系统出于安全状态,否则处于不安全状态。本模块包括一个listview控件,用来显示找到安全序列后,系统安全分配资源的情况;一个textbox,用来显示安全序列;一个button按钮,点击button按钮系统进行安全性检查,检查后的结果会显示在
listview和textbox中。
本模块所用到的数据类型有:
bool message = false;//作为找到安全序列的标志,值为true则找到安全序列
static Progress[] allProgress=new Progress[ 50];//系统中目前所有的进程
static int progressNumber; //系统目前的进程数
static int[] Available = new int[3]; //存放系统目前可利用资源数目
int temp; //目前申请资源的进程号
SafeXuLie[] safexulie; //存放安全序列
int[] progressQueue = new int[BankForm.progressNumber]; //存放安全序列的进
程号
int t=0;
int k = 0; // progressQueue的号
int[] work = new int[3]; //系统释放一定的资源后可利用资源数目
BankForm.Available.CopyTo(work, 0);//置Work[i]=Available[i]
int[] Finish = new int[BankForm.progressNumber];
int[] need = new int[3];
int[] allocation = new int[3];
safexulie = new SafeXuLie[BankForm.progressNumber];
public class SafeXuLie //填充副窗体的ListView控件时使用 {
public int[] work;
public int[] need;
public int[] allocation;
public int[] workAllocation;
public SafeXuLie(); //构造方法
}
4
本次课程设计中使用了类Progress,类SafeXuLie,类MainForm,类BankForm,它们的定义及在程序中的作用如下:
(1)类Progress
在程序中创建进程,保存进程的全部信息,包括进程名、进程可申请的最大资源数目、
系统已分配给进程的资源数目、进程执行还需要申请的资源、进程申请资源数目。其具体定
义如下:
public class Progress
{
private string name; //进程名,是唯一的,任两个进程不能重名
public int[] Max = new int[3]; //进程最大可申请的各种资源的数目
public int[] Allocation = new int[3];//系统已分配给进程的各种资源的数目
public int[] Need = new int[3]; //进程还需要的各种资源的数目
public int[] Request = new int[3]; //存放进程提出申请各种资源的数目
public string Name //进程名的属性
{
get { return name; } //获得进程名
set { name = value; } //设置进程名
}
public Progress (){}; //不含参数的构造方法,用来创建进程
// 含3个参数构造方法,name是进程名
// m是最大可申请的各种资源的数目数组
// a是系统已分配给进程的各种资源的数目数组
// n是进程还需要的各种资源的数目数组
public Progress (string name,int[] m,int[] a,int[] n);
}
(2)类SafeXuLie
类SafeXuLie在程序中用于保存进程的部分信息,包括:工作向量work,表示系统可提供给进程继续运行所需的各种资源数目,在执行安全序列算法时置为系统目前可利用资源
数目;需求向量need,某一进程还需申请的资源数目;分配向量allocation,表示系统中每
一类资源当前已分配给某一进程的资源数系统;workAllocation,系统分配资源后,假定进
程执行完毕后释放的资源加上系统中原有的可利用资源数目。其具体定义如下: public class SafeXuLie //填充副窗体的ListView控件时使用 {
public int[] work;// 系统可提供给进程继续运行所需的各种资源数目
public int[] need;// 某一进程还需申请的资源数目
public int[] allocation;//系统已分配给某一进程的资源数系统
public int[] workAllocation;//进程执行完毕后,系统可利用资源数目
public SafeXuLie()//构造方法
{
work = new int[3];
need = new int[3];
allocation = new int[3];
workAllocation = new int[3];
}
}
(3)类MainForm
创建主窗体,初始化主窗体,给主窗体添加程序中所用到的控件,点击窗体上的控件触
发事件。其具体定义如下:
public partial class MainForm : Form
{
private Progress progress = new Progress(); //创建进程progress
public Progress[] allProgress = new Progress[50];//存放添加的所有进程
private int progressNumber = 0;//进程数目
public int[] Available = new int[3] { 10, 5, 7 };//资源数组
private int temp; //提出申请的资源号
public MainForm(); //初始化主窗体
private void button1_Click(object sender, EventArgs e);//关闭主窗体 //进程申请资源,点击主窗体上的申请资源板块的确定按钮触发此事件
private void ApplyResourcebutton_Click(object sender, EventArgs e);
//添加新进程,点击主窗体上的添加新进程板块的确定按钮触发此事件
private void AddProgressButton_Click_1(object sender, EventArgs e);
//判断进程名是否唯一,若唯一则返回true,否则返回false
public bool nameUnique();
// 填充ListView控件
public void fillListView(ListView listView1, int[] a);
// 填充ListView控件,此控件中首列是进程名
public void fillListView(Progress progress1, ListView listView1, int[] a);
// 更新ListView控件的第temp个项目
public void updateListView(int temp, ListView listView, int[] a);
// 更新ListView控件的第0个项目,用来更新窗体上显示的系统可利用资源数目
public void updateListView(ListView listView, int[] a);
//初始化主窗体上的控件的值
private void MainForm_Load(object sender, EventArgs e);
// 检查进程申请的资源数目是否小于其需求数目,若小于则返回true
public bool checkApplyResNeed(Progress p)
// 检查进程申请的资源数目是否小于可利用资源数目,若小于则返回true
public bool checkApplyResAvail(Progress p)
// 将进程数组a中的数据复制到进程数组b中
public void copyto(Progress[] a, Progress[] b)
// 课本上的实例,给进程数组设置一个实例
private void Examplebutton_Click(object sender, EventArgs e)
}
(4)类BankForm
创建副窗体,初始化副窗体,给副窗体添加程序中所用到的控件,点击窗体上的控件触
发事件。其具体定义如下:
public partial class BankForm : Form
{
private bool message = false; //作为找到安全序列的标志
private Progress progress = new Progress();//创建进程对象 //主窗体的进程数组副本
public static Progress[] allProgress=new Progress[ 50]; //所有进程
public static int progressNumber; //进程数
public static int[] Available = new int[3]; //系统可利用资源数目
public int temp; //申请资源的进程号
public MainForm mainfrm; //声明主窗体对象,用来往主窗体传值
private SafeXuLie[] safexulie;//存放安全序列,进程名组成
public BankForm(); //初始化副窗体,不含参数构造方法 public BankForm(MainForm maf);//初始化副窗体,参数是主窗体对象 //给副窗体上的控件置初值
private void BankForm_Load(object sender, EventArgs e);
//点击窗体上返回按钮,关闭副窗体并向主窗体传值
private void button1_Click(object sender, EventArgs e);
//点击窗体上检查安全性按钮
private void SafeButton_Click(object sender, EventArgs e);
public bool safeSequence(int[] progressQueue); //安全算法
public bool Compare(int [] a,int [] b); // 比较两个数组的大小
public void fill(int[] a) // 填充listViewWork控件,a是安全序列 }
5
(1)进程申请资源的流程图:
i++
否i<进程数?
是否
在进程数组
中找到此进程?是
给进程的
Request否向量置值
是
否Request<Need?
是
创建副窗体,错误信息
向副窗体传值,Request<
Available?并弹出副窗体
图3.2 申请资源流程图 返回
(2)系统进行安全性检查的流程图:
Work=Available;
K=0;i=0
否i<进程数?
是
是Finish[i]==false?
否
Need<=Work?是
否Work=Work+allFinish[i]=true;ocation[i];i=-1;i++
是否
return truereturn false K==进程数?
图3.3 银行家算法流程图
1
(1)添加进程板块
, 输入的形式和输入值的范围:
本程序需用户在主窗体的textbox中输入新添加的进程的进程名,进程名由任意字
符组成,任意两个进程不允许重名。如果用户没有输入进程名,系统默认进程名为“进
程”+系统中已存在的进程数。然后用户需选择新添加的进程执行所需要的最大资源数
目。本系统共有三类进程可共享的资源,即1类资源、2类资源、3类资源,其数目分别为10、5、7。
, 输出的形式:
用户点击确定按钮后,所进行的操作提交给系统,本系统以表格的形式,将用户输
入的进程的信息显示在窗体的listview控件上。
, 程序所能达到的功能:
本模块达到的功能是向系统添加新进程,并向用户显示出来。 (2)进程申请资源板块
, 输入的形式和输入值的范围:
本模块需用户在combobox中选择申请资源的进程名,在这个combobox中的进程名包含系统中已存在的所有进程名。然后用户在后三个combobox中选择进程所申请的各资源的数目。
, 程序所能达到的功能:
点击确定按钮后,程序首先判断进程的申请是否合法,如果不合法,会弹出错误信
息。如果合法,则弹出副窗体进行安全性检查。进程的request被置成用户所申请
的值。
(3)系统检查安全性板块
, 输入的形式和输入值的范围:
本模块没有输入值。
, 输出的形式:
用户点击检查安全性按钮后,如果能够找到安全序列,结果会以表格的形式显示在
副窗体的listview上,给用户直观的显示结果。如果找不到安全序列,则弹出错误信息。 , 程序所能达到的功能:
系统进行安全性检查,寻找安全序列,判断系统在分配完资源后是否处在安全状态。
2
(1)输入如下测试数据:
资源 Max Allocation Need Available 进程 1类 2类 3类 1类 2类 3类 1类 2类 3类 1类 2类 3类
5 3 2 0 0 0 5 3 2 10 5 7
4 3 3 0 0 0 4 3 3
7 3 3 0 0 0 7 3 3
表4.1 测试数据表
点击添加按钮,结果如下图所示,由于没有输入进程名,系统默认进程名分别为进程0,进程1,进程2。
图4.1
(2)然后进程0发出请求向量{3,2,2},进入父窗体,在第一个表格中,带有阴影的
一行是目前申请资源的进程名。点击检查安全性按钮,结果如图所示,能够找到安全序
列,并将安全序列输出,显示系统对资源分配情况的分析:
图4.2
点击返回按钮,回到主界面,由于可以找到一个安全序列,说明系统处于安全状态,可
以把资源分配给进程0,分配结果如图所示,进程0的allocation、need已经改变,系统可利用资源数目available也已经发生改变,由原来的{10,5,7}变为{7,3,5}:
图4.3
(3)进程1发出请求向量{5,2,3},由于发出的请求向量大于进程1最大可申请资源数目,系统提示申请资源错误,如下图所示:
图4.4
(4)将进程1发出的请求向量改为{3,2,3},进入副窗体。点击检查安全性按钮,系统找到安全序列。点击返回按钮,回到主窗体。结果如图所示:
图4.5 (5)进程2发出请求向量{3,1,2},点击确定按钮,进入副窗体。点击检查安全性按
钮,由于系统剩余的可利用资源数目{1,0,0}已经不能满足任何进程的需求,故系统提示安全性错误,如下图所示:
图4.6
点击返回按钮,结果如图所示,系统不给进程2分配资源,表格中的数据不发生变化,此图应与图4.5中的数据一样,如下图所示:
图4.7
3
(1)在写银行家算法时,由于我将银行家算法避免死锁理解错了,我原以为需要将所有的
安全序列都求出来。仔细学习了有关死锁的知识,发现银行家算法只需找出一个安全
序列即可说明系统处于安全状态。将算法写出来后,银行家算法的程序很快就写出来
了。
(2)调试程序时,进程申请资源,一个进程第一次申请资源,可以得到正确结果,但当这
个进程第二次申请资源时,结果总是不正确,系统分配给它的资源总是两次申请的请
求向量的和。通过对程序单步调试,发现在设置进程请求向量时,用的是pro.Reques
t[0] += int.Parse(this.comboBox1.Text);这样将原来的请求向量也加上了。将请求
响亮改为pro.Request[0] = int.Parse(this.comboBox1.Text);程序就能够运行处
正确的结果。
(3)测试程序时发现,点击多次检查安全性按钮,listview控件中就会添加一次数据,没
有将listview中原有的数据清空。在点击安全性按钮触发的事件中先添加清除原来的
数据,然后再用新数据填充。这样如果多次点击检查安全性按钮,listview终究不会
重复添加数据了。
1、本程序的运行环境是Microsoft Visual Studio 2008,所使用的语言是C#,操作系统是 Windows XP。
2、该系统无需安装,但它的运行需要机器安装.NET Framework运行时环境。 3、程序使用说明:
(1)开始运行程序,会弹出主界面,如下图所示:
图5.1
界面最上面显示目前系统中存在的进程数,当前为0。表格中显示目前系统中可用资源数目
分别为{10,5,7}。
(2)在进程名右边的textbox中键入进程名,在下面的combobox中选择进程对各个资源可申请的最大数目,点击确定按钮后,进程的信息就显示在上面的表格中,进程名就会自动添
加到右面申请资源板块“选择申请资源的进程名”的combobox中,如图所示:
图5.2 (3)用户可以在申请资源板块选择申请资源的进程名以及申请资源的数目,点击确定按钮
后,弹出副窗体,第一个表格中有阴影的一行是申请资源的进程的信息。然后点击检查安全
性按钮,系统进行安全性检查,并输出结果,如图所示:
图5.3 (4)点击返回按钮,回到主界面,如果找到安全序列,则修改申请资源的进程的信息以及
系统可利用资源,如下如所示:
图5.4
(5)点击退出按钮,弹出下图,点击是则退出,点击否留在当前页面。
图5.5
(1)定义类Progress程序清单
public class Progress
{
private string name;//进程名,是唯一的,任两个进程不能重名
public int[] Max = new int[3];//进程最大可申请的各种资源的数目
public int[] Allocation = new int[3];//系统已分配给进程的各种资源的数目
public int[] Need = new int[3];//进程还需要的各种资源的数目
public int[] Request = new int[3];//存放进程提出申请各种资源的数目
public string Name
{
get { return name; }//获得进程名
set { name = value; }//设置进程名
}
//不含参数的构造方法,用来创建进程
public Progress (){}
///
/// 含3个参数构造方法,name是进程名
/// m是最大可申请的各种资源的数目数组
/// a是系统已分配给进程的各种资源的数目数组
/// n是进程还需要的各种资源的数目数组
///
///
///
///
///
public Progress (string name,int[] m,int[] a,int[] n)
{
this.name = name;
m.CopyTo(Max, 0);
a.CopyTo(Allocation, 0);
n.CopyTo(Need, 0);
}
(2)添加进程程序清单
private void AddProgressButton_Click_1(object sender, EventArgs e)
{
//若用户在窗体上的textbox中没有输入内容,默认进程名
if (this.textBoxProgressName.Text == "")
{
//默认进程名
this.textBoxProgressName.Text = "进程" + this.progressNumber.ToString();
}
//置进程名为用户在窗体上的textbox中输入的内容
progress.Name = this.textBoxProgressName.Text;
//新进程的进程名是否与原有的进程重名
if (nameUnique())//新进程的进程名与原有的进程不重名
{
//创建新进程
allProgress[this.progressNumber] = new Progress();
//设置进程名为用户输入的进程名
allProgress[this.progressNumber].Name = progress.Name;
//设置进程最大可需1类资源数目
allProgress[this.progressNumber].Max[0] =
int.Parse(this.comboBoxFirstReource.Text);
//设置进程最大可需2类资源数目
allProgress[this.progressNumber].Max[1] =
int.Parse(this.comboBoxSecondReource.Text);
//设置进程最大可需3类资源数目
allProgress[this.progressNumber].Max[2] =
int.Parse(this.comboBoxThirdReource.Text);
//置设置进程目前还需资源数目初始值等于最大可需求资源数目
allProgress[this.progressNumber].Max.CopyTo(allProgress[this.progressNum
ber].Need, 0);
//将进程信息填充到窗体的listview控件中
fillListView(progress, this.MainMaxlistView,
allProgress[this.progressNumber].Max);
fillListView(this.MainNeedlistView,
allProgress[this.progressNumber].Need);
fillListView(this.MainAllocationlistView,
allProgress[this.progressNumber].Allocation);
//将进程名添加入申请资源时用户需选择的进程名
this.comboBoxProgressName.Items.AddRange(new object[] { progress.Name });
this.progressNumber++;//进程数加1
//窗体上显示的进程数加1
this.labelProgressnumber.Text = this.progressNumber.ToString();
}
else//新进程的进程名与原有的进程重名
{
MessageBox.Show("已有这个进程名,请改一下进程名使其是唯一的!", "创建进
程错误");
}
this.comboBoxProgressName.SelectedIndex = 0;
this.textBoxProgressName.Text = "";
}
(3)进程申请资源程序清单:
private void ApplyResourcebutton_Click(object sender, EventArgs e)
{
Progress pro = new Progress();//创建新进程
for (int i = 0; i < this.progressNumber; i++)
{
if (allProgress[i].Name.Equals (this.comboBoxProgressName.SelectedItem))
{
pro = this.allProgress[i];
pro.Request[0] = int.Parse(this.comboBox1.Text);
pro.Request[1] = int.Parse(this.comboBox2.Text);
pro.Request[2] = int.Parse(this.comboBox3.Text);
temp = i;
break;
}
}
//pro.Request[i]<=pro.Need[i],进程申请资源数小于其需求数
if (checkApplyResNeed(pro))
{
//pro.Request[i]<=pro.Available[i],进程申请资源数小于资源可利用资源数
if (checkApplyResAvail(pro))
{
BankForm bankfrm = new BankForm(this);//创建新的副窗体
copyto(this.allProgress, BankForm.allProgress);//创建进程副本
BankForm.progressNumber = this.progressNumber;//向副窗体传递进程数目
this.Available.CopyTo(BankForm.Available, 0);//向父窗体传递目前系统可
//利用资源数目
bankfrm.temp = this.temp;//传递给副本申请资源的进程号
bankfrm.Show();//显示副窗体
}
else
{
//置进程申请资源的数目为0
pro.Request[0] = 0;
pro.Request[1] = 0;
pro.Request[2] = 0;
MessageBox.Show("此进程请求资源数大于系统目前可用资源数!","申请资源
错误");
}
}
else
{
//置进程申请资源的数目为0
pro.Request[0] = 0;
pro.Request[1] = 0;
pro.Request[2] = 0;
MessageBox.Show("此进程请求资源数大于其需求数!", "申请资源错误");
}
}
(4)求安全序列算法程序清单:
//安全算法
public bool safeSequence(int[] progressQueue)
{
int t=0;
int k = 0;
int[] work = new int[3];
BankForm.Available.CopyTo(work, 0);//置Work[i]=Available[i]
int[] Finish = new int[BankForm.progressNumber];
int[] need = new int[3];
int[] allocation = new int[3];
safexulie = new SafeXuLie[BankForm.progressNumber];
BankForm.Available.CopyTo(work, 0);
//将Finish全部置成false
for (int i = 0; i < BankForm.progressNumber; i++)
{Finish[i] = 0;}
for (int i = 0; i < BankForm.progressNumber; i++)
{
if (Finish[i] == 0)
{
BankForm.allProgress[i].Need.CopyTo(need, 0);//得到进程i的need
BankForm.allProgress[i].Allocation.CopyTo(allocation, 0);//得到进程i的
//allocation
this.safexulie[t] = new SafeXuLie();
work.CopyTo(this.safexulie[t].work, 0);
BankForm.allProgress[i].Need.CopyTo(this.safexulie[t].need, 0);
BankForm.allProgress[i].Allocation.CopyTo(this.safexulie[t].allocation, 0);
if (Compare(work, need)) //Finish[i]为false且Work[i]>=Need[i]
{
//当进程i可以获得资源,顺利执行后,释放原来已经分配给它的资源
for (int j = 0; j < 3; j++)
{
work[j] = work[j] + allocation[j];//释放获得的第j个资源
}
Finish[i] = 1;//置对应的Finish为真
progressQueue[k++] = i;//将进程号存放入progressQueue中
work.CopyTo(this.safexulie[t++].workAllocation, 0);//获取work+allocation
i = -1;
}
}
}
if (k == BankForm.progressNumber)//相等则找到安全序列
{
this.message = true;//置message为真
return true;
}
else return false;
}
通过本次课程设计,使我对操作系统的整体有了进一步的认识,对死锁有了更深的认识。
操作系统是计算机系统中最重要的系统软件,它是计算机系统中各种资源的管理者和各种活
动的组织者、指挥者。在多道程序系统中,虽然可以借助于多个进程的并发执行来改善系统
的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。目前,处理死锁的方法
有:预防死锁,避免死锁,检测死锁,解除死锁。避免死锁,把系统分为安全状态和不安全
状态,只要使系统始终处于安全状态,便可避免发生死锁。虽然并给所有的不安全状态都必
然转化为死锁状态,但当系统进入不安全状态后,便有可能进而进入死锁状态;反之,只要
系统处于安全状态,系统便可避免进入不安全状态。因此,避免死锁的实质在于:系统在进
行资源分配时,如何使系统不进入不安全状态。
在做本次课程设计时,我遇到了许多问题。我用的编程环境是Microsoft Visual Studio 2008,编程语言是C#,一门刚刚学习的语言,还不是很熟悉,有些语法还没有完全掌握。
因此在编程时,总是遇到各种各样的问题。比如,主窗体向副窗体传值,副窗体对数据进行
一定的处理后,再将值传回主窗体,由于对这方面不了解,我在网上查阅了有关窗体之间传
值的资料,最终将问题解决。在编写银行家算法时,由于我将算法想错了,我本以为需要将
所有的安全序列都列举出来,致使问题困难化了。后来,我问了一下身边的同学,发现我将
算法完全想错。其实,银行家算法只是判断当进程申请资源时,系统是否可以将资源分配给
它。系统只需找到一个安全系列,就可以将资源分配给申请资源的进程,否则不分配资源。
想清楚之后,银行家算法很快就写出来了。
通过本次课程设计,进一步提高了我的程序调试能力。在程序的雏形完成时,运行程序
会出现各种各样的异常。有些异常很简单就可以找到其产生的原因,但有些异常只有单步调
试才能发现其产生的原因。找到原因后,就可以很容易的解决异常。
[1] 汤子瀛 编著,《计算机操作系统(修订版)》,西安电子科技大学出版社,2001年
[2] 汤子瀛 哲凤屏 汤小丹编著,《计算机操作系统辅导教材》,电子科技大学出版社,1994
年
[3] 微软公司 编著,《VISUAL C#语言参考手册》,清华大学出版社,2002年 [4] Christian Nagel,Bill Evjen,Jay Glynn编著,《c#高级编程(第4版)》,清华大学出版社,2006年
[5] 冉林仓 尹健民 编著,《VISUAL C#.NET入门与进阶》,清华大学出版社,2003年 [6] 周湘贞、曾宪权编著,《操作系统原理与实践教程》,清华出版社,2004年
课 程 设 计 评 价
成绩: 教师:
年 月 日