计算机操作系统课程设计报告.docx

上传人:PIYPING 文档编号:10910970 上传时间:2021-06-12 格式:DOCX 页数:46 大小:923.97KB
返回 下载 相关 举报
计算机操作系统课程设计报告.docx_第1页
第1页 / 共46页
计算机操作系统课程设计报告.docx_第2页
第2页 / 共46页
计算机操作系统课程设计报告.docx_第3页
第3页 / 共46页
计算机操作系统课程设计报告.docx_第4页
第4页 / 共46页
计算机操作系统课程设计报告.docx_第5页
第5页 / 共46页
点击查看更多>>
资源描述

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

1、操作系统原理 实 验 报 告院 (部): 管理工程学院专业:信息管理与信息系统实验项目:实验一 二 三 五班姓学级:信管 102 名:张凤丹 号:2010021418目录引 言. 4实验一、模拟进程创建、终止、阻塞、唤醒原语. 6实验目的:. 6实验内容:. 6实验步骤:. 7实验代码:. 7程序运行结果及分析. 12实验感想: .13实验二、模拟进程调度功能. 14实验目的:. 14实验内容:. 14实验步骤:. 14实验代码:. 15程序运行结果及分析. 19实验感想: .20实验三:模拟动态分区首次适应分配和回收算法. 20实验目的:. 20实验内容:. 20实验步骤:. 20实验代码:

2、. 21程序运行结果及分析. 27实验感想: .28实验五:模拟使用银行家算法判断系统的状态. 28实验目的:. 28实验步骤:. 28实验代码:. 28程序运行结果及分析. 33实验感想: .343引言操作系统是信息管理与信息系统专业一门重要的专业理论课程,了解和掌握操作系统的 基本概念、功能和实现原理,对认识整个计算机系统的工作原理十分重要。操作系统实验是操作系统课程的一个重要组成部分,通过试验环节的锻炼使同学们不仅能够 对以前的所学过的基础知识加以巩固,同时能够通过上机实验,对操作系统的抽象理论知识 加以理解,最终达到融会贯通的目的,因此,实验环节是同学们理解、掌握操作系统基本理 论的一

3、个重要环节。本实验指导书,根据教材中的重点内容设定了相应的实验题目,由于实验课程的学时有限, 我们规定了必做题目和选做题目,其中必做题目必须在规定的上机学时中完成,必须有相应 的预习报告和实验报告。选做题目是针对有能力或感兴趣的同学利用课余时间或上机学时的 剩余时间完成。5实验一、模拟进程创建、终止、阻塞、唤醒原语实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制 功能的理解,掌握操作系统模块的设计方法和工作原理。实验内容:1、 设计创建、终止、阻塞、唤醒原语功能函数。2、 设计主函数,采用菜单结构(参见后面给出的流程图)。3、设计“显示队列”函数,目的能将就绪

4、、阻塞队列中的进程信息显示在屏幕上,以供 随时查看各队列中进程的变化情况。实验步骤:1、进程 PCB 中应包含以下内容:进程名优先级运行时间状态指针其中:进程名用 P1,P2 标识。优先级及运行时间:为实验题目二做准备。 状态为:就绪、运行、阻塞,三种基本状态。 指针:指向下一个 PCB。2、系统总体结构:开始系统主菜单1 创建2 阻塞3 唤醒4 终止5 显示0退出请输入您需要的功能(05):0 1输入选择=? 2345退出创建阻塞唤醒终止显示结束 实验代码:#include #includestruct PCBchar name4;int priority;int runtime;7;voi

5、d main()int x,t;int a=0;int k=0,r=1,i=0,j=0;/k 为就绪队列总数,r 堵塞队列总数char name4;struct PCB pcb10;struct PCB pcb110;struct PCB pcb210;printf(-菜单-nnn);printf(0-退出系统n);printf(1-创建进程n);printf(2-堵塞进程n);printf(3-唤醒进程n);printf(4-终止进程n);printf(5-显示进程n); printf(-n);strcpy(pcb10.name,s);/堵塞队列pcb10.priority = 2;pcb1

6、0.runtime = 3;/printf(%s %d %d,pcb10.name,pcb10.priority,pcb10.runtime);while(1)printf(请输入你的选择:);scanf(%d,&x);if(x=0)break;if(x=1)printf(-创建进程-n);printf(进程名:);scanf(%s,&pcbk.name);printf(优先级:);scanf(%d,&pcbk.priority);printf(运行时间:);scanf(%d,&pcbk.runtime);k=k+1;if(x=2)printf(-堵塞进程-n);printf(请输入要查找的进

7、程:);scanf(%s,name);for(j=0;j=k;j+)if(strcmp(pcbj.name,name)=0)t=j;strcpy(pcb2a.name,pcbt.name);pcb2a.priority = pcbt.priority;pcb2a.runtime = pcbt.runtime;strcpy(pcb1r.name,pcb2a.name);pcb1r.priority = pcb2a.priority;pcb1r.runtime = pcb2a.runtime;r=r+1;a=a+1;for(i=t;i=k;i+)strcpy(pcbi.name,pcbi+1.na

8、me);pcbi.priority = pcbi+1.priority;pcbi.runtime = pcbi+1.runtime;k=k-1;printf(将就绪序列调度为运行:);for(i=0;ia;i+)printf(%s %d %dn,pcb2i.name,pcb2i.priority,pcb2i.runtime); printf(堵塞进程:n);for(j=0;jr;j+)9printf(%s %d %dn,pcb1j.name,pcb1j.priority,pcb1j.runtime);break;elseprintf(该进程已是堵塞进程!n);break;if(x=3)prin

9、tf(-唤醒进程-n);printf(请输入要唤醒的进程:); scanf(%s,name);for(i=0;ir;i+)if(strcmp(pcb1i.name,name)=0) t=i;strcpy(pcbk.name,pcb1t.name);pcbk.priority = pcb1t.priority;pcbk.runtime = pcb1t.runtime;k=k+1;for(j=t;jr;j+)strcpy(pcb1j.name,pcb1j+1.name);pcb1j.priority = pcb1j+1.priority;pcb1j.runtime = pcb1j+1.runtim

10、e;r=r-1;printf(就绪进程:n);for(j=0;jk;j+)printf(%s %d %dn,pcbj.name,pcbj.priority,pcbj.runtime); printf(堵塞进程:n);for(j=0;jr;j+)printf(%s %d %dn,pcb1j.name,pcb1j.priority,pcb1j.runtime);break;elseprintf(该堵塞进程为空,不能唤醒进程!n);break;/for(j=0;jk;j+)/printf(%s %d %dn,pcbj.name,pcbj.priority,pcbj.runtime);if(x=4)p

11、rintf(-终止进程-n);printf(请输入你要终止的进程:);scanf(%s,name);for(i=0;ik;i+)if(strcmp(pcbi.name,name)=0)t=i;for(j=t;jk;j+)strcpy(pcbj.name,pcbj+1.name);pcbj.priority = pcbj+1.priority;pcbj.runtime = pcbj+1.runtime;k=k-1;if(strcmp(pcb1i.name,name)=0) t=i;for(j=t;jr;j+)strcpy(pcb1j.name,pcb1j+1.name);11pcb1j.prio

12、rity = pcb1j+1.priority;pcb1j.runtime = pcb1j+1.runtime;r=r-1;printf(就绪进程:n);for(j=0;jk;j+)printf(%s %d %dn,pcbj.name,pcbj.priority,pcbj.runtime); printf(堵塞进程:n);for(j=0;jr;j+)printf(%s %d %dn,pcb1j.name,pcb1j.priority,pcb1j.runtime);if(x=5)printf(-显示进程-n);printf(就绪进程:n);for(j=0;jk;j+)printf(%s %d %

13、dn,pcbj.name,pcbj.priority,pcbj.runtime); printf(堵塞进程:n);for(j=0;jr;j+)printf(%s %d %dn,pcb1j.name,pcb1j.priority,pcb1j.runtime);程序运行结果及分析 1) 运行结果实验感想:通过设计并调试创建、终止、阻塞、唤醒原语功能,加深了对操作系统中进程控制 功能的理解,并且掌握操作系统模块的设计方法和工作原理。更重要的是理解了操作 系统的调度方法是就绪-运行-堵塞-唤醒-结束的过程。13实验二、模拟进程调度功能实验目的:通过本实验,进一步掌握进程调度的功能和实现原理。实验内容:

