《进程调度实验报告(共8页).doc》由会员分享,可在线阅读,更多相关《进程调度实验报告(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上信息科学与技术学院实验报告课程名称: 操作系统实验 实验项目: 进程调度 实验地点: 博西207 指导教师: 侯永莉 日期: 2017.11.24 实验类型: 验证性实验 专业: 服务外包 班级: 外二 姓名: 石顺义_ 学号: 一、实验目的及要求1. 理解进程调度的概念和基本调度算法;2. 利用C语言实现掌握进程算法FIFO,优先数调度算法,时间片轮转调度算法。二、实验仪器、设备或软件1. 知识准备:学过进程管理、处理机调度等章节内容.2. 硬件环境:个人计算机3. 软件平台:Windows操作系统,语言开发环境VC+6.0.三、实验内容及原理1. 实验原理1) F
2、IFO算法思想:处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。2) 优先数算法思想:优先数(priority number)是一个与进程关联的固定区间的整数,优先级确定可由系统内部定义或由外部指定。优先选择就绪队列中最高优先权的进程投入运行。 非抢占式优先级法:当前占用CPU的进程一直运行下去,直到完成或因等待某事件而主动让出CPU时,系统才让另一个优先级高的进程占用CPU。 抢占式优先级法:立刻停止当前进程,强行将CPU分配给优先级高的进程。3) 时间片轮转算法思想:把CPU时间划分成若干小单位-时间片,按顺序赋给就绪队列中的每
3、一个进程,进程轮流占有CPU,当时间片用完时,进程被抢占并加入就绪队列尾;即使未执行完,系统也剥夺该进程的CPU,将该进程排在就绪队列末尾,同时系统选择另一个进程运行。2. 实验内容:这个实验主要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统中,无论进行控制块中信息量多少,信息都可以大致分为以下四类:标识信息、管理信息、现场信息、说明信
4、息。编写代码实现下面三种算法的任意一种FIFO,优先数调度算法,时间片轮转调度算法。四、实验步骤(或过程) 利用软件vc+6.0,将程序代码输入,执行后依次输入七个数字组成pcb,执行结果如下。 五、实验结论1、实验结果 2、程序分析 实验中,进程控制块队列采用单向不循环静态链表。该程序标识符采用编号方式,为每个进程依次分配一个不相同的正整数,使用进程控制块模拟进程,仅包括进程状态,用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。确定进程控制块内容后,由于实验模拟的是进程调度,没有对等待队列的操作,所以实验中只有
5、一个指向正在运行进程的进程控制块指针和一个就绪进程控制块队列指。六、实验程序设计代码如下:#include#include#includeusing namespace std;enum process_statusREADY , RUN , FINISH; /进程的三种状态/定义进程数据结构typedef struct pcb char process_tag20 ; /存储进程标识符 struct pcb *next ; /连接下一个进程的指针 int priority_num ; /优先调度算法中为优先级 , 轮转调度算法中为轮转时间片 int take_cpu_time ; /占用CP
6、U时间片数 int process_time ; /进程所需时间片数 process_status status ; /进程当前的状态 PCB ;/定义进程控制块的链结构typedef struct PCB *run ; /当前运行的进程指针 PCB *ready ; /当前准备队列的头指针 PCB *tail ; /准备队列的队尾指针 PCB *finish ; /完成队列的指针 PCBC ;void init_pcbc(PCBC *p) p-run = NULL ; p-ready = NULL ; p-tail = NULL ; p-finish = NULL ;/输入进程,并加入就绪队
7、列void input_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-r
8、eady = 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 ; void swapx(PCB * p1 , PCB *p2) int i , priority_num , take_cpu_time , process_time ; char temp ; /进行标识符的交换 for(i = 0 ; i process_tag
9、i; p1-process_tagi = p2-process_tagi ; p2-process_tagi = 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 ; /进程所需
10、时间片数的交换 process_time = p1-process_time ; p1-process_time = p2-process_time ; p2-process_time = process_time ;/将就绪队列按优先级别大小进行排序,按冒泡排序算法void sort_pcbc(PCBC *pcbc , int pcb_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(
11、p-priority_num priority_num) swapx(p , p1) ; /只是进行指针内部数据的交换,不改变指针指向 /* *打印当前进程控制块中的情况 */ void print_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-prior
12、ity_num , pcbc-run-take_cpu_time , pcbc-run-process_time) ; else printf(Run is empty! 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 != N
13、ULL) printf(%s %04d %04d %04d n , finish-process_tag ,finish-priority_num , finish-take_cpu_time , finish-process_time) ; finish = finish-next ; /* *运行进程控制块 */ void run_pcbc_priority(PCBC *xpcbc) PCBC *pcbc = xpcbc ; PCB *temp , *pre , *tail ; /进行那个CPU的循环调用 while(pcbc-ready != NULL) pcbc-run = pcbc-
14、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 = ta
15、il-next ; tail-next = NULL ; else if(pcbc-ready != NULL) temp = pcbc-ready ; while(temp != NULL) if(pcbc-run-priority_num temp-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 = p
16、cbc-run ; else pcbc-ready = pcbc-run ; pcbc-run = NULL ; print_log(pcbc) ; int main() PCBC *pcbc ; /创建进程控制块链 ; int pcb_num ; /记录处理进程数目 pcbc = (PCBC*)malloc(sizeof(PCBC) ; printf(请输入要处理的进程数目: ) ; scanf(%d , &pcb_num) ; init_pcbc(pcbc) ; /初始化进程控制块链 for(int i = 0 ; i pcb_num ; i+) input_process(pcbc) ; /输入所有进程,并进入就绪队列 /根据队列优先级进行排序 sort_pcbc(pcbc , pcb_num) ; /通过优先调度算法运行 printf(By the priority-n) ; run_pcbc_priority(pcbc) ; return 0 ;运行结果:专心-专注-专业