《操作系统》课程设计报告.doc

上传人:来看看 文档编号:5016893 上传时间:2020-01-28 格式:DOC 页数:15 大小:109KB
返回 下载 相关 举报
《操作系统》课程设计报告.doc_第1页
第1页 / 共15页
《操作系统》课程设计报告.doc_第2页
第2页 / 共15页
《操作系统》课程设计报告.doc_第3页
第3页 / 共15页
《操作系统》课程设计报告.doc_第4页
第4页 / 共15页
《操作系统》课程设计报告.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《《操作系统》课程设计报告.doc》由会员分享,可在线阅读,更多相关《《操作系统》课程设计报告.doc(15页珍藏版)》请在三一文库上搜索。

1、河海大学文天学院操作系统课程设计报告专业:计算机科学与技术 班级: 五 班 学号: 姓名: 时间: 2010/12/24 课程设计文档实验一 进程调度一、实验目的通过一个简单的进程调度模拟程序的实现,加深对进程调度算法,进程切换的理解。 二、实验内容采用动态优先数的方法,编写一进程调度程序模拟程序。模拟程序只进行相应的调度模拟操作,不需要实际程序。三、实验流程图 四、算法思想1、创建进程对象,成员属性有:进程名,进程所需运行时间、进程的优先级和状态2、使用ArrayList来存放模拟的进程(ArrayList是动态数组,不用去考虑容量问题,可以很好的解决不知道数量的进程数,同时可以不使用链表)

2、。3、对创建的进程进行排序,按照优先级的顺序进行相应的排序。排序成功后进行模拟进程的运行,每运行一次进程,将该进程的优先级减少一个单位,运行时间减一个单位,依次循环,直至所有的进程的运行完成,运行时间变为0。注意:优先级和运行所需要的时间变为0时就不可以再减!五、算法实现#include #include #include #include /定义pcb结构体typedef struct pcb char name4; /进程名 int runtime; /进程要求运行时间 int priority; /进程优先数 char state; /进程状态R代表就绪,E代表结束 struct pcb

3、 *next;*ProNode,Pro;typedef struct ProNode front; ProNode rear; PLinkQueue;/初始化进程队列void InitPQueue(PLinkQueue *Q) int i; ProNode P,q; system(cls); Q-rear=Q-front=NULL; /构造一个空队列 /构造进程队列 printf(n请输入5个进程名、运行时间和优先数:n); for(i=1;iname); printf(n运行时间:); scanf(%d,&P-runtime); printf(n优先数:); scanf(%d,&P-prio

4、rity); P-state=R; if(Q-front=NULL) /队列为空 Q-front=Q-rear=P; P-next=NULL; else if(P-priorityQ-front-priority) /队列非空,新进程优先数最大,插入队首 P-next=Q-front; Q-front=P; else q=Q-front; while(q-next) if(q-priority=P-priority)&(q-next-prioritypriority) P-next=q-next; /插入 q-next=P; break; q=q-next; if(!q-next) Q-rea

5、r-next=P; Q-rear=P; P-next=NULL; /当前待插如进程优先数最小,插入进程尾 /InitPQueue(PLinkQueue *Q)/程序实现void DeQueue(PLinkQueue *Q) /队首进程运行完成后退出队列并释放节点 ProNode P; P=Q-front; Q-front=P-next; free(P);/DeQueue(PLinkQueue *Q)/*队首的进程占用CPU,运行一个固定时间段后调整队列,要求runtime=0的进程时退出队列,否则按优先数从大到小的顺序插入至后续ready进程队列中*/ void Run(PLinkQueue

6、*Q) ProNode P,temp;int t=0;while(Q-front) /进程运行至队列空 printf(nn-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-n); printf(时刻%d到%d,t,t+1); P=Q-front; printf(进程%s正在运行n,P-name); getchar(); P=Q-front; P-runtime-; P-priority-; t+;temp=Q-front; if(P-runtime=0)printf(n进程%s已经运行完毕,退出队列,P-name); P-

7、state=E; getchar(); DeQueue(Q); if(Q-front=NULL) printf(所有进程已经运行完毕!); getchar(); return; else /使队列保持优先数递减次序,并打印就绪队列情况 while(temp-next) if(temp-priority=P-priority)&(temp-next-prioritypriority) Q-front=Q-front-next; P-next=temp-next; temp-next=P; /插入到两进程间 break; temp=temp-next; if(!temp-next) Q-front

