[工学]3105007366操作系统实验.doc

上传人:sccc 文档编号:4531843 上传时间:2023-04-26 格式:DOC 页数:87 大小:1.01MB
返回 下载 相关 举报
[工学]3105007366操作系统实验.doc_第1页
第1页 / 共87页
[工学]3105007366操作系统实验.doc_第2页
第2页 / 共87页
[工学]3105007366操作系统实验.doc_第3页
第3页 / 共87页
[工学]3105007366操作系统实验.doc_第4页
第4页 / 共87页
[工学]3105007366操作系统实验.doc_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《[工学]3105007366操作系统实验.doc》由会员分享,可在线阅读,更多相关《[工学]3105007366操作系统实验.doc(87页珍藏版)》请在三一办公上搜索。

1、操作系统实验报告学 院 计算机学院 专 业 软件工程 班 级 05级04班 学 号 3105007366 姓 名 陈海宇 指导教师 胡欣如 (2007年 12 月) 计算机 学院 软件工程 专业 04 班 学号: 3105007366姓名: 陈海宇 协作者: 无 教师评定: 考勤情况程序运行情况程序质量实验技能创新精神实验报告设计文档实验_一_题目_ 进程调度_ 第 八 周星期 五 实验_二_题目_ 作业调度_ 第 十 周星期 一 实验_三(综合性)题目_主存空间的分配与回收_ 第十二 周星期五实验_四 _题目_ 文件系统 _第 十四 周星期 一实验平台:1、 计算机及操作系统:IBM-PC机

2、、Windows XP2、 编程环境: Borland C+Builder 6源程序名和可执行程序名:实验一:源程序:jincheng.cpp,可执行程序:Project1.exe实验二:源程序:Unit1.cpp,可执行程序:Project1.exe实验三(综合性):源程序:Unit1.cpp,可执行程序:Project1.exe实验四:源程序:Unit1.cpp,可执行程序:Project1.exe备注:学号: 3105007366 姓名: 陈海宇 协作者: 无 实验_一_题目_ 进程调度_第 八 周星期_ 五 一.实验题目: (1)、编写并调试一个模拟的进程调度程序,采用“最高优先数优先

3、”调度算法对五个进程进行调度。2)、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。二:实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解 三.本实验的源程序名:jin.c 执行文件名:jin.exe 四.实验内容: 最高优先级优先调度算法 1)优先级简介动态优先数是指在进程创建时先确定一个初始优先数, 以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限

4、时增加其优先数的值,等等。 2)详细设计优先权调度算法:1、设定系统中有五个进程,每一个进程用一个进程控制块( PCB)表示,进程队列采用链表数据结构。2、 进程控制块包含如下信息:进程名、优先数、需要运行时间、已用CPU时间、进程状态等等。3、 在每次运行设计的处理调度程序之前,由终端输入五个进程的“优先数”和“要求运行时间”。4、 进程的优先数及需要的运行时间人为地指定.进程的运行时间以时间片为单位进行计算。5、 采用优先权调度算法,将五个进程按给定的优先数从大到小连成就绪队列。用头指针指出队列首进程,队列采用链表结构。6、 处理机调度总是选队列首进程运行。采用动态优先数办法,进程每运行一

5、次优先数减“1”,同时将已运行时间加“1”。7、 进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。8、 “就绪”状态的进程队列不为空,则重复上面6,7步骤,直到所有进程都成为“结束”状态。9、 在设计的程序中有输入语句,输入5个进程的“优先数”和“要求运行时间”,也有显示或打印语句,能显示或打印每次被选中进程的进程名、运行一次后队列的变化,以及结束进程的进程名。10、最后,为五个进程任意确定一组“优先数”和“要求运行时间”,运行并调试所设计的程序,显示或打印出逐次被选中进程的进程名及其进程控制块的动态变化过程。 3)流程图: 图一

6、.最高优先级优先调度算法流程图4)源程序:#include stdio.h#include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; /进程名char state; /进程状态int super; /进程优先级int ntime; /进程需要运行时间int rtime; /进程已经运行的时间struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void

7、 inunization() /初始化界面 printf(nntt*ttn); printf(tttt实验一 进程调度n); printf(tt*ttn); printf(nnnttttt计算机学院软件四班n); printf(ttttt蓝小花n); printf(ttttt3204007102n); printf(ttttt完成时间:2006年11月10日nnnn); printf(请输入任意键进入演示过程n); getch(); void sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)

8、|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入进程优先数最低,则插入到队尾*/ first=first-link; s

9、econd=second-link; if(insert=0) first-link=p; void input() /* 建立进程控制块函数*/ int i;system(cls); /*清屏*/printf(n 请输入五个进程信息:n);for(i=0;iname);printf(n 输入进程优先数:);scanf(%d,&p-super);printf(n 输入进程运行时间:);scanf(%d,&p-ntime);printf(n);p-rtime=0;p-state=w; p-link=NULL; sort(); /* 调用sort函数*/ int space() /计算进程控制块的

