华北科技学院计算机学院综合性实验
实 验 报 告
课程名称 计算机操作系统 实验学期 2013 至 2014 学年 第 1 学期 学生所在系部 计算机 年级 大三 专业班级 计科B113 学生姓名 黄宋 学号 201107014313 任课教师 王祥仲 实验成绩
计算机学院制
华北科技学院计算机学院综合性实验报告
《计算机操作系统》课程综合性实验报告
第 1 页
第 2 页
第 3 页
第 4 页
华北科技学院计算机学院综合性实验报告
第 5 页
目录
一、 需求分析…………………………………………………2
二、 系统概要设计……………………………………………2
三、系统详细设计………………………………………………4
四、系统主要源代码……………………………………………5
五、系统测试及调试……………………………………………5
六.、心得体会……………………………………………………8
七、参考文献……………………………………………………9
八、附录…………………………………………………………9
操作系统课程设计报告
课设内容简介:
银行家算法的模拟实现。
一、需求分析
控制工作流程 ,管理资源,为用户服务,是操作系统的主要功能。在资源管理中,操作系统的任务是使各种系统资源得到充分合理的应用,解决用户作业因资源而产生的矛盾,并合理的让用户再合适的时间内得到其应有的服务。
现代操作系统引入了多道程序设计技术,允许锁个进程同时驻留内存并发执行。若干个进程将不可避免地竞争系统资源,如果操作系统不能够协调多个进程对系统资源的竞争与共享,将会导致执行结果异常,系统不稳定、失效等多种问题,从而产生死锁,产生死锁的原因可分为两种:(1)竞争资源引起死锁(2)进程推进顺序不当引起死锁。
银行家算法是一种代表性的避免死锁的算法,在进程申请资源的时候,系统调用银行家算法来检测此次分配会不会导致死锁的产生,及判断此次分配的安全性。若检测到此次分配是安全的则分配给申请进程所申请的资源,若检测到此次分配是不安全的,则相应的进程等待。
二、系统概要设计
(1)系统主要功能:系统运用银行家算法先对用户提出的计算机系统资源请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查,后决定是否给相应进程动态分配资源。
(2)系统模块功能结构:
(3)运行环境要求:
相关工具:
Microsoft Visual C++ 6.
(4)数据结构设计及相关说明:
(1)、可利用资源向量 INT AVAILABLE[M] M为资源的类型。
(2)、最大需求矩阵 INT MAX[N][M] N为进程的数量。
(3)、已分配矩阵 INT ALLOCATION[N][M]
(4)、还需求矩阵 INT NEED[N][N]
(5)、申请各类资源数量int Request[x]; //
(6)、工作向量 int Work[x];
(7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是
三、系统详细设计
(1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等
(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。
(3)、检查用户的请求是否小于还需求的数量,条件是 K<=NEED[I,J]。如果条件不符则提示重新输
入,即不允许索取大于需求量
(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=AVALIABLE[I,J]。如果条件不
符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)
(5)、进行资源的预分配,语句如下:
AVALIBLE[I][J]= AVALIBLE[I][J]-K;
ALLOCATION[I][J]= ALLOCATION[I][J]+K;
NEED[I][J]=NEED[I][J]-K;
(6)、系统调用安全性检查算法(safe()函数)进行检查,如果检查通过,则不用回收,否则进行
回收,进程资源申请失败进入等待。
4、安全性检查算法(safe()子函数)
(1)、设置两个临时变量。
(2)、在进程中查找符合以下条件的进程。
条件1:FINISH[I]=0
条件2:NEED[I][J]〈=WORK[J]
(3)、如果查找成功则进行资源的模拟回收,语句如下:
WORK[J]=WORK[J]+ALLOCATION[I][J];
FINISH[I]=1 或查找到的顺序号
(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功
标志。否则返回成功标志。
四、系统主要原代码见附录!!
五、系统测试及调试
5.1
5.3 出现问题及解决方案:
本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。下面大致罗列一些主要问题:
5.3.1关于输入错误的异常处理:数字判断
在调试程序过程中我们都知道在要求输入整型数据时,如不小心键入字母符号等,则程序立即出错;还有如在要求输入一个字符时,如果不小心输入为了字符串,则也会出错(此时多键入的字符被保留在缓冲区内,当下次要求屏幕输入时先从缓冲区取出导致出错)。因此设计了一个判断函数int shuzi(int n); 进行处理此类输入异常错误。此函数主要设计思路为:定义一个动态字符串指针,输入后判断每个输入的字符是否在’0’—‘9’ 之间来判断是否输入的为数字字符,然后按照字符ASCII码值与数字值的关系将输入的字符转换为整数。
而对于字符输入的问题,可以定义为一个动态字符串指针然后只取输入的第一个字符内容。
5.3.2关于某些判断算法优劣问题:
在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:
/* 算法一:
for (j=0; j<m; j++)
if (Work[j]>=Need[i][j]) counter=counter+1;//记数
if(counter==m){…
*/ //算法二:
for (j=0; j<m; j++)
if (Work[j]>=Need[i][j]); //可用大于等于需求
else{
counter=1;
break;
}
if(counter!=1){…
显然算法二要优于算法一。本程序中还有很多类似的地方。这里主要考虑的是一个程序的优化设计问题。
六、心得体会
在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。
七、参考文献
[1] 汤子瀛等.《计算机操作系统》.西安:西安电子科技大学出版社,2006.10.
[2] 刘璟等. 《高级语言c++程序设计》.北京:高等教育出版社,2006.03.
[3] 胡志刚、谭长庚. 计算机操作系统.中南大学出版社.2005.7
[4] 张尧学. 计算机操作系统教程(第二版). 清华大学出版社. 2000.8
八、附录
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//===定义全局变量===
const int x=50,y=100;
int Available[x];
int Allocation[y][y];
int Max[y][y];
int Need[y][y];
int Request[x];
int Work[x];
int Finish[y];
int p[y];
int i,j;
int n,m; //n为进程的数量,m为资源种类数
int l=0,counter=0;
//函数声明
int shuzi(int sz);
void chushihua(); //系统初始化函数
void safe(); //安全性算法函数
void bank(); //银行家算法函数
void showdata();
//===数字判断函数===
int shuzi(int sz){
char *temp;
temp=new char;
int len;
sz=0 ; //清零
char s; //
do{
// gets(temp); //getline(cin,temp)
cin>>temp;
len=strlen(temp);
for(int i=0;i<len;i++){
s= *(temp+i);
if(s<'0' || s>'9'){
cout<<" 抱歉,输错了! 你输入的是数字吗?! \n\n";
cout<<"请重新输入:";
break;
}
}
}while(s<'0' || s>'9');
for(int i=0;i<len;i++){ /
int t=1;
for(int j=1;j<len-i;j++) t*=10;
sz+=(*(temp+i)-48)*t;
}
return sz;
}
//===系统初始化函数===
void chushihua(){
//===系统初始化输入===
cout<<"%% 程序开始,系统初始化输入 %%"<<endl; //<<endl
cout<<"==============================================================="<<endl<<endl;
cout<<"请输入进程的数量: "
n=shuzi(n);
cout<<"请输入资源种类数: ";
m=shuzi(m);
cout<<endl<<endl<<"请输入各种资源可利用的数量( "<<m<<" 种): "<<endl;
cout<<endl;
for (j=0; j<m; j++){
cout<<" 输入资源 "<<j<<" 可利用的数量Available["<<j<<"]: ";
Available[j]=shuzi(Available[j]);
Work[j]=Available[j]; //初始化Work[j]
// cout<<endl;
}
//system("cls"); //清屏
cout<<endl;
cout<<"请输入各进程当前已分配的资源数量Allocation["<<n<<"]["<<m<<"]: "<<endl<<endl;
for (i=0; i<n; i++){
for (j=0; j<m; j++){
cout<<" 请输入进程 "<<i<<" 当前已分配的资源 "<<j<<" 数量: ";
Allocation[i][j]=shuzi(Allocation[i][j]);
}
cout<<endl;
Finish[i]=0;//初始化Finish[i]
//break;
}
cout<<endl<<endl;
cout<<"请输入各进程对各类资源的最大需求数Max["<<n<<"]["<<m<<"]: "<<endl<<endl;
for (i=0; i<n; i++){
for (j=0; j<m; j++) {
cout<<" 请输入进程 "<<i<<" 对资源 "<<j<<" 的最大需求数: ";
Max[i][j]=shuzi(Max[i][j]);
if(Max[i][j]>=Allocation[i][j]) //
Need[i][j] = Max[i][j]-Allocation[i][j]; //计算还需求量
else
Need[i][j]=0;
}
cout<<endl;
}
cout<<endl<<"%% 初始化完成! %%"<<endl;
}
//===安全性算法函数===
void safe(){
l=0;
for (i=0; i<n;){ //i++
if (Finish[i]==0){ //寻找Finish[i]==0的进程 条件一
counter=0; //记数器
for (j=0; j<m; j++)
if (Work[j]>=Need[i][j]); //可用大于等于需求
else{
counter=1;
break;
}
if(counter!=1){ //进程的每类资源量都符合条件Work[j]>=Need[i][j] 条件二
p[l]=i; //存储安全序列
Finish[i]=1;
for (j=0; j<m;j++){
Work[j]=Work[j]+Allocation[i][j];
}
l=l+1;
i= -1;
}
}
i++;
}
}
//===显示分配情况函数 ===
void showdata() //函数showdata,输出当前资源分配情况
{
int i,j; //局部变量
int All[y]; //各种资源的总数量
int l2; //局部变量 l1,
cout<<"==============================================================="<<endl<<endl;
cout<<"%% 系统当前状态如下:%%"<<endl<<endl;
cout<<"%% 各种资源的总数量(all):"<<endl;
for (j=0;j<m;j++) {
cout<<" 资源"<<j<<": ";
All[j]=Available[j];
for (i=0;i<n;i++){
All[j]+=Allocation[i][j];
cout<<All[j]<<" ";
if ((j+1)%5==0 ) cout<<endl; //每行显示五个 && j!=0
}
cout<<endl<<endl;
cout<<"%% 系统目前各种资源可用的数为(available):"<<endl;
for (j=0;j<m;j++){
cout<<" 资源"<<j<<": "<<Available[j]<<" ";
if((j+1)%5==0) cout<<endl; //每行最多显示五个 && j!=0
}
cout<<endl<<endl;
cout<<"%% 各进程已经得到的资源量(allocation): "<<endl;
// l1=0; //归零
for(i=0;i<=m/5;i++){
for (j=i*5;j<i*5+5 && j<m;j++)cout<<" 资源"<<j;
cout<<endl;
for(l2=0;l2<n;l2++){
cout<<"进程"<<l2<<":";
for (j=i*5;j<i*5+5 && j<m;j++)cout<<Allocation[l2][j]<<" ";
cout<<endl;
}
}
cout<<endl;
cout<<"%% 各进程还需要的资源量(need):"<<endl; //<<endl
//l1=0;
for(i=0;i<=m/5;i++){ //设计每行显示五种资源
for (j=i*5;j<i*5+5 && j<m;j++)cout<<" 资源"<<j;
cout<<endl;
for(l2=0;l2<n;l2++){
cout<<"进程"<<l2<<":";
for (j=i*5;j<i*5+5 && j<m;j++)cout<<Need[l2][j]<<" ";
cout<<endl;
}
}
//===银行家算法函数===
void bank(){
cout<<"==============================================================="<<endl<<endl;
cout<<"%% 以下开始为进程进行资源分配申请 %%"<<endl<<endl;
//===申请资源===
int k=0;//用于输入进程编号
bool r=false; // 初值为假,输入Y继续申请则置为真
do{
//输入请求
cout<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间): ";
k=shuzi(k);
cout<<endl;
while(k>n-1) { //输入异常处理
cout<<endl<<"您输入了错误的进程号,请重新输入!"<<endl;
cout<<endl<<"请输入申请资源的进程编号(输入0--"<<n-1<<"之间): ";
k=shuzi(k);
cout<<endl;
}
cout<<endl<<"请输入该进程申请各类资源的数量: "<<endl;
for (j=0; j<m; j++){
do{
cout<<"进程 "<<k<<" 申请资源["<<j<<"]的数量:";
Request[j]=shuzi(Request[j]);
cout<<endl;
if(Request[j]>Need[k][j]){
cout<<"申请大于需要量!!!"<<endl;
cout<<"您申请资源"<<j<<"的数量为"<<Request[j]<<",大于进程"<<k<<"对该资源需求量"<<Need[k][j]<<"。"<<endl;
cout<<"请重新输入!!!"<<endl;
}
else
if(Request[j]>Available[j]){
cout<<"\n没有那么多资源,目前可利用资源"<<j<<"数量为"<<Available[j]<<",本次申请不成功,进程等待!!!"<<endl;
Finish[k]=0; //该进程等待
goto ppp;
}
}while(Request[j]>Need[k][j]); //Request[j]>Available[j]||
}
//改变Avilable、Allocation、Need的值
for (j=0; j<m; j++) {
Available[j] = Available[j]-Request[j];
Allocation[k][j] = Allocation[k][j]+Request[j];
Need[k][j] = Need[k][j]-Request[j];
Work[j] = Available[j];
}
//判断当前状态的安全性
safe(); //调用安全性算法函数
if (l<n) {
l=0;
cout<<"\n当前状态不安全,不予分配!!!!!!"<<endl;
//恢复数据
for (j=0; j<m; j++) {
Available[j] = Available[j]+Request[j];
Allocation[k][j] = Allocation[k][j]-Request[j];
Need[k][j] = Need[k][j]+Request[j];
Work[j] = Available[j];
}
for (i=0; i<n; i++)
Finish[i]=0; /
}
else{
// system("cls");
l=0;
cout<<"\n申请资源成功!!!"<<endl;
//===========================================
/*
for(j=0;j<m;j++) if(Need[k][j]==0) l=l+1;
if(l==m){ //此处借用 l 做下计数器
for (j=0;j<m;j++){
Available[j]=Available[j]+Max[k][j];
Allocation[k][j]=0;
}
}
l=0; //归零
//===========================================
cout<<"\n安全的状态!!!"<<endl;
cout<<"安全序列为: ";
cout<<endl<<"进程"<<"("<<p[0]<<")";
Finish[0]=0;
for (i=1; i<n; i++){
cout<<"==>>"<<"进程"<<"("<<p[i]<<")";
Finish[i]=0; //所有进程置为未分配状态
}
cout<<endl<<endl;
}
showdata(); //显示当前状态
ppp: //申请大于可利用量, 应该阻塞等待,结束本次资源申请,GOTO 语句跳转至此
cout<<endl<<"是否继续申请资源(y/n) ?";
char* b=new char; //输入y/n,判断是否继续申请 <<endl
cin>>b;
cout<<endl;
cout<<"==============================================================="<<endl<<endl;
cout<<endl;
if(*b=='y'||*b=='Y')
r=true;
else{
r=false; //输入非 Y 则令 R =false
// system("cls"); //在sign() 里调用
sign();
}
} while (r==true);
}
//===主函数===
int main(){ // void main()
system("color 06f"); //设置当前窗口的背景色和前景色 0 = 黑色 8 = 灰色
chushihua(); //初始化函数调用
cout<<endl<<endl;
showdata(); //输出初始化后的状态
//===判断当前状态的安全性===
safe(); //安全性算法函数调用
if (l<n){
cout<<"\n当前状态不安全,无法申请,程序退出!!!!!"<<endl;
cout<<endl;
system("pause");
// cin>>l;
return 0; // break;
}
else{
int i; //局部变量
l=0;
cout<<"\n安全的状态!!!"<<endl;
cout<<"安全序列为: ";
cout<<endl<<"进程"<<"("<<p[0]<<")"; //输出安全序列,考虑显示格式,先输出第一个
for (i=1; i<n; i++){
cout<<"==>>"<<"进程"<<"("<<p[i]<<")";
}
for (i=0; i<n; i++) Finish[i]=0; //所有进程置为未分配状态
cout<<endl<<endl;
}
bank(); //银行家算法函数调用
return 0; // break;
}
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月…
目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验…
操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告学院计算机科学与技术学院班级姓名完成日期大连理工大学DalianUniversityofTechnology大连理…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
操作系统实验题设计一若干并发进程的进程调度程序一实验目的无论是批处理系统分时系统还是实时系统用户进程数一般都大于处理机数这将导致用…
操作系统实验报告实验1分析实验结果参照实验指导书回答下面的问题56从实验中得到了两次不同的结果原因是程序采用了多线程的写法两个线程…