8、=Q-front-next; P-next=NULL; temp-next=P; Q-rear=P; /插入队列尾 temp=Q-front; printf(n时刻%d进程运行情况:n,t); /队列中进程运行状态打印 printf(n进程名t要求运行时间tt优先数tt状态n); do printf(%stt%dtt,temp-name,temp-runtime); printf(%d,temp-priority); printf(tt%cn,temp-state); temp=temp-next;while(temp!=NULL); getchar();/Run(PlinkQueue *Q)

9、void main() PLinkQueue PQueue; printf(/-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-n); printf(* *n); printf(* 动态优先数进程调度 *n); printf(* *n); printf(-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-/n); getchar(); InitPQueue(&PQueue); printf(优先数进程调度过程如下:n); Run(&PQueue);六、总

10、结 这个实验主要是为了实验进程管理中的进程调度,运用的算法和整个的调度思想都是比较简单的,但是却体现了进程调度的重要性,操作系统的四大特征都是基于进程而形成的,所以我们可以从进程的角度来研究操作系统,进程调度是操作系统中一个极其重要的组成部分,进程调度算法就是为了实现进程调度,在进程调度算法中引入了最高优先权调度算法,一般经常用于批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度算法,还可以用于实时系统中。按照优先级的顺序进行排序是该实验的重要部分,排好了序列了才能进行其他操作,该实验加深了我们对进程调度算法和进程切换的学习,加深了对进程调度算法的熟悉和操作实验二 存储管理一、实验

11、目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计 , 了解虚拟存储技术的特点 , 掌握请求页式存储管理的页面置换算法。二、实验内容虚拟存储器的工作原理以及虚拟页式存储管理中的页面置换算法三、算法思想1、使用随机数产生的函数,产生320个随机数,要求随机数的大小在1100之间,在 0,319 的指令地址之间随机选取一起点 m;顺序执行一条指令;在前地址0,m+1中随机选取一条指令并执行 , 该指令的地址为 m; 顺序执行一条指令 , 其地址为 m+1;在后地址 m+2,319 中随机选取一条指令并执行

12、;重复上述步骤, 直到执行 320 次指令。2、采用先进先出的算法 (FIFO);3、最近最久未使用算法 (LRU);四、算法实现/ test_1.cpp : 定义控制台应用程序的入口点。/* *此程序为页面调度程序,用于模拟虚存与主存之间的页面置换 *并同时采用FIFO,LRU,OPT,LFT,NUR几种算法 *并比较在不同算法下及不同的主存页面状态下,主存的命中率的高低 * */#include stdlib.h#include stdio.h#include time.h#define TRUE 1#define FALSE 0#define INVALID -1/*页面失效符*/#de

13、fine null 0#define total_instruction 320 /*指令流长*/#define total_vp 32 /*虚页长*/#define clear_period 50 /*清零周期*/typedef struct /*页面结构*/int pn,pfn,counter,time;pl_type;/*-pn为页面队列号,pfn为页面控制结构中的页号,counter为访问次数-*/pl_type pltotal_vp; /*页面结构数组;建立虚存页面空间*/* *此程序有两种结构,一种是页面结构,用于页面的实际转换 *即将某一页面的实际参数作改变 *另一种是页面控制结

14、构,用于控制页面的调度 */struct pfc_struct /*页面控制结构;主存中的页面调度结构*/ int pn,pfn; struct pfc_struct *next;typedef struct pfc_struct pfc_type;/*-p272 c语言书;用于将定义语句struct pfc_struct 改成 pfc_type-*/*-pfctotal_vp为用户进程虚页控制结构;freepf_head 闲页面头指针; *-busypf_head忙页面头指针;busypf_tail 忙页面尾指针*/pfc_type pfctotal_vp,*freepf_head,*bus

15、ypf_head,*busypf_tail;int diseffect,atotal_instruction;/*定义页面缺失次数diseffect和指令序列表a*/int pagetotal_instruction,offsettotal_instruction;/*定义每条指令分别在哪一页pagei以及在此页中的偏移量offseti*/void initialize();void FIFO();void LRU();void OPT();void LFU();void NUR();void initialize(int total_pf) /*初始化相关数据;total_pf 用户进程的内

16、存页面数 */ int i; diseffect=0; for (i=0;itotal_vp;i+)/*虚存页面设初值*/ pli.pn=i; pli.pfn=INVALID;/*置页面控制结构中的页号,页面为空*/ pli.counter=0; pli.time=-1; /*页面控制结构中的访问次数为0,时间为-1*/ for (i=1;itotal_pf;i+)/*主存页面设初值*/ pfci-1.next=&pfci; pfci-1.pfn=i-1; /*建立pfci-1和pfci之间的链接*/ pfctotal_pf-1.next=NULL; pfctotal_pf-1.pfn=tot