14、1、 设计进程调度功能,至少模拟两种以上调度算法。如:优先级调度算法、时间片调度 算法等。2、 进程调度功能作为一个函数 scheduler,加入到实验题目一中。3、 进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度” 的提示信息。4、 若选上一个进程,以显示:进程名、状态、时间片、优先级等信息表示一个进程被执 行。若运行完,应删除相应 PCB。实验步骤:1、 在实验题目一中的主菜单中加入一个菜单项:6 进程调度。2、 进程调度的结构:进程调度子菜单 0-返回主菜单 1-优先级调度 2-时间片调度 请选择您需要的功能选项:读入选择=x= 0 X= ? = 2= 1调度,

15、选择该菜单项后,系统进入返回上级菜单转优先级调度算法转时间片调度算法实验代码:#include #includevoid priority();void time();struct PCBchar name4;int priority;int runtime;struct PCB pcb5;int q=5;void main()int p,i;strcpy(pcb0.name,p1);/序列队列,优先级由高到低为 1,2,3.pcb0.priority = 2;pcb0.runtime = 3;strcpy(pcb1.name,p2);/序列队列pcb1.priority = 3;pcb1.r

16、untime = 2;strcpy(pcb2.name,p3);/序列队列pcb2.priority = 1;pcb2.runtime = 4;strcpy(pcb3.name,p4);/序列队列pcb3.priority = 5;pcb3.runtime = 6;strcpy(pcb4.name,p5);/序列队列pcb4.priority = 4;pcb4.runtime = 5;printf(-进程调度子菜单-n); printf( 0-退出系统n);15printf( 1-优先级调度n); printf( 2-时间片调度n); printf(nn 显示所有进程n);for(i=0;i5

17、;i+)printf(%s %d %dn,pcbi.name,pcbi.priority,pcbi.runtime); printf(请选择您需要的功能选项:);scanf(%d,&p);printf(*n);while(1)if(p=0)break;switch(p)/case 0:/break;case 1:printf(优先级调度算法n);priority();break;case 2:printf(时间片调度算法n);time();break;printf(请选择您需要的功能选项:);scanf(%d,&p);printf(*n);void priority()int i,j;int

18、t=0,r=0;/int q=5;char name2= ;for(i=0;iq-1;i+)for(j=i;jpcbj.priority)strcpy(name,pcbi.name);strcpy(pcbi.name,pcbj.name);strcpy(pcbj.name,name);t=pcbi.priority;pcbi.priority=pcbj.priority;pcbj.priority=t;r=pcbi.runtime;pcbi.runtime=pcbj.runtime;pcbj.runtime=r;printf(按优先级高低进行排序n);for(i=0;iq;i+)printf(

19、%s %d %dn,pcbi.name,pcbi.priority,pcbi.runtime);printf(*n);printf(显示优先级最高的进程n);printf(%s %d %dn,pcb0.name,pcb0.priority,pcb0.runtime);for(i=0;iq;i+)strcpy(pcbi.name,pcbi+1.name);pcbi.priority = pcbi+1.priority;pcbi.runtime = pcbi+1.runtime;printf(*n);printf(使最高优先级进程处于执行状态(撤销该进程)n); for(i=0;iq-1;i+)/

20、撤销进程printf(%s %d %dn,pcbi.name,pcbi.priority,pcbi.runtime);q=q-1;void time()int i,j,t;/int q=5;for(i=0;iq;i+)printf(%s %d %dn,pcbi.name,pcbi.priority,pcbi.runtime);for(i=0;iq;i+)pcbi.runtime = pcbi.runtime-1;printf(*n);printf(将每个执行进程的执行时间减去一个时间片。n); for(i=0;iq;i+)17printf(%s %d %dn,pcbi.name,pcbi.pr

21、iority,pcbi.runtime);for(i=0;iq;i+)if(pcbi.runtime=0) t=i;for(j=t;jq;j+)strcpy(pcbj.name,pcbj+1.name);pcbj.priority = pcbj+1.priority;pcbj.runtime = pcbj+1.runtime;q=q-1;printf(*n);printf(将进行结束的进程撤销。n);for(i=0;iq;i+)printf(%s %d %dn,pcbi.name,pcbi.priority,pcbi.runtime);程序运行结果及分析19实验感想:通过本实验,我进一步掌握进

22、了程调度的功能和实现原理。熟练掌握了两种进程调度算 法的应用,相信这对以后进一步学习操作系统、信息系统的开发都有很大的好处。实验三:模拟动态分区首次适应分配和回收算法实验目的:通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分 区的合并的理解。实验内容:1、 设计动态分区首次适应分配、回收算法。2、 设计“未分配区说明表”,格式为:序号1始址60k长度200状态13、设计“已分配区说明表”,格式为:0作业名始址长度状态004、 设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。 初始分配从一个空闲区分配起,回收时要合并空区。实验步骤:1、 系

23、统要求分配一个分区时,应输入:作业名、作业长度。2、回收一个分区时,应输入:回收的作业名。回收的分区请注意是否需要进行合并。实验代码:#include #include int MAX_SEGMENT=10;/最大碎片值struct Partition /分区表目int Par_Size; /分区大小int Par_No; /分区序号或者名字int Addr; /分区地址int IsUse; /分区使用情况,0 表示空闲,1 表示使用Partition *pri; /前向指针Partition *next; /后向指针;Partition * Int()/函数,返回 Partition 类型指

24、针 /初始化空闲分区表Partition *list,*H,*H1;list=(struct Partition *)malloc(sizeof(struct Partition);/malloc 申请动态分配空间 list-next=NULL;H=list;if(!list)printf(n 错误,内存初始化分配失败!程序结束);exit(1);H1=(struct Partition *)malloc(sizeof(struct Partition);printf(请预先输入分区总大小(以 KB 为单位):); scanf(%d,&H1-Par_Size);H1-Addr=0;H1-Par

25、_No=0;H1-IsUse=0;H1-pri=H;H1-next=NULL;H-next=H1;/list-H1return list;Partition * InitFP() /初始化已分配分区表Partition *FP,*F,*H;int i;FP=(struct Partition *)malloc(sizeof(struct Partition);FP-next=NULL;H=FP;21for(i=0;iPar_Size=0;F-Addr=0;F-Par_No=0;F-IsUse=0;F-next=NULL;H-next=F;F-pri=H;H=H-next;return FP;P

26、artition * New_Process( Partition *list, Partition *FP) /为新的进程分配资源Partition *H,*P,*H1;int Size,Name,L;H=list;H1=FP-next;H=H-next;printf(请输入新作业的名称和大小(整数)n);printf(作业名称:);scanf(%d,&Name);printf(作业大小(整数):);scanf(%d,&Size);while(H)if(!H) /表目已查完,无法分配printf(n 已无空闲分区,本次无法分配!);return list;elseif(H-IsUse=0)

27、/空表目/if(H-Par_Size=Size) /大小满足,空闲分区大小要分配的大小 if(H-Par_Size=Size) /大小满足,bool temp=false;if(H-Par_Size-Size)=MAX_SEGMENT)/空闲分区大小 -要分配的大小Par_Size;/分配的大小为整块内存temp=true;/会产生碎片/其他情况就分配大小为请求大小,不会产生碎片,L=H-Addr;/保存空闲分地址if(temp)printf( 该次内存分配会产生碎片 , 将整块内存大小 %d 分配出去!,Size);elseprintf(该次内存分配不会产生碎片);break;H=H-nex

28、t; /否则,继续往下查找if(H)if(H-Par_SizeSize) /大小满足,空闲分区大小要分配的大小P=(struct Partition *)malloc(sizeof(struct Partition); /分配新的表目,处理一条数据,分配一次内存P-IsUse=1;P-Addr=L;/指向空闲分区地址P-next=H; /修改指针H-pri-next=P;P-pri=H-pri;H-pri=P;P-Par_Size=Size;/分配大小为要请求分配的大小P-Par_No=Name;/名称H-Par_Size-=Size; /修改空闲分区,H 所指区块大小减 Size H-Addr+=Size;/H 所指区块地址加 SizeelseH-IsUse=1; /大小相等的,把当前表项设置空表目while(H1)if(H1-IsUse=0)

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

当前位置:首页 > 科普知识


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