




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
进程调度实验报告一、 实验目的用高级语言编写和测试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二、 实验内容与要求设计一个有N个进程并发执行的进程调度程序。要求采用先进先出、时间片轮转法、多级反馈队列调度算法这三种算法 1.每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等.2.进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行计算。3.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。.4.就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 5.如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。6.每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。三、实验设计方案及原理1、编写并调试一个模拟进程调度程序,采用先进先出算法对五个进程进行调度。基本思想;算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分到处理机,就会一直执行下去,直到该进程完成或阻塞时,才释放处理机。2、编写并调试一个模拟进程调度程序,采用轮转法对五个进程进行调度。 基本思想; 所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。三、 数据结构和关键函数1、先进先出算法struct pcbchar name10;char state;int super;int ntime;int rtime;struct pcb *link;sort():建立对进程优先级排列函数input():建立进程控制块函数space():返回就绪队列中进程的数目disp():建立进程显示函数,用于显示当前进程check():建立进程查看函数destroy():建立进程撤销函数,如果进程运行结束,就撤销进程running():建立进程就绪函数2、轮转法struct pcb char name20; int id; char state; int need_time; int run_time; struct pcb *next;*p, *q, *first_pcb = NULL;typedef struct pcb PCB;void printSort():对各进程进行排序并输出各个进程PCBvoid showPCB():调度一次PCB并显示,若进程执行完毕,将其清除链表system():显示运行的进程和就绪的进程void pushPCB():将新的PCB块放到链表的末尾void newPCB():建立PCB块,并将它们组成一个队列五、程序清单1、先进先出算法 #includestdio.h#include#include#define getpch(type)(type*)malloc(sizeof(type)#define NULL 0 struct pcbchar name10;char state;int super;int ntime;int rtime;struct pcb *link;*p,*ready=NULL;typedef struct pcb PCB;void sort()PCB *first,*second;int insert=0;if(ready=NULL)|(p-super)(ready-super)p-link=ready;ready=p;elsefirst=ready;second=first-link;while(second!=NULL)if(p-super)(second-super)p-link=second;first-link=p;second=NULL;insert=1;elsefirst=first-link;second=second-link;if(insert=0)first-link=p;void input()int i,num;printf(n 请输入进程数?);scanf(%d,&num);for(i=0;iname); p-super=0;printf(n 请输入进程运行时间);scanf(%d,&p-ntime);p-rtime=0;p-state=w;p-link=NULL;sort();int space()int l=0;PCB*pr=ready;while(pr!=NULL)l+;pr=pr-link;return(l);void disp(PCB*pr)printf(n qnamet state t supertndtimetruntimen);printf(%s t,pr-name);printf(%c t,pr-state);printf(%d t,pr-super);printf(%d t,pr-ntime);printf(%d t,pr-rtime);printf(n );void check()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() destroy();void main()int len ,h=0;char ch;input();len=space();while(len!=0)&(ready!=NULL)ch=getchar();h+;printf(n The execute number:%dn,h);p=ready;ready=p-link;p-link=NULL;p-state=R;check();running();printf(n 一按键就继续);ch=getchar();printf(nn 进程已经完成);ch=getchar();2、轮转法#include #include #include #include static int id = 0;int process_num;int current_process;struct pcb char name20; int id; char state; int need_time; int run_time; struct pcb *next;*p, *q, *first_pcb = NULL;typedef struct pcb PCB;/* 排序输出各个进程PCB */void printSort() int i; q = first_pcb; for(i = 0; i id) printf(%s %d %c %d %d n, q - name, q - id, q - state, q - need_time, q - run_time); i+; q = first_pcb; else q = q - next; if(q = NULL) q = first_pcb; i+; /* 调度一次PCB并显示 */void showPCB() int i; first_pcb - run_time+; first_pcb - state = r; /* 进程执行完毕,将其清除出链表 */ if(first_pcb - run_time) = (first_pcb - need_time) current_process-; printf(进程%s已经运行完毕, first_pcb - name); system(pause); first_pcb = first_pcb - next; if(first_pcb = NULL) printf(所有进程都已经运行完毕); system(pause); return; first_pcb - state = r; system(cls); /* 显示运行的进程和就绪的进程 */ q = first_pcb - next; printf(-当前运行的进程是:进程%s/n/n, first_pcb - name); printf(n-在等待队列的进程是:); while(q != NULL) printf(进程%s , q - name); q = q - next; /* 显示相应的PCB块 */ printf(n-进程详细PCB-n); printf(n进程名 |进程ID |进程状态 |进程所需时间 |进程运行时间n); printSort(); /* 进行一次时间片轮换调度算法, 将队首的进程放到队尾,之前第二位进程获得cpu时间片 */ q = first_pcb; while(q - next != NULL) q = q - next; first_pcb - state = w; q - next = first_pcb; first_pcb = first_pcb - next; q - next - next = NULL; printf(/n); printf(运行调度); system(pause);/* 将新的PCB块放到链表末尾 */void pushPCB(int i) q - next = p; q = p; if(i = process_num - 1) q - next = NULL;/* 建立PCB块并将他们组成一个队列 */void newPCB()int i; printf(请输入进程数:); scanf(%d, &process_num); q = (PCB*)malloc(sizeof(PCB); first_pcb = (PCB*)malloc(sizeof(PCB); for(i = 0; i name); printf(请输入进程需要的运行时间:); scanf(%d, &p - need_time); p - id = id+; p - run_time = 0; p - state = w; if(i = 0) first_pcb = q = p; p - next = NULL; else pushPCB(i); void main() newPCB(); current_process = process_num; printf(按任意键开始进程调度/n); system(pause); while(current_process) showPCB(); 六、运行结果 1、先进先出2、轮转法-省去两张图-省去一张图片-六、流程图1、先进先出算法就绪队列空?初始化PCB,输入进程信息开始结束撤销该进程就绪队列首进程投入运行2、轮转法进程还要完成的时间是否为0进程占用CPU时间+1剩余时间-1计数器+1运行队列头指针不为空开始进程运行完毕将清除出链表将就绪队列第一个投入运行如果时间片到,计数器置0;将进程插入到就绪队列中等待轮转七、结果分析与调试过程总结开始做实验的时候遇
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考复习之文言文实词汇编
- 机械顶管专项施工方案
- 2026届贵州省施秉县九年级化学第一学期期中统考模拟试题含解析
- 2026届内蒙古开鲁县联考英语九上期末质量检测试题含解析
- 健康中国2030蓝图
- 2026届安徽省亳州市亳州市第一中学化学九年级第一学期期末教学质量检测模拟试题含解析
- 云南省陆良县2026届九年级化学第一学期期中复习检测试题含解析
- 项目总监工作总结
- 房屋植筋施工方案范文
- 北京市顺义区第一中学2025-2026学年高三上学期9月月考语文试题(含答案)
- (完整)注册安全工程师考试题库(含答案)
- 高考作文素材积累与写法总结27 自知与知人作文审题指导及素材积累
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
- 2024年贵州省贵阳市中考生物地理合卷试题(含答案逐题解析)
- DNDC模型使用手册
- DL∕T 2487-2022 电力燃煤机械名词术语
- 起重机械生产单位质量安全总监-特种设备考试题库
- JBT 9189-2016 水基材料防锈试验方法 铸铁屑试验
- JJF 1064-2024 坐标测量机校准规范
- 《春江花月夜》省公开课金奖全国赛课一等奖微课获奖课件
- 人音版小学六年级上册音乐教案(本)
评论
0/150
提交评论