17、al_pf-1; freepf_head=&pfc0; /*空页面队列的头指针为pfc0*/void FIFO(int total_pf) /*FIFO(First In First Out) ALGORITHM*/ /*该算法中freepf_head用于指示主存页面中空闲页面的头位置,而并没有创建新的队列 *同样,busypf_head及busypf_tail也没有创建新的队列,而是用于指示主存结构中忙页面的头尾*而且由于是纯算法,所以并没有考虑页面自己消掉的可能性,而纯粹由调度结构控制*因此,当页面满后,只有命中不命中目标,只有当释放页面时,会暂时性地产生一个free页面*/ int i,

18、j; pfc_type *p,*t; initialize(total_pf); /*利用子程序初始化相关页面控制用数据结构*/ busypf_head=busypf_tail=NULL; /*忙页面队列头,队列尾链接*/ for (i=0;inext;plbusypf_head-pn.pfn=INVALID;/*将释放出的页面的pfn改为INVALID*/freepf_head=busypf_head; /*释放忙页面队列中的第一个页面*/freepf_head-next=NULL;/*因为只有一个空闲页面,所以next必为NULL*/busypf_head=p;/*忙页面头指向下一个*/

19、p=freepf_head-next; /*按FIFO方式调新页面入内存页面*/freepf_head-next=NULL;/*当前空闲页面将被占用,因此其next必为NULL*/freepf_head-pn=pagei;/*这里的freepf_head指的是当前将被占用的页面*/plpagei.pfn=freepf_head-pfn;/*仅仅是存放一个值而已,用以区分页面不在主存中的INVALID*/if (busypf_tail=NULL)busypf_head=busypf_tail=freepf_head;/*当主存页面为空的情况下,处理尾部*/elsebusypf_tail-next

20、=freepf_head;busypf_tail=freepf_head;freepf_head=p;/*空闲页面指向下一个*/ printf(FIFO:%6.4f-,1-(float)diseffect/320);void LRU(int total_pf) /*LRU(Last Recently Used) ALGORITHM */*此处LRU算法并未用到pfc队列 *而是用是否为INVALID来判断该页面是否被载入内存 *若未被载入内存,则被载入,同时在有空闲页面的情况下将freepf_head指向下一个 *若没有空闲页面,则在plpagei.pfn!=INVALID的页中选出时间最小的

21、,将之替换出去 */ int min,minj,i,j,present_time; initialize(total_pf); present_time=0; for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) /*页面失效*/ diseffect+; /*失效次数*/ if (freepf_head=NULL) /*无空闲页面*/ min=32767;/*找出主存中时间最小的页面*/ for(j=0;jplj.time)/在pl中的页面凡是标注有值的均是在主存中的页面! min=plj.time; minj=j; /*freepf

22、_head=&pfcpfcminj.pfn;*/!错误!minj取值会大于total_pf plminj.pfn=INVALID; plminj.time=-1; plpagei.pfn=pagei;/为了表示命中,换入的页面的pfn值应不为INVALID else/有空闲页面时,首先将新页面填入,然后freepf_head指向下一个 plpagei.pfn=pagei;/标志此页面被载入内存 freepf_head=freepf_head-next;/freepf_head指向下一个 elseplpagei.time=present_time;/*页面有效则将命中的页面的time增大,以确保

23、不被最先置换*/present_time+; printf(LRU:%6.4f-,1-(float)diseffect/320);void NUR(int total_pf) /*NUR最近不经常使用算法 ALGORITHM */ int i,j,dp,cont_flag,old_dp; pfc_type *t; initialize(total_pf); dp=0; for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) /*页面失效*/ diseffect+; /*失效次数*/ if (freepf_head=NULL) /*无空闲

24、页面*/ cont_flag=TRUE; old_dp=dp; while (cont_flag) if(pldp.counter=0&pldp.pfn!=INVALID) cont_flag=FALSE; else dp+; if(dp=total_vp) dp=0; if(dp=old_dp) for(j=0;jnext=NULL; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next; else plpagei.counter=1; if(i%clear_period=0) for(j=0;jtotal_vp;j+) plj.

25、counter=0; printf(NRU:%6.4f,1-(float)diseffect/320);void LFU(int total_pf) /*LFU(Leat Frequently Used) ALGORITHM */ int i,j,min,minpage; pfc_type *t;initialize(total_pf); for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) /*页面失效*/ diseffect+; /*失效次数*/ if (freepf_head=NULL) /*无空闲页面*/ min=32767;

