《2022年操作系统实验进程调度 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统实验进程调度 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验三 进程调度一实验目的加深理解并模拟实现进程(作业)调度算法。1)熟悉常用的进程调度算法,如FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识,选择三种进程调度算法予以实现。二实验属性该实验为设计性实验。三实验仪器设备及器材普通 PC386以上微机四实验要求本实验要求2 学时完成。本实验要求完成如下任务:1) 编程实现单处理机系统中的进程调度,要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;2) 最后编写主函数对所做工作进行测试。实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、 实验中认真调
2、试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A) ,并要求用正规的实验报告纸和封面装订整齐,按时上交。五:实验具体设计此程序模拟了两种调度算法,FCFS和 SPF ,首先 FCFS就是按照进程的创建顺序依次顺序进行,流程图为:进程顺序执行SPF: 每次都进行循环,选出在该时间刻运行时间最短的进程优先执行。程序代码具体详解:1.创建一结构体作为进程控制器typedef struct PCB int ID; char state; int arrivetime; 进程 4 进程 1 进程 2 进程 3 新进程名师资料总结 - - -精品资料欢迎下载
3、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - int starttime; int finishtime; int servicetime; struct PCB *next; pcb; 定义全局变量作为计时器int time;/ 计时器2.创建进程链表:从 txt 文件中读取数据,构造一条不含头结点的单链表void Create_process() ifstream inFile; inFile.open(test.txt); inFilen; inFile.ge
4、t(); int i=0; for (;ip-ID; inFilep-arrivetime; inFilep-servicetime; p-starttime=0; p-finishtime=0; p-state=F; p-next=NULL; if(head=NULL) head=p;q=p;time=p-arrivetime; if(p-arrivetime arrivetime; q-next=p; q=p; 3.若执行 FCFS 算法,按顺序遍历链表void fcfs1() int i; p=head; for(i=0;istate=F) 名师资料总结 - - -精品资料欢迎下载 -
5、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - q=p; run_fcfs1(q); p=p-next; void run_fcfs1(pcb *p1) time = p1-arrivetime time? p1-arrivetime:time; p1-starttime=time; printf(n 现在时间: %d,开始运行作业 %dn,time,p1-ID); time+=p1-servicetime; p1-state=T; p1-finishtime=time;
6、printf(ID号到达时间开始运行时间服务时间完成时间n); printf(%d%10d%12d%12d%12dn,p1-ID,p1-arrivetime,p1-starttime,p1-servicetime,p1-finishtime); 4.若执行 SPF 算法,每次都从链表头开始遍历链表,找出arrivetimeservicetime; while (p!=NULL) if (p-arrivetimeservicetimenext; else p=p-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心
7、整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - run_fcfs2(q); pcb *pre; if (q=head) head=head-next; else pre=head; while(pre-next!=q) pre=pre-next; if(q-next=NULL) pre-next=NULL; else pre-next=q-next; void run_fcfs2(pcb *p1) p1-starttime=time; printf(n 现在时间: %d,开始运行作业 %dn,time,p1-ID); time+=p1-servic
8、etime; p1-state=T; p1-finishtime=time; printf(ID号到达时间开始运行时间服务时间完成时间n); printf(%d%10d%12d%12d%12dn,p1-ID,p1-arrivetime,p1-starttime,p1-servicetime,p1-finishtime); 六:程序执行效果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 实验总结:模拟实验调度算法,用到的具体知识
9、还主要是数据结构中的知识,在这次实验中,FCFS 算法实现还算比较简单,SPF算法稍微有一些麻烦,主要是在进行查找运行时间最短的节点,并需要满足到达时间time,并且还要是没有执行的节点,这一点稍微有些麻烦。源码#include #include #include #include typedef struct PCB int ID; char state; int arrivetime; int starttime; int finishtime; int servicetime; struct PCB *next; pcb; int time;/ 计时器int n; / 进程个数pcb*h
10、ead=NULL; pcb*p,*q; void fcfs1(); void fcfs2(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - void run_fcfs1(pcb *p1); void Create_process(); void Create_process() ifstream inFile; inFile.open(test.txt); inFilen; inFile.get(); int i=0; fo
11、r (;ip-ID; inFilep-arrivetime; inFilep-servicetime; p-starttime=0; p-finishtime=0; p-state=F; p-next=NULL; if(head=NULL) head=p;q=p;time=p-arrivetime; if(p-arrivetime arrivetime; q-next=p; q=p; inFile.close(); void run_fcfs1(pcb *p1) time = p1-arrivetime time? p1-arrivetime:time; p1-starttime=time;
12、printf(n 现在时间: %d,开始运行作业 %dn,time,p1-ID); time+=p1-servicetime; p1-state=T; p1-finishtime=time; printf(ID号到达时间开始运行时间服务时间完成时间n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - printf(%d%10d%12d%12d%12dn,p1-ID,p1-arrivetime,p1-starttime,p1-s
13、ervicetime,p1-finishtime); void run_fcfs2(pcb *p1) p1-starttime=time; printf(n 现在时间: %d,开始运行作业 %dn,time,p1-ID); time+=p1-servicetime; p1-state=T; p1-finishtime=time; printf(ID号到达时间开始运行时间服务时间完成时间n); printf(%d%10d%12d%12d%12dn,p1-ID,p1-arrivetime,p1-starttime,p1-servicetime,p1-finishtime); void fcfs1(
14、) int i; p=head; for(i=0;istate=F) q=p; run_fcfs1(q); p=p-next; void fcfs2() while(head) p=head; q=p; int Run_time=p-servicetime; while (p!=NULL) if (p-arrivetimeservicetimenext; else p=p-next; run_fcfs2(q); /删除该节点pcb *pre; if (q=head) head=head-next; else pre=head; while(pre-next!=q) pre=pre-next;
15、if(q-next=NULL) pre-next=NULL; else pre-next=q-next; void main() Create_process(); int i; cout 输入 1 或 2或 0i; while(i!=0) if (i=1) fcfs1(); cout 输入 1 或 2 或 0i; else if (i=2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - fcfs2(); cout 输入 1 或 2 或 0i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -