您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 30进程调度实验报告
信息科学与技术学院实验报告课程名称:操作系统实验实验项目:进程调度实验地点:博西207指导教师:侯永莉日期:2017.11.24实验类型:验证性实验专业:服务外包班级:外二姓名:石顺义_____学号:1514104032一、实验目的及要求1.理解进程调度的概念和基本调度算法;2.利用C语言实现掌握进程算法FIFO,优先数调度算法,时间片轮转调度算法。二、实验仪器、设备或软件1.知识准备:学过进程管理、处理机调度等章节内容.2.硬件环境:个人计算机3.软件平台:Windows操作系统,语言开发环境VC++6.0.三、实验内容及原理1.实验原理1)FIFO算法思想:处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。2)优先数算法思想:优先数(prioritynumber)是一个与进程关联的固定区间的整数,优先级确定可由系统内部定义或由外部指定。优先选择就绪队列中最高优先权的进程投入运行。①非抢占式优先级法:当前占用CPU的进程一直运行下去,直到完成或因等待某事件而主动让出CPU时,系统才让另一个优先级高的进程占用CPU。②抢占式优先级法:立刻停止当前进程,强行将CPU分配给优先级高的进程。3)时间片轮转算法思想:把CPU时间划分成若干小单位--时间片,按顺序赋给就绪队列中的每一个进程,进程轮流占有CPU,当时间片用完时,进程被抢占并加入就绪队列尾;即使未执行完,系统也剥夺该进程的CPU,将该进程排在就绪队列末尾,同时系统选择另一个进程运行。2.实验内容:这个实验主要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统中,无论进行控制块中信息量多少,信息都可以大致分为以下四类:标识信息、管理信息、现场信息、说明信息。编写代码实现下面三种算法的任意一种FIFO,优先数调度算法,时间片轮转调度算法。四、实验步骤(或过程)利用软件vc++6.0,将程序代码输入,执行后依次输入七个数字组成pcb,执行结果如下。五、实验结论1、实验结果2、程序分析实验中,进程控制块队列采用单向不循环静态链表。该程序标识符采用编号方式,为每个进程依次分配一个不相同的正整数,使用进程控制块模拟进程,仅包括进程状态,用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。确定进程控制块内容后,由于实验模拟的是进程调度,没有对等待队列的操作,所以实验中只有一个指向正在运行进程的进程控制块指针和一个就绪进程控制块队列指。六、实验程序设计代码如下:#includeiostream#includestdio.h#includemalloc.husingnamespacestd;enumprocess_status{READY,RUN,FINISH};//进程的三种状态//定义进程数据结构typedefstructpcb{charprocess_tag[20];//存储进程标识符structpcb*next;//连接下一个进程的指针intpriority_num;//优先调度算法中为优先级,轮转调度算法中为轮转时间片inttake_cpu_time;//占用CPU时间片数intprocess_time;//进程所需时间片数process_statusstatus;//进程当前的状态}PCB;//定义进程控制块的链结构typedefstruct{PCB*run;//当前运行的进程指针PCB*ready;//当前准备队列的头指针PCB*tail;//准备队列的队尾指针PCB*finish;//完成队列的指针}PCBC;voidinit_pcbc(PCBC*p){p-run=NULL;p-ready=NULL;p-tail=NULL;p-finish=NULL;}//输入进程,并加入就绪队列voidinput_process(PCBC*pcbc){PCB*pcb;pcb=(PCB*)malloc(sizeof(PCB));printf(请输入进程标识符:);scanf(%s,&pcb-process_tag);printf(输入格式为:(优先级,占用CPU时间片数,进程所需时间片数):);scanf(%d,%d,%d,&pcb-priority_num,&pcb-take_cpu_time,&pcb-process_time);pcb-status=READY;//初始化就绪状态//当就绪队列为空时if(pcbc-ready==NULL&&pcbc-tail==NULL){pcbc-ready=pcbc-tail=pcb;pcb-next=NULL;}else{//将新进入的队列加入队尾pcb-next=pcbc-tail-next;pcbc-tail-next=pcb;pcbc-tail=pcb;}}voidswapx(PCB*p1,PCB*p2){inti,priority_num,take_cpu_time,process_time;chartemp;//进行标识符的交换for(i=0;i20;i++){temp=p1-process_tag[i];p1-process_tag[i]=p2-process_tag[i];p2-process_tag[i]=temp;}//优先值的交换priority_num=p1-priority_num;p1-priority_num=p2-priority_num;p2-priority_num=priority_num;//占用CPU时间片的交换take_cpu_time=p1-take_cpu_time;p1-take_cpu_time=p2-take_cpu_time;p2-take_cpu_time=take_cpu_time;//进程所需时间片数的交换process_time=p1-process_time;p1-process_time=p2-process_time;p2-process_time=process_time;}//将就绪队列按优先级别大小进行排序,按冒泡排序算法voidsort_pcbc(PCBC*pcbc,intpcb_num){PCB*p,*p1;p=pcbc-ready;for(p=pcbc-ready;p!=NULL;p=p-next){for(p1=p-next;p1!=NULL;p1=p1-next){if(p-priority_nump1-priority_num){swapx(p,p1);//只是进行指针内部数据的交换,不改变指针指向}}}}/**打印当前进程控制块中的情况*/voidprint_log(PCBC*pcbc){PCB*ready,*finish;ready=pcbc-ready;finish=pcbc-finish;printf(--------------------------------------------------\n);printf(Run:\n);if(pcbc-run!=NULL){printf(%s%04d%04d%04d\n,pcbc-run-process_tag,pcbc-run-priority_num,pcbc-run-take_cpu_time,pcbc-run-process_time);}else{printf(Runisempty!\n);}printf(Ready:\n);while(ready!=NULL){printf(%s%04d%04d%04d\n,ready-process_tag,ready-priority_num,ready-take_cpu_time,ready-process_time);ready=ready-next;}printf(Finish:\n);while(finish!=NULL){printf(%s%04d%04d%04d\n,finish-process_tag,finish-priority_num,finish-take_cpu_time,finish-process_time);finish=finish-next;}}/**运行进程控制块*/voidrun_pcbc_priority(PCBC*xpcbc){PCBC*pcbc=xpcbc;PCB*temp,*pre,*tail;//进行那个CPU的循环调用while(pcbc-ready!=NULL){pcbc-run=pcbc-ready;//将就绪队列队首加入运行队列pcbc-ready=pcbc-ready-next;//改变队首元素print_log(pcbc);pcbc-run-priority_num-=3;pcbc-run-process_time-=1;if(pcbc-run-process_time==0){if(pcbc-finish==NULL){pcbc-finish=pcbc-run;pcbc-finish-next=NULL;tail=pcbc-finish;}else{tail-next=pcbc-run;tail=tail-next;tail-next=NULL;}}else{if(pcbc-ready!=NULL){temp=pcbc-ready;while(temp!=NULL){if(pcbc-run-priority_numtemp-priority_num){break;}pre=temp;temp=temp-next;}if(temp==pcbc-ready){pcbc-run-next=pcbc-ready;pcbc-ready=pcbc-run;}else{pcbc-run-next=pre-next;pre-next=pcbc-run;}}else{pcbc-ready=pcbc-run;}}}pcbc-run=NULL;print_log(pcbc);}intmain(){PCBC*pcbc;//创建进程控制块链;intpcb_num;//记录处理进程数目pcbc=(PCBC*)malloc(sizeof(PCBC));printf(请输入要处理的进程数目:);scanf(%d,&pcb_num);init_pcbc(pcbc);//初始化进程控制块链for(inti=0;ipcb_num;i++){input_process(pcbc);//输入所有进程,并进入就绪队列}//根据队列优先级进行排序sort_pcbc(pcbc,pcb_num);//通过优先调度算法运行printf(Bythepriority--------------------------\n);run_pcbc_priority(pcbc);return0;}运行结果:
本文标题:30进程调度实验报告
链接地址:https://www.777doc.com/doc-4363273 .html