东北大学秦皇岛分校操作系统实验报告.docx

上传人:b****5 文档编号:30608000 上传时间:2023-08-18 格式:DOCX 页数:89 大小:40.47KB
下载 相关 举报
东北大学秦皇岛分校操作系统实验报告.docx_第1页
第1页 / 共89页
东北大学秦皇岛分校操作系统实验报告.docx_第2页
第2页 / 共89页
东北大学秦皇岛分校操作系统实验报告.docx_第3页
第3页 / 共89页
东北大学秦皇岛分校操作系统实验报告.docx_第4页
第4页 / 共89页
东北大学秦皇岛分校操作系统实验报告.docx_第5页
第5页 / 共89页
点击查看更多>>
下载资源
资源描述

东北大学秦皇岛分校操作系统实验报告.docx

《东北大学秦皇岛分校操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校操作系统实验报告.docx(89页珍藏版)》请在冰豆网上搜索。

东北大学秦皇岛分校操作系统实验报告.docx

东北大学秦皇岛分校操作系统实验报告

计算机操作系统

实验报告

 

学号:

姓名:

提交日期:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1