操作系统实验.docx
- 文档编号:27849303
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:44
- 大小:412.24KB
操作系统实验.docx
《操作系统实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验.docx(44页珍藏版)》请在冰豆网上搜索。
操作系统实验
课程设计报告
(2011--2012年度第1学期)
名称:
操作系统原理课程设计B
院系:
信息工程系
班级:
学号:
学生姓名:
指导教师:
设计周数:
1
成绩:
日期:
2011年11月25
目录
实验一单处理器系统的进程调度2
实验二银行家算法9
实验三主存储器空间的分配和回收16
实验四页面置换算法24
实验一单处理器系统的进程调度
一、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下的处理器调度。
二、实验要求
1.设计一个按时间片轮转法实现处理器调度的程序,每个程序由一个PCB表示。
2.程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
三、实验原理
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。
指针——进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。
当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。
另用一标志单元记录轮到运行的进程。
例如,当前轮到P2执行,则有:
标志单元
K2
K1
Q1
K2
Q2
K3
Q3
K4
Q4
K5
Q5
K2
K3
K4
K5
K1
2
3
1
2
4
1
0
0
0
0
R
R
R
R
R
PCB1
PCB2
PCB3
PCB4
PCB5
(4)处理器调度总是选择标志单元指示的进程运行。
由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。
在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。
同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。
若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。
此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。
(6)若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。
四、实验所需仪器、设备
C++
五、参考文献
[1]汤小丹1,汤小丹2计算机操作系统.西安电子科技大学出版社,第三版.出版日期:
2007.3
附录:
程序截图:
流程图:
源代码:
#include
#include
#include
#include
usingnamespacestd;
typedefstructnode
{
charname[10];//进程名
structnode*next;//指向下一个进程的指针
intcputime;//进程已运行的CUP时间
intneedtime;//进程需要的CUP时间
intcount;//进程运行时间
charstate;//进程的状态:
'R':
就绪,'E':
结束
intround;//进程分配的时间片
}PCB;
PCB*end,*ready,*tail,*run;//指向两个队列的队首的指针,tail为就绪队列的队尾指针,run标志位指向下一个将要运行的进程
intN;//进程的数目
voidinsert(PCB*q)//尾插
{
tail->next=q;
tail=q;
q->next=NULL;
}
voidcreatetask()
{
PCB*p;
intn,time;
charna[10];
ready=NULL;
end=NULL;
run=NULL;
cout<<"请输入进程数目N:
";
cin>>N;
for(n=0;n { p=(PCB*)malloc(sizeof(PCB)); cout<<"输入进程名称: "; cin>>na; cout<<"输入所需时间: "; cin>>time; strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0; p->state='R'; p->round=3; if(ready! =NULL) { insert(p); } else { p->next=ready;//ready为null ready=p; tail=p; } } run=ready; ready=ready->next; cout<<"创建成功。 "< } voidprt1() { cout<<"namecputimeneedtimestate"< } voidprt2(PCB*p) { cout< } voidprt() { PCB*p; prt1(); if(run! =NULL) { prt2(run); } p=ready; while(p! =NULL) { prt2(p); p=p->next; } p=end; while(p! =NULL) { prt2(p); p=p->next; } } voidfirstin(void)//头插法 { if(ready! =NULL) { run=ready; ready=ready->next; run->next=NULL; } else { run=NULL; } } voidroundrun() { while(run! =NULL) { if(run->needtime-run->round<0) { run->cputime=run->cputime+run->needtime; run->needtime=0; run->count=run->count+run->needtime; } else { run->cputime=run->cputime+run->round; run->needtime=run->needtime-run->round; run->count=run->count+run->round; } if(run->needtime==0) { run->next=end; end=run; run->state='E'; run=NULL; if(ready! =NULL) { firstin(); } } else { if(ready! =NULL) { run->state='R'; insert(run); firstin(); } } prt(); } } intmain() { createtask(); roundrun(); return0; } 实验二银行家算法 一、实验目的 银行家算法是避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 二、实验要求 1.设计进程对各类资源最大申请表示及初值确定。 2.设定系统提供资源初始状况。 3.设定每次某个进程对各类资源的申请表示。 4.编制程序,依据银行家算法,决定其申请是否得到满足。 三、实验原理 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N]系统可用资源数 ALLOCATION[M*N]M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转 (2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSENEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATIONFINISH=TRUEGO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。 四、实验所需仪器、设备 C++ 五、参考文献 [1]汤小丹1,汤小丹2计算机操作系统.西安电子科技大学出版社,第三版.出版日期: 2007.3 附录: 流程图: 源代码: #include usingnamespacestd; #include #include intMax[100][100]={0};//M进程所需N类资源的最大需求 intAvaliable[100]={0};//系统可用资源 charname[100]={0};//资源的名称 intAllocation[100][100]={0};//系统已分配资源 intNeed[100][100]={0};//还需要资源 intRequest[100]={0};//请求资源向量 inttemp[100]={0};//存放安全序列 intWork[100]={0};//存放系统可提供资源 intM=100;//作业的最大数为100 intN=100;//资源的最大数为100 voidshowdata()//显示资源矩阵 { inti,j; cout<<"系统目前可用的资源[Avaliable]: "< for(i=0;i cout< for(j=0;j cout< cout<<"资源分配表"< cout<<"MaxAllocationNeed"< cout<<"进程名"; for(j=0;j<3;j++) { for(i=0;i cout<<""; } cout< for(i=0;i { cout<<""< for(j=0;j cout<<""; for(j=0;j cout<<""; for(j=0;j cout< } } intchangdata(inti)//进行资源分配 { intj; for(j=0;j { Avaliable[j]=Avaliable[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j]; } return1; } intsafe()//安全性算法 { inti,j,m,k=0,apply,Finish[100]={0}; intflag=0; for(i=0;i Work[i]=Avaliable[i]; for(i=0;i { apply=0; for(j=0;j { if(Finish[i]==0&&Need[i][j]<=Work[j]) { apply++; if(apply==N) { for(m=0;m Finish[i]=1; temp[k]=i; k++; i=-1;//重新开始循环 } } } } for(i=0;i { if(Finish[i]==0) { cout<<"系统不安全"< return-1; } } cout<<"系统是安全的"< cout<<"分配的序列: "; for(i=0;i {//输出运行进程数组 cout< if(i } cout< return0; } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"< "; cin>>i;//输入须申请的资源号 cout<<"请输入进程"< "< for(j=0;j { cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j { if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"进程"< cout<<"分配不合理,不予分配"< ch='n'; break; } else { if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 { //出错 cout<<"进程"< cout<<"分配出错,不予分配"< ch='n'; break; } } } if(ch=='y') { changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } intmain()//主函数 { inti,j,number,choice,m,n,flag; charming; cout<<"请输入系统提供资源种类: "; cin>>n; N=n; for(i=0;i { cout<<"资源"< "; cin>>ming; name[i]=ming; cout<<"资源的数量: "; cin>>number; Avaliable[i]=number; } cout<<"请输入作业的数量: "; cin>>m; M=m; cout<<"请输入各进程的最大需求量("< "< for(i=0;i for(j=0;j cin>>Max[i][j]; do { flag=0; cout<<"请输入各进程已经申请的资源量("< "< for(i=0;i for(j=0;j { cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag) cout<<"申请的资源大于最大需求量,请重新输入! \n"; } while(flag); showdata();//显示各种资源 share(); return1; } 程序截图: 实验三主存储器空间的分配和回收 一、实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。 当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。 当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。 主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 二、实验要求 1.在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。 2.打印空闲区说明表的初始状态,作业4的申请量以及为作业4分配后的空闲区说明表状态;再依次打印作业3和作业2的归还量以及回收作业3,作业2所占主存后的空闲区说明表。 三、实验原理 1.可变分区方式是按作业需要的主存空间大小来分割分区的。 当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。 随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。 例如: 0 5k 10k 14k 26k 32k 128k 操作系统 作业1 作业3 空闲区 作业2 空闲区 为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下: 起址 长度 状态 第一栏 14K 12K 未分配 第二栏 32K 96K 未分配 空表目 空表目 其中,起址——指出一个空闲区的主存起始地址。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。 由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。 上述的这张说明表的登记情况是按提示 (1)中的例所装入的三个作业占用的主存区域后填写的。 2.当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。 有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分: 一部分分给作业占用;另一部分又成为一个较小的空闲区。 为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。 为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。 为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。 3.采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。 当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。 最先适应分配算法如图1。 4.当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。 例如,在提示 (1)中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。 归还主存时的回收算法如图2。 5.请按最先适应算法设计主存分配和回收的程序。 然后按 (1)中假设主存中已装入三个作业,且形成两个空闲区,确定空闲区说明表的初值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验