10、个数 int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr-link; return(l); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runtime n); printf(|%st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-ntime); printf(|%dt,pr-rtime); printf(n); void chec

11、k() /* 建立进程查看函数 */ PCB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime

12、)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w;sort(); /*调用sort函数*/ void youxian() / 高优先级优先算法的程序入口int len,h=0;char ch; system(cls);input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-link; p-link=NU

13、LL; p-state=R; check(); running(); printf(n 按任一键继续.); printf(nn 进程已经完成.n); ch=getchar(); void menu() /菜单int m;system(cls);printf(nntt*ttn);printf(tttt进程调度演示n);printf(tt*ttn);printf(nnnttt1.演示最高优先数优先算法.);printf(nttt2.演示轮转法算法.);printf(nttt0.退出程序.);printf(nntttt选择进程调度方法:);scanf(%d,&m);switch(m)case 1:

14、youxian(); /高优先级优先算法的程序入口 system(cls); menu(); break;case 2: lunzhuan(); /轮转法演示进程的程序入口 system(cls); menu(); break;case 0: system(cls); break;default: system(cls); menu();main() /*主函数*/ inunization();menu();五)调试结果 1.一运行程序,则显示一个友好的界面,上面有实验者的实验题目,班级,姓名,学号,及完成实验的日期,界面如下:2.按任意键进入程序,里面有几个可以选择的操作:3. 选择1.进入

15、最高优先数优先算法的演示,此时输入5个进程的名,优先级以及运行时间 4.此后,每按一次回车键,相当于队列首进程运行了一个cpu的时间,运行完毕后,如果要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。第一次运行程序时的正在运行的进程以及等待队列中的进程的各信息如下:5.继续按回车键,则显示第二次时的运行情况:6. 重复5操作,直到进程运行完毕. 简单轮转法调度算法1)简单轮转法的基本思想:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。即将CPU的处理时间划分成一个个相同的时间片,就绪队列的诸进程轮流

16、运行一个时间片。当一个时间片结束时,如果运行进程用完它的时间片后还未完成,就强迫运行机制进程让出CPU,就把它送回到就绪队列的末尾,等待下一次调度。同时,进程调度又去选择就绪队列中的队首进程,分配给它一时间片,以投入运行。直至所有的进程运行完毕。 2)详细设计:1、 设系统有5个进程,每个进程用一个进程控制块PCB来代表。2、 为每个进程任意确定一个要求运行时间。3、 按照进程输入的先后顺序排成一个队列。再设一个队首指针指向第一个到达进程的首址。4、 执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前运行进程的指针,指向当前正在运行的进程。5.考虑到代码的可重用性, 轮转法调度

17、程序和最高优先级优先调度是调用同一个模快进行输出注:由于轮转法调度程序和最高优先级优先调度是调用同一个模快进行输出,所以在时间轮转法调度算法的进程中,依然显示了随即产生的优先级数.6.进程运行一次后,以后的调度则将当前指针依此下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的要求运行时间是否等于已运行时间。若不等,则等待下一轮的运行,否则将该进程的状态置为完成态C,并退出循环队列。7.若就绪队列不空,则重复上述的(5)和(6)步骤直到所有的进程都运行完为止。8.在所设计的调度程序中,包含显示或打印语句。显示或打印每次选中的进程的

18、名称及运行一次后队列的变化情况。3)流程图 图二. 简单轮转法调度算法流程图4)主要程序 轮转法调度算法与最高优先数优先算法代码大多数都是共享的.很大不同的只有他们每次运行一个cpu时间后,运行后的进程怎样插入到队列中的的sort()算法,还有就是运行算法running();下面我只列出几个算法的代码void sort2()PCB *q; q=ready;if(ready=NULL) ready=p;else while(q-link!=NULL) q=q-link; q-link=p;void running2() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-rtime)+

19、; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else p-state=w; sort2(); /*调用sort函数*/ void lunzhuan() /轮转法演示进程的程序入口 int len,h=0;char ch; system(cls);input2(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state

20、=R; check(); running2(); printf(n 按任一键继续.); printf(nn 进程已经完成.n); ch=getchar(); 5)调试结果: 1.输入五个进程的初始状态如下: 2.此后,每按一次回车键,相当于队列首进程运行了一个cpu的时间,运行完毕后,如果要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。第一次运行程序时的正在运行的进程以及等待队列中的进程的各信息如下: 3.继续按回车键,则显示第二次时的运行情况:4.重复5操作,直到进程运行完毕.五.思考题、分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结

