东北大学秦皇岛分校操作系统实验报告.docx
《东北大学秦皇岛分校操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校操作系统实验报告.docx(89页珍藏版)》请在冰豆网上搜索。
![东北大学秦皇岛分校操作系统实验报告.docx](https://file1.bdocx.com/fileroot1/2023-8/18/47847e03-0deb-46be-b1e3-130a6244d2f8/47847e03-0deb-46be-b1e3-130a6244d2f81.gif)
东北大学秦皇岛分校操作系统实验报告
计算机操作系统
实验报告
学号:
姓名:
提交日期:
2015-12-20
成绩:
东北大学秦皇岛分校
计算机与通信工程学院
实验1使用动态优先权的进程调度算法的模拟
1实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2实验内容
(1)实现对N个进程采用动态优先权优先算法的进程调度。
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中停留一个时间片,优先数加1。
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:
ID01234
PRIORITY93830290
CPUTIME00000
ALLTIME33634
STARTBLOCK2-1-1-1-1
BLOCKTIME30000
STATEreadyreadyreadyreadyready
(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:
RUNNINGPROG:
i
READY-QUEUE:
->id1->id2
BLOCK-QUEUE:
->id3->id4
=======================================
ID01234
PRIORITYP0P1P2P3P4
CUPTIMEC0C1C2C3C4
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3实验结果(给出编写的程序源代码和运行结果的截图)
#include
#include
usingnamespacestd;
ints;//优先权数
intm;//被调用的进程号
intjiuxun[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
intjiuxunnum=0;
intzhuse[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
intzhusenum=0;
intover[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
intovernum=0;
//memset(jiuxun,-1,10);
intqueueOutput();
structpcb{
intid;
intpriority;
intcputime;
intalltime;
intstarb;
intbtime;
stringstate;//0:
就绪1:
完成-1:
阻塞
};
structpcbproject[5]={
{0,9,0,3,2,3,"READY"},
{1,38,0,3,-1,0,"READY"},
{2,30,0,6,-1,0,"READY"},
{3,29,0,3,-1,0,"READY"},
{4,0,0,4,-1,0,"READY"}
};
intmaxpriority(){//寻找最大优先权进程
//s=project[0].priority;
m=0;
for(intk=0;k<=zhusenum;k++){
if(m==zhuse[k])
m++;
}
intmaxp=project[m].priority;
intminalltime=project[m].alltime;
for(inti=0;i<5;i++){
/*if(project[i].starb<=0){
jiuxun[jiuxunnum]=i;
jiuxunnum++;
}*/
if(project[i].priority>maxp&&project[i].starb!
=0){
maxp=project[i].priority;
m=project[i].id;
}elseif(project[i].priority==maxp){
if(project[i].alltime=0){
minalltime=project[i].alltime;
m=project[i].id;
}
}
}
returnm;
}
intrunning(){//执行进程并进行属性值变换
intnow=maxpriority();
project[now].priority-=3;
for(inti=0;i<5;i++){
if(i!
=now&&project[i].state!
="FINISH")
project[i].priority++;
if(project[i].starb==0&&project[i].btime>0){
project[i].btime--;
if(project[i].btime==0){
project[i].state="READY";
jiuxun[jiuxunnum]=i;
jiuxunnum++;
for(intk=0;k<=zhusenum;k++){
if(zhuse[k]==i){
zhuse[k]=-1;
}
}
}
}
}
project[now].cputime++;
project[now].alltime--;
if(project[now].starb>0){
project[now].starb--;
if(project[now].starb==0){
zhuse[zhusenum]=now;
zhusenum++;
project[now].state="BLOCK";
for(intj=0;jif(jiuxun[j]==now)
jiuxun[j]=-1;
}
}
}
if(project[now].alltime==0){
project[now].state="FINISH";
project[now].priority=0;
over[overnum]=now;
overnum++;
for(intk=0;kif(jiuxun[k]==now)
jiuxun[k]=-1;
}
}
}
intoutput(){
running();
cout<<"now"<<"process"<queueOutput();
/*cout<<"READY-QUEUE:
";
for(inti=0;i<=jiuxunnum;i++){
if(jiuxun[i]!
=-1)
cout<<"->"<}
cout<<"\t";
cout<<"BLOCK-QUEUE:
";
for(intj=0;j<=zhusenum;j++){
if(zhuse[j]!
=-1)
cout<<"->"<}
cout<cout<<"ID\t\t"<<"0\t"<<"1\t"<<"2\t"<<"3\t"<<"4\t"<cout<<"PRIORITY\t"<cout<<"CPUTIME\t\t"<cout<<"ALLTIME\t\t"<cout<<"STARTBLOCK\t"<cout<<"BLOCKTIME\t"<cout<<"STATE\t\t"<cout<}
intqueueOutput(){
cout<<"READY-QUEUE:
";
for(inti=0;i<=jiuxunnum;i++){
if(jiuxun[i]!
=-1)
cout<<"->PC"<}
cout<<"\n";
cout<<"BLOCK-QUEUE:
";
for(intj=0;j<=zhusenum;j++){
if(zhuse[j]!
=-1)
cout<<"->PC"<}
cout<cout<<"****************************************************";
cout<}
intmain(){
cout<<"**************2133625储蓉蓉**************"<cout<<"初始化进程:
\n";
cout<<"ID\t\t"<<"0\t"<<"1\t"<<"2\t"<<"3\t"<<"4\t"<cout<<"PRIORITY\t"<cout<<"CPUTIME\t\t"<cout<<"ALLTIME\t\t"<cout<<"STARTBLOCK\t"<cout<<"BLOCKTIME\t"<cout<<"STATE\t\t"<cout<for(inti=0;i<5;i++){
if(project[i].state=="READY"){
jiuxun[jiuxunnum]=i;
jiuxunnum++;
}
}
intj=5,count=0;
queueOutput();
getchar();
while(j!
=count){
output();
for(inti=0;iif(project[i].state=="FINISH"){
count++;
}else{
count=0;
}
}
getchar();
}
}
实验心得体会:
由于网上给出了动态优先权优先算法,所以参考网上给出的算法,加上自己对于本次实验的理解和题目中的要求,来对其进行实现,实验难点在于对算法原理的理解和对程序的实现,查阅了资料理解了算法,但是由于基础知识的不扎实,自己对于程序的整体写的思路还是没有,最后还是在同学的帮助下完成。
实验2使用动态分区分配方式的模拟
1实验目的
(1)了解动态分区分配方式中使用的数据结构和分配算法
(2)加深对动态分区存储管理方式及其实现过程的理解。
2实验内容
(1)分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链来管理:
在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB。
•作业2申请60KB。
•作业3申请100KB。
•作业2释放60KB。
•作业4申请200KB。
•作业3释放100KB。
•作业1释放130KB。
•作业5申请140KB。
•作业6申请60KB。
•作业7申请50KB。
•作业6释放60KB。
分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。
3实验结果(给出编写的程序源代码和运行结果的截图)
#include
usingnamespacestd;
/*
*定义空闲分区链结构
*/
structSubareaNode
{
//分区起始地址
intaddress;
//分区大小
intsize;
//分区状态(0,1)
intstate;
//作业号
inttaskNo;
//分区前向指针
SubareaNode*prior;
//分区后向指针
SubareaNode*next;
};
/*
*定义动态分区分配类
*/
classDynamicSubareaAlloction
{
private:
//内存分区链指针
SubareaNode*head;
//内存空间大小
intMEMORYSPACE;
public:
/*
*在构造函数中初始化内存大小
*/
DynamicSubareaAlloction()
{
cout<<"请输入内存可用空间大小(大小范围0k至640k):
"<do
{
cin>>MEMORYSPACE;
if((MEMORYSPACE<0)||(MEMORYSPACE>640))
{
cout<<"不符合内存可用空间大小范围!
"<}
}while((MEMORYSPACE<0)||(MEMORYSPACE>640));
cout<<"------内存空间可用为"<}
/*
*对内存进行分区分配
*int:
内存分配算法选项
*/
voidexecAlloction(intoption)
{
//初始内存分区链
head=newSubareaNode;
head->size=MEMORYSPACE;
head->address=0;
head->state=0;
head->taskNo=0;
head->prior=NULL;
head->next=NULL;
//定义作业号范围变量
inttask[7]={0,0,0,0,0,0,0};
//操作选项变量
intselectItem=0;
//作业号变量
intno;
//内存大小变量
intspace;
//是否显示内存情况
boolisShow;
if(1==option)
{
cout<<"你选择了首次适应算法!
"<}
elseif(2==option)
{
cout<<"你选择了最佳适应算法!
"<}
//选择申请或释放内存操作
while
(1)
{
cout<<"=========================="<cout<<"/n请选择一项操作:
"<cout<<"/n1--申请内存"<cout<<"/n2--释放内存"<cout<<"/n0--终止操作"<cout<<"=========================="<do
{
cin>>selectItem;
if(1!
=selectItem&&2!
=selectItem&&0!
=selectItem)
{
cout<<"输入选项错误,请重新输入!
"<}
}while(1!
=selectItem&&2!
=selectItem&&0!
=selectItem);
//退出程序
if(0==selectItem)
{
//释放内存分区链
deletehead;
head=NULL;
break;
}
//检查作业号是否有效
while
(1)
{
cout<<"请输入作业号:
(作业号范围1~7),输入'0'终止操作!
"<cin>>no;
//终止操作
if(0==no)break;
if(no<1||no>7)
{
cout<<"超出作业号范围!
"<}
elseif(1<=no<=7)
{
if(1==task[no-1]&&1==selectItem)
{
cout<<"此作业号已申请内存,重新输入!
"<}
elseif(0==task[no-1]&&2==selectItem)
{
cout<<"此作业号已释放内存,重新输入!
"<}
else
{
break;
}
}
}
//终止操作
if(0==no)break;
isShow=true;
//申请内存操作
if(1==selectItem)
{
//检查申请内存大小是否有效
cout<<"请输入申请内存大小:
(单位:
k)"<cin>>space;
while(space>MEMORYSPACE)
{
cout<<"申请内存大小超过总共内存空间("<"<cin>>space;
}
if(1==option)
{
//首次适应算法内存分配
//如果申请失败,不显示内存情况
if(!
firstFit_alloc(head,&space,&no,task))isShow=false;
}
else
{
//最佳适应算法内存分配
//如果申请失败,不显示内存情况
if(!
bestFit_alloc(head,&space,&no,task))isShow=false;
}
}
//释放内存操作
if(2==selectItem)
{
if(1==option)
{
//首次适应算法内存释放
firstFit_free(head,&no,task);
}
else
{
//最佳适应算法内存释放
bestFit_free(head,&no,task);
}
}
//输出当前内存使用情况
i