26、 for(j=0;jplj.counter&plj.pfn!=INVALID) min=plj.counter; minpage=j; plj.counter=0; freepf_head=&pfcpfcminpage.pfn; plminpage.pfn=INVALID; freepf_head-next=NULL; plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next; else plpagei.counter+; printf(LFU:%6.4f-,1-(float)diseffect/320);void OPT(int to

27、tal_pf) /*OPT(Optimal Replacement) ALGORITHM*/ int i,j,max,maxpage,d,disttotal_vp; pfc_type *t; initialize(total_pf); /*初始化相关页面控制用数据结构*/ for (i=0;itotal_instruction;i+) if (plpagei.pfn=INVALID) /*页面失效*/ diseffect+; /*失效次数*/ if (freepf_head=NULL) /*无空闲页面*/ for(j=0;jtotal_vp;j+)if(plj.pfn!=INVALID)dis

28、tj=32767;/将所有主存内的页面的disk标志为最大值 else distj=0;/不在主存内的则其disk标志为0 plj.counter=0; d=1; for (j=i+1;jtotal_instruction;j+)/找出余下指令所在页面以后会被访问到的次数 if (plpagej.pfn!=INVALID)/前提是这些页面现在已在主存中 distpagej=d;/不是j,而是pagej d+; max=-1; for (j=0;jtotal_vp;j+) /找出在主存中哪个页面在以后的被访问到的次数最小 if(maxnext=NULL; plmaxpage.pfn=INVALI

29、D; plpagei.pfn=pagei;/将当前页面调入内存中去,即将其pfn值标注为非INVALID else/有空闲页面时,将当前页面调入,并将freepf_head指向下一个 plpagei.pfn=freepf_head-pfn;freepf_head=freepf_head-next; printf(OPT:%6.4f-,1-(float)diseffect/320);/delete dist;/dist=NULL;int main()int S,i,j;srand(time(0); S=319*rand()/32767;for(i=0;itotal_instruction;i+=

30、4)ai=S;ai+1=ai+1;ai+2=ai*rand()/32767;ai+3=ai+2+1;S=(318-ai+2)*rand()/32767+ai+2+2;for(i=0;itotal_instruction;i+)/*设定页号及页内位移量*/pagei=ai/10;offseti=ai%10;printf(%4d,ai);if(i+1)%16=0)printf(n);for (i=4;i32;i+)printf(%2d page frames,i);FIFO(i);LRU(i);OPT(i);LFU(i);NUR(i);printf(n);getchar();return 0;六、

31、总结这个实验是存储器管理,其中大体包括:1发生缺页中断时如何进行页面置换,分别给出可选的几种置换算法并说明所用数据结构。2给出页面访问的顺序与分配给作业的主存块数,使用堆栈作为数据结构编写算法,实现统计缺页中断次数与页面置换操作,用语言编程并用文档形式给出算法分析与实现过程。3给出页面访问的顺序与分配给作业的主存块数,使用队列作为数据结构编写算法,实现统计缺页中断次数与页面置换操作,用语言编程并用文档形式给出算法分析与实现过程。存储器是计算机系统的重要组成部分,随着科学技术和制造业技术的提升,存储器的容量虽然是一直在不断的扩大,但是仍然满足不了现在软件发展的需要,因此存储器是一种宝贵而紧缺的资源,如果能做到对存储器的有效的管理,可以提升存储器的利用率,对系统的性能能做出很大的拉升,存储器的管理对象是内存,在计算机系统中,外存和内存的管理差不多,只不过他们的用途 不同,对于存储管理的实验,还是很重要的,这个是老师给我们的模板程序,但是我们可以通过这个模板程序看出对于存储器的管理是能够通过写出好的程序进行控制的,所以我们今后可以在这方面加深学习,尝试写出几个能够小有作用的存储器控制程序

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1