1、东北大学秦皇岛分校操作系统实验报告计算机操作系统实验报告学 号:姓 名:提交日期:2015-12-20成 绩:东北大学秦皇岛分校计算机与通信工程学院实验1使用动态优先权的进程调度算法的模拟1实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。2实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段: 进程标识数 ID。 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。 进程已占用的CPU时间CPUTIME。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为
2、0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则: 进程在就绪队列中停留一个时间片,优先数加1。 进程每运行一个时间片,优先数减3。(4)假设在调度前,系统中有5个进程,它们的初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBL
3、OCK 2 -1 -1 -1 -1 BLOCKTIME 3 0 0 0 0 STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:iREADY-QUEUE:-id1-id2BLOCK-QUEUE:-id3-id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2
4、 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43实验结果(给出编写的程序源代码和运行结果的截图)#include #include using namespace std;int s;/优先权数int m;/被调用的进程号 int jiuxun10=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;int jiuxunnum=0;int zhuse10=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;int zhusenum=
5、0;int over10=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;int overnum=0;/memset(jiuxun,-1,10);int queueOutput();struct pcb int id; int priority; int cputime; int alltime; int starb; int btime; string state;/0:就绪 1:完成 -1:阻塞 ;struct pcb project5= 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,
6、-1,0,READY, 4,0,0,4,-1,0,READY;int maxpriority() /寻找最大优先权进程 /s=project0.priority; m=0; for(int k=0;k=zhusenum;k+) if(m=zhusek) m+; int maxp=projectm.priority; int minalltime=projectm.alltime; for(int i=0;i5;i+) /*if(projecti.starbmaxp&projecti.starb!=0) maxp=projecti.priority; m=projecti.id; else if
7、(projecti.priority=maxp) if(projecti.alltimeminalltime&projecti.starb!=0) minalltime=projecti.alltime; m=projecti.id; return m;int running() /执行进程并进行属性值变换 int now=maxpriority(); projectnow.priority-=3; for(int i=0;i0) projecti.btime-; if(projecti.btime=0) projecti.state=READY; jiuxunjiuxunnum=i; jiu
8、xunnum+; for(int k=0;k0) projectnow.starb-; if(projectnow.starb=0) zhusezhusenum=now; zhusenum+; projectnow.state=BLOCK; for(int j=0;jjiuxunnum;j+) if(jiuxunj=now) jiuxunj=-1; if(projectnow.alltime=0) projectnow.state=FINISH; projectnow.priority=0; overovernum=now; overnum+; for(int k=0;kjiuxunnum;k
9、+) if(jiuxunk=now) jiuxunk=-1; int output() running(); coutnow process m is running.nendl; queueOutput(); /*coutREADY-QUEUE: ; for(int i=0;i=jiuxunnum;i+) if(jiuxuni!=-1) coutjiuxuni; coutt; coutBLOCK-QUEUE: ; for(int j=0;j=zhusenum ;j+) if(zhusej!=-1) coutzhusej; coutendlendl;*/ coutIDtt0t1t2t3t4te
10、ndl; coutPRIORITYtproject0.prioritytproject1.prioritytproject2.prioritytproject3.prioritytproject4.prioritytendl; coutCPUTIMEttproject0.cputimetproject1.cputimetproject2.cputimetproject3.cputimetproject4.cputimetendl; coutALLTIMEttproject0.alltimetproject1.alltimetproject2.alltimetproject3.alltimetp
11、roject4.alltimetendl; coutSTARTBLOCKtproject0.starbtproject1.starbtproject2.starbtproject3.starbtproject4.starbtendl; coutBLOCKTIMEtproject0.btimetproject1.btimetproject2.btimetproject3.btimetproject4.btimetendl; coutSTATEttproject0.statetproject1.statetproject2.statetproject3.statetproject4.statete
12、ndl; coutendl; int queueOutput() coutREADY-QUEUE: ; for(int i=0;i=jiuxunnum;i+) if(jiuxuni!=-1) coutPCjiuxuni; coutn; coutBLOCK-QUEUE: ; for(int j=0;j=zhusenum ;j+) if(zhusej!=-1) coutPCzhusej; coutendl; cout*; coutendl;int main() cout * 2133625储蓉蓉 * endl; cout初始化进程:n; coutIDtt0t1t2t3t4tendl; coutPR
13、IORITYtproject0.prioritytproject1.prioritytproject2.prioritytproject3.prioritytproject4.prioritytendl; coutCPUTIMEttproject0.cputimetproject1.cputimetproject2.cputimetproject3.cputimetproject4.cputimetendl; coutALLTIMEttproject0.alltimetproject1.alltimetproject2.alltimetproject3.alltimetproject4.all
14、timetendl; coutSTARTBLOCKtproject0.starbtproject1.starbtproject2.starbtproject3.starbtproject4.starbtendl; coutBLOCKTIMEtproject0.btimetproject1.btimetproject2.btimetproject3.btimetproject4.btimetendl; coutSTATEttproject0.statetproject1.statetproject2.statetproject3.statetproject4.statetendl; couten
15、dl; for(int i=0;i5;i+) if(projecti.state=READY) jiuxunjiuxunnum=i; jiuxunnum+; int j=5,count=0; queueOutput(); getchar(); while(j!=count) output(); for(int i=0;ij;i+) if(projecti.state=FINISH) count+; else count=0; getchar(); 实验心得体会:由于网上给出了动态优先权优先算法,所以参考网上给出的算法,加上自己对于本次实验的理解和题目中的要求,来对其进行实现,实验难点在于对算法
16、原理的理解和对程序的实现,查阅了资料理解了算法,但是由于基础知识的不扎实,自己对于程序的整体写的思路还是没有,最后还是在同学的帮助下完成。 实验2使用动态分区分配方式的模拟1实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。2实验内容(1)分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB。作业2申请60KB。作业3申
17、请100KB。作业2释放60KB。作业4申请200KB。作业3释放100KB。作业1释放130KB。作业5申请140KB。作业6申请60KB。作业7申请50KB。作业6释放60KB。分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。3实验结果(给出编写的程序源代码和运行结果的截图) #include using namespace std;/*定义空闲分区链结构*/struct SubareaNode /分区起始地址 int address; /分区大小 int size; /分区状态(0,1) int state; /作业号 int ta
18、skNo; /分区前向指针 SubareaNode *prior; /分区后向指针 SubareaNode *next;/*定义动态分区分配类*/class DynamicSubareaAlloction private: /内存分区链指针 SubareaNode *head; /内存空间大小 int MEMORYSPACE; public: /* *在构造函数中初始化内存大小 */ DynamicSubareaAlloction() cout 请输入内存可用空间大小(大小范围0k至640k): MEMORYSPACE; if(MEMORYSPACE640) cout 不符合内存可用空间大小范
19、围! endl; while(MEMORYSPACE640); cout -内存空间可用为 MEMORYSPACE k- size = MEMORYSPACE; head-address = 0; head-state = 0; head-taskNo = 0; head-prior = NULL; head-next = NULL; /定义作业号范围变量 int task7=0,0,0,0,0,0,0; /操作选项变量 int selectItem = 0; /作业号变量 int no; /内存大小变量 int space; /是否显示内存情况 bool isShow; if(1 = opt
20、ion) cout 你选择了首次适应算法! endl; else if(2 = option) cout 你选择了最佳适应算法! endl; /选择申请或释放内存操作 while(1) cout = endl; cout /n请选择一项操作: endl; cout /n 1-申请内存 endl; cout /n 2-释放内存 endl; cout /n 0-终止操作 endl; cout = selectItem; if(1!= selectItem & 2!= selectItem & 0!= selectItem) cout 输入选项错误,请重新输入! endl; while(1!= se
21、lectItem & 2!= selectItem & 0!= selectItem); /退出程序 if(0 = selectItem) /释放内存分区链 delete head; head = NULL; break; /检查作业号是否有效 while(1) cout 请输入作业号:(作业号范围17),输入0终止操作! no; /终止操作 if(0 = no) break; if(no 7) cout 超出作业号范围! endl; else if(1 = no = 7) if(1 = taskno-1 & 1 = selectItem) cout 此作业号已申请内存,重新输入! endl;
22、 else if(0 = taskno-1 & 2 = selectItem) cout 此作业号已释放内存,重新输入! endl; else break; /终止操作 if(0 = no) break; isShow = true; /申请内存操作 if(1 = selectItem) /检查申请内存大小是否有效 cout 请输入申请内存大小:(单位:k) space; while(space MEMORYSPACE) cout 申请内存大小超过总共内存空间( MEMORYSPACE k),重新输入! 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