操作系统---进程调度算法地模拟.pdf
.操作系统 实验题目 进程调度算法模拟 一、实验目的 通过对进程调度算法的模拟,进一步理解进程的根本概念,加深对进程运行状态和进程调度过程、调度算法的理解.二、设备与环境 1硬件设备:PC 机一台 2软件环境:安装 Windows 操作系统或者 Linux 操作系统,并安装相关的程序开发环境,如 C C+Java 等编程语言环境.三、实验内容 1用 C、C+、Java 语言编程实现对 5 个进程采用动态优先权调度算法进展调度的过程.数据如下:5 个进程的到达时刻和服务时间见下表,忽略 I/O 以与其它开销时间,使用动态优先权算法进展调度,优先权初始值为 100,请输出各个进程的完成时刻、周转时间、带权周转时间.进程 到达时刻 服务时间 A 0 3 B 2 6 C 4 4 D 6 5 E 8 2 2每个用来标识进程的进程控制块 PCB 可用结构来描述,包括以下字段用不到的字段可以不定义.进程标识数 ID.进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高.进程已占用 CPU 时间 CPUTIME.进程还需占用的 CPU 时间 ALLTIME.当进程运行完毕时,ALLTIME 变为 0.进程的阻塞时间 STARTBLOCK,表示当进程再运行 STARTBLOCK 个时间片后,进程将进入阻塞状态.进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换.成就绪状态.进程状态 STATE.队列指针 NEXT,用来将 PCB 排成队列.3优先数改变的原如此:进程在就绪队列中呆一个时间片,优先数增加 1.进程每运行一个时间片,优先数减 3.4 为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程.5分析程序运行的结果,谈一下自己的认识.四、实验结果与分析 1实验关键代码 模拟 PCB 数据结构定义:/枚举进程的状态:新建、就绪、执行、阻塞、终止 enum STATE_PROCESS New,Ready,Run,Block,Finish;typedef enum STATE_PROCESS STATE;/建立 PCB 结构体 struct PCB_NODE int id;/进程标识数 int priority;/进程优先数 int arriveTime;/进程到达时间 int cpuTime;/进程已占用 CPU 时间 int allTime;/进程还需占用 CPU 时间 int blockTime;/进程已阻塞时间 STATE state;/进程状态 struct PCB_NODE*prev;/PCB 前指针 struct PCB_NODE*next;/PCB 后指针 ;typedef struct PCB_NODE PCB;模拟进程队列操作函数定义:/进程入列 void queuePush /进程出列 void queuePop /查看队列中进程信息 void queueWalk 模拟就绪队列操作函数定义:/进程插入到就绪队列 void readyQueuePush /优先数最大的进程出列 PCB*readyQueuePop /每个时间片更新就绪队列中的进程信息 void readyQueueUpdate /返回就绪队列最大优先数的值 int readyMaxPriority /查看就绪队列中的进程信息 void readyQueueWalk 模拟阻塞队列操作函数定义:/进程插入到阻塞队列.void blockQueuePush /优先数最大的进程出列 PCB*blockQueuePop /每个时间片更新阻塞队列中进程的信息 void blockQueueUpdate /查看阻塞队列中的进程信息 void blockQueueWalk 模拟动态优先权进程调度函数定义:/初始化进程 PCB 数据,返回 PCB 头指针 PCB*initData /模拟 CPU 执行 1 个时间片的操作 void cpuWord 主函数关键代码:int timeSlice=0;/模拟 CPU 时间片 int cpuBusy =0;/模拟 CPU 状态 PCB*cpuProcess=NULL;/当前 CPU 执行的进程 PCB*pHead,*pro;/进程 PCB 头指针 pHead=initData;/初始化进程 PCB,返回进程头指针 pro=pHead+1;/pro 指向 PCB 中第一个进程 readyQueueUpdate;/根据进程到达时间将新建进程参加绪队列 /模拟动态优先权进程调度 while if printf;break;/end if if /CPU 空闲,选择一个进程进入 CPU if 0 /选择就绪队列优先级最高的进程作为 CPU 运行进程 cpuProcess=readyQueuePop;else /就绪队列中没有进程,改为选择阻塞队列优先级最高的进程 cpuProcess=blockQueuePop;cpuProcess-cpuTime=0;/设置当前运行进程占用 CPU 时间 cpuProcess-state=Run;/设置当前运行进程的状态 cpuBusy=1;/设置 CPU 当前状态为忙 /end if timeSlice+;/当前时间片加 1 printf;cpuWord;/模拟 CPU 执行 1 个时间片的操作 ifallTime=0 /假如当前执行进程还需 CPU 时间片为 0 cpuProcess-state=Finish;/设置当前进程状态为终止 free;/释放该进程的 PCB 内存空间 cpuBusy=0;/CPU 状态设置为空闲 /end if /更新就绪队列和阻塞队列中的进程信息 blockQueueUpdate;readyQueueUpdate;/查看就绪队列和阻塞队列的进程信息 readyQueueWalk;blockQueueWalk;if 0&cpuProcess-priority readyMaxPriority blockQueuePush;/需抢占 CPU,当前执行的进程调入阻塞队列 cpuProcess=readyQueuePop;/从就绪队列中选择优先级最高的进程运行 /end if printf;return 0;(2)动态优先权调度算法流程图.2实验结果 第 1 个时间片后:.第 2 个时间片后:第 3 个时间片后:第 4 个时间片后:第 5 个时间片后:.第 6 个时间片后:第 7 个时间片后:第 8 个时间片后:第 9 个时间片后:第 10 个时间片后:.第 11 个时间片后:第 12 个时间片后:第13个时间片后:第 14 个时间片后:第 15 个时间片后:.第 16 个时间片后:第 17 个时间片后:第 18 个时间片后:第 19 个时间片后:第 20 个时间片后:.(3)实验结果分析 调度算法开始之前进程 PCB 信息为:调度算法完毕之后进程 PCB 信息为:调度算法分析:4实验心得 通过进程动态优先权调度算法的模拟,对进程的运行状态,进程 PCB 数据结构,进程调度算法有了更深的理解.动态优先权调度算法为了防止高优先级进程无休止地运行下去,调度程序在每个时钟滴答即每个时钟中断降低当前进程的优先级.如果这个动作导致该进程的优先级低于次高优先级的进程,如此进展进程切换,可以防止低优先级进程长时间的饥饿等待.此外,优先级可以由系统动态确定.例如有些进程为 I/O 密集型,其多数时间用来等待 I/O 完毕.当这样的进程需要 CPU 时,应立即分配给它 CPU,以便启动下一个 I/O 请求,这样就可以在另一个进程计算的同时执行I/O操作.使这类I/O密集型进程长时间等待只会造成它无谓地长时间占用内存.使 I/O 密集型进程获得较好服务的一种简单算法是,将其优先级设为 1/f,f 为该进程在上一时间片中所占的局部.如果一个在其 50ms 的时间片中只使用 1ms 的进程的优先级为 50,而在阻塞进程 ID 到达时间 服务时间 完毕时间 周转时间 带权周转时间 0 0 3 10 10 1 2 6 20 18 2 4 4 16 12 3 6 5 18 12 4 8 2 13 5 .之前用掉 25ms 的进程优先级为 2,使用掉全部时间片的进程优先级为 1.这样,可以很方便地将一组进程按优先级分成假如干类,并在各类之间采用优先级调度,而在各类进程的内部采用轮转调度.如如下图为一个具有 4 类优先级的系统,其调度算法如下:只要存在优先级为第 4 类的可运行进程,就按照轮转法为每个进程运行一个时间片,此时不理会较低优先级的进程.假如第 4类进程为空,如此按照轮转法运行第3类进程.假如第4类和第3类均为空,如此按照轮转法运行第 2 类进程.如果不偶尔对优先级进展调整,如此低优先级进程很可能会产生饥饿现象.队列头 可运行进程 教 师 评 价 评定项目 A B C D 评定项目 A B C D 算法正确 界面美观,布局合理 程序结构合理 操作熟练 语法、语义正确 解析完整 实验结果正确 文字流畅 报告规 X 题解正确 其他:评价教师签名:年 月 日 优先级4优先级2优先级3优先级1最高优先级 最低优先级