东北大学秦皇岛分校操作系统实验报告.docx
- 文档编号:30608000
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:89
- 大小:40.47KB
东北大学秦皇岛分校操作系统实验报告.docx
《东北大学秦皇岛分校操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校操作系统实验报告.docx(89页珍藏版)》请在冰豆网上搜索。
东北大学秦皇岛分校操作系统实验报告
计算机操作系统
实验报告
学号:
姓名:
提交日期:
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;j if(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;k if(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;i if(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 秦皇岛 分校 操作系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)