21、它们的适用范围。调度算法调度策略优先缺点适用范围非抢占式-高优先级优先系统把处理机分给优先级最高的进程,当发生某事时,系统将处理机分给另一优先级最高的进程可使紧迫性的作业优先处理一个高优先级的长作业可能长期的垄断处理机常用于批处理系统,还可用于对实时性要求不严的实时系统简单轮转法将所有就绪进程按先来先服务的原则排成一个队列,每次将cpu分给队首的进程,一个时间片后,将次进程插入队尾,再将cpu分给此时在队首的进程系统能在给定的时间内,及时响应所有用户的请求一个紧迫的长作业可能长期得不到处理 在分时系统中处理短作业六.总结及心得体会 做完任何专业课的第一个实验总是让人有一种开始找着路的感觉.通过

22、实验,我总是比较透彻的理解这门功课主要的知识点.尤其是边看书,边做实验或是是设计后,考试的时候总觉得自己准备的比较充分,也比较有信息.学号: 3105007366 姓名: 陈海宇 协作者: 无 实验_二_题目_ 作业调度_第 十 周星期_ 一 一. 实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作

23、业。(3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。二. 实验目的:本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程 单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: z

24、uoye.exe 2)实验分析:1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图:代替

25、二.最短作业优先算法代替 三.高响应比算法图一.先来先服务流程图4)源程序: #include #include #include #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0int n;float T1=0,T2=0;int times=0;struct jcb /作业控制块 char name10; /作业名 int reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运行的时间 float super; /作业的响应比 int finish

26、time; /作业完成时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=NULL,*p,*q;typedef struct jcb JCB; void inize() /初始化界面 printf(nntt*ttn); printf(tttt实验二 作业调度n); printf(tt*ttn); printf(nnnttttt计算机学院软件四班n); printf(ttttt蓝小花n); printf(ttttt3204007102n); pri

27、ntf(ttttt完成日期:2006年11月17号); printf(nnntt请输入任意键进入演示过程n); getch();void inital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;printf(n输入作业数:);scanf(%d,&n);for(i=0;iname); getch(); p-reachtime=i; printf(作业默认到达时间:%d,i); printf(n输入作业要运行的时间:); scanf(%d,&p-needtime); p-state=W; p-next=NULL; if(ready=NULL) ready=q=p; els

28、e q-next=p; q=p; void disp(JCB* q,int m) /显示作业运行后的周转时间及带权周转时间等 if(m=3) /显示高响应比算法调度作业后的运行情况 printf(n作业%s正在运行,估计其运行情况:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); printf(相应比:%fn,q-super); getch(); else / 显示先来先服务,最短

29、作业优先算法调度后作业的运行情况 printf(n作业%s正在运行,估计其运行情况:n,q-name); printf(开始运行时刻:%dn,q-starttime); printf(完成时刻:%dn,q-finishtime); printf(周转时间:%fn,q-cycletime); printf(带权周转时间:%fn,q-cltime); getch(); void running(JCB *p,int m) /运行作业 if(p=ready) /先将要运行的作业从队列中分离出来 ready=p-next; p-next=NULL; else q=ready; while(q-next

30、!=p) q=q-next; q-next=p-next; p-starttime=times; /计算作业运行后的完成时间,周转时间等等 p-state=R; p-finishtime=p-starttime+p-needtime; p-cycletime=(float)(p-finishtime-p-reachtime); p-cltime=(float)(p-cycletime/p-needtime); T1+=p-cycletime; T2+=p-cltime; disp(p,m); /调用disp()函数,显示作业运行情况 times+=p-needtime; p-state=F;

31、printf(n%s has been finished!npress any key to continue.n,p-name); free(p); /释放运行后的作业 getch();void super() /计算队列中作业的高响应比 JCB *padv; padv=ready; do if(padv-state=W&padv-reachtimesuper=(float)(times-padv-reachtime+padv-needtime)/padv-needtime padv=padv-next; while(padv!=NULL);void final() /最后打印作业的平均周转

32、时间,平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(nn作业已经全部完成!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权周转时间是%f:nnn,n,s); void hrn(int m) /高响应比算法 JCB *min; int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimesupermin-super) min=p; p=p-next; while(p!=NULL); if(iden) i-;times+

33、; /printf(ntime=%d:tno JCB submib.wait.,time); if(times1000)printf(nruntime is too long.error.);getch(); else running(min,m); /调用running()函数 /for final(); /调用running()函数void sjf(int m) / 最短作业优先算法 JCB *min; int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimeneedtimeneedtime) min=p; p=p-ne

34、xt; while(p!=NULL) ; if(iden) i-; /printf(ntime=%d:tno JCB submib.wait.,time); times+; if(times100)printf(nruntime is too long.error);getch(); else running(min,m); /调用running()函数 /for final(); /调用running()函数void fcfs(int m) /先来先服务算法 int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimenext; while(p!=NULL&iden) ; if(iden) i-; printf(n没有满足要求的进程,需等待); times+;

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

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号