实验1进程调度算法2015
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//进程运行队列头指针 //进程空闲队列头指针 //进程就绪队列头指针 //进程就绪队列尾指针 //阻塞队列头指针 //阻塞队列尾指针
void init_pcb_table( );
//初始化进程控制块表
void print_space(int num);
//显示若干个空格
void display_process_queue(PCB *queue);
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <io.h> #include <string.h>
#define MAX_PROCESS 10 int process_number=0;
//下一个可用的进程编号
typedef struct pcb{ struct pcb *next; char process_name[20]; int process_number; int process_start_moment; int process_need_time; int process_time_slice; int process_priority;
pcb_blocked
进程阻塞队列头指针
pcb_blocked_rear 进程阻塞队列尾指针
图 2-3 宏和全局变量
函数名称 main
init_pcb_table display_process_queue create_process block_process_by_name wakeup_process FCFS RR HPF MFBQ
实验 1 进程调度算法 1、实验目的
进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程 状态转换,它提供了在可运行的进程之间复用 CPU 的方法。在进程管理中,进 程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于 就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进 程优先占用处理器。本实验模拟在单处理器情况下的进程调度,目的是加深对进 程调度工作的理解,掌握不同调度算法的优缺点。
数据项 next
process_name process_number
process_start_moment process_need_time process_time_slice process_priority
作用 前向指针,指向下一个进程控制块,用来构 成进程队列 进程名称 进程号,当进程有相同名称时,用来区分进 程 进程启动时刻 进程要求运行时间 时间片 优先数 图 2-2 进程控制块
5 实验要求 5.1 界面要求
实验要求采用简单的控制台界面,包括一级功能菜单,如图 2-1 所示。
图 2-1 界面要求
5.2 功能要求 实验应该包括以下功能: 1. 运行先来先服务进程调度算法; 2. 运行时间片轮转进程调度算法; 3. 运行优先数进程调度算法; 4. 运行多级反馈队列进程调度算法; 5. 显示就绪进程队列; 6. 显示运行进程队列; 7. 显示阻塞进程队列; 8. 创建新进程; 9. 阻塞进程; 10. 唤醒进程; 11. 删除进程; 12. 退出程序。
②为每一个队列设立一个队列头指针,它总是指向排在队列之首的进程的 PCB。 ③排在队尾的进程的 PCB,它的“队列指针”项内容应该为“NULL”,或一个特殊的符号, 以表示这是该队的队尾 PCB。 在单 CPU 系统中,任何时刻都只有一个进程处于运行状态,因此运行队列中只能有一个 PCB;系统中所有处于就绪状态的进程的 PCB 排成一队,称其为“就绪队列”。一般地,就 绪队列中会有多个进程的 PCB 排在里面,它们形成处理机分配的候选对象。如果就绪队列 里没有 PCB 存在,则称该队列为空;所有处于阻塞状态进程的 PCB,应该根据阻塞的原因 进行排队,每一个都称为一个“阻塞队列”。比如等待磁盘输入/输出进程的 PCB 排成一个队 列,等待打印机输出进程的 PCB 排成一个队列等。所以,系统中可以有多个阻塞队列,每 个阻塞队列中可以有多个进程的 PCB,也可以为空。
②时间片轮转法 时间片轮转调度算法的基本思想是:为就绪队列中的每一个进程分配一个称 为“时间片”的时间段,它是允许该进程运行的时间长度。在使用完一个时间片后, 即使进程还没有运行完毕,也要强迫其释放处理机,让给另一个进程使用。它自 己则返回到就绪队列末尾,排队等待下一次调度的到来。采用这种调度算法时, 对就绪队列的管理与先来先服务完全相同。主要区别是进程每次占用处理机的时 间由时间片决定,而不是只要占用处理机就一直运行下去,直到运行完毕或为等 待某一事件的发生而自动放弃。 ③优先数调度算法 优先数调度算法的基本思想是:为每一个进程确定一个优先数,进程就绪队 列按照优先数排序。 如何确定进程的优先数(也就是进程的优先级)?可以从如下几个方面考虑。 ⅰ)根据进程的类型。系统中既有系统进程,又有用户进程。系统进程完成 的任务是提供系统服务,分配系统资源,因此,给予系统进程较高的优先数能够 提高系统的工作效率。 ⅱ)根据进程执行任务的重要性。重要性和紧迫性高的进程应当被赋予较高 的优先级。 ⅲ)根据进程程序的性质。一个 CPU 繁忙的进程,由于需要占用较长的运 行时间,影响系统整体效率的发挥,因此只能给予较低的优先数。一个 I/O 繁忙 的进程,给予它较高的优先数后,就能充分发挥 CPU 和外部设备之间的并行工 作能力。 ⅳ)根据对资源的要求。系统资源有处理机、内存储器和外部设备等。可以 按照一个进程所需资源的类型和数量,确定它的优先数。比如给予占用 CPU 时 间短或内存容量少的进程以较高的优先数,这样可以提高系统的吞吐量。 ⅴ)根据用户的请求。系统可以根据用户的请求,给予它的进程很高的优先 数,作“加急”处理。 ④多级队列调度算法 多级队列调度算法也称多级反馈队列调度算法,它是时间片调度算法与优先 数调度算法的结合。实行这种调度算法时,系统中将维持多个就绪队列,每个就 绪队列具有不同的调度级别,可以获得不同长度的时间片。例如,系统维持 N 个就绪队列,第 1 级就绪队列中进程的调度级别最高,可获得的时间片最短,第 N 级就绪队列中进程的调度级别最低,可获得的时间片最长。 具体的调度方法是:创建一个新进程时,它的 PCB 将进入第 1 级就绪队列 的末尾。对于在第 1 级到第 N-1 级队列中的进程,如果在分配给它的时间片内完 成了全部工作,那么就撤离系统;如果在时间片没有用完时提出了输入/输出请 求或要等待某事件发生,那么就进入相应的阻塞队列里等待。在所等待的事件出 现时,仍回到原队列末尾,参与下一轮调度(也就是每个队列实行先来先服务调 度算法);如果用完了时间片还没有完成自己的工作,那么只能放弃对 CPU 的使 用,降到低一级队列的末尾,参与那个队列的调度。对位于最后一个队列里的进
可以看出,多级队列调度算法优先照顾 I/O 繁忙的进程。I/O 繁忙的进程在 获得一点 CPU 时间后就会提出输入/输出请求,因此它们总是被保持在 1、2 级 等较前面的队列中,总能获得较多的调度机会。对于 CPU 繁忙的进程,它们需 要较长的 CPU 时间,因此会逐渐地由级别高的队列往下降,以获得更多的 CPU 时间,它们“沉”得越深,被调度到的机会就越少。但是,一旦被调度到,就会获 得更多的 CPU 时间。
程,实行时间片轮转调度算法。 整个系统最先调度 1 级就绪队列;只有在上一级就绪队列为空时,才去下一
级队列调度。当比运行进程更高级别的队列中到达一个进程(可以肯定,在此之 前比运行进程级别高的所有队列全为空)时,系统将立即停止当前运行进程的运 行,让它回到自己队列的末尾,转去运行级别高的那个进程。
//先来先服务进程调度算法
void RR( );
//时间片轮转进程调度算法
void HPF( );
//优先数进程调度算法
(3)进程调度算法 进程调度算法用于确定就绪队列中的哪一个进程即将获Leabharlann Baidu CPU。常用的进
程调度算法有先来先服务法、时间片轮转法、优先数法等。 ①先来先服务调度算法
先来先服务调度算法的基本思想是:以到达就绪队列的先后次序为标准来选 择占用处理机的进程。一个进程一旦占有处理机,就一直使用下去,直至正常结 束或因等待某事件的发生而让出处理机。采用这种算法时,应该这样来管理就绪 队列:到达的进程的 PCB 总是排在就绪队列末尾;调度程序总是把 CPU 分配给 就绪队列中的第一个进程使用。
6 实验步骤 6.1 总体设计
确定程序包含多少个模块,每个模块有哪些功能、包括哪些函数,模块之间
的调用关系如何。由于本实验并不复杂,所以只用一个模块实现。要求宏、数据 结构、全局变量和函数原型放在头文件中,而函数实现放在源文件中。假设头文 件名为 process_schedule.h,源程序文件名为 process_schedule.cpp。实验中用到的 主要数据结构是进程控制块,其结构如图 2-2 所示。实验中用到 1 个宏和 8 个全 局变量,如图 2-3 所示。实验中用到的主要函数有 10 个,如图 2-4 所示。
全局变量名称
作用
MAX_PROCESS 程序最多能处理的进程数
process_number 存放下一个被创建进程的 进程号
pcb_table
进程控制块表
pcb_run
进程运行队列头指针
pcb_free
进程空闲队列头指针
pcb_ready
进程就绪队列头指针
pcb_ready_rear 进程就绪队列尾指针
(2)进程控制块队列
在多道程序设计环境里,同时会创建多个进程。当计算机系统只有一个 CPU 时,每次 只能让一个进程运行,其他的进程或处于就绪状态,或处于阻塞状态。为了对这些进程进行 管理,操作系统要做三件事。
①把处于相同状态的进程的 PCB,通过各自的队列指针链接在一起,形成一个个队列。 通常有运行队列、就绪队列、阻塞队列。
作用 初始化进程队列,并管理主菜 单命令 初始化进程空闲队列 以表格的形式显示进程队列 创建进程 阻塞进程 唤醒进程 先进先出进程调度算法 时间片轮转进程调度算法 优先数进程调度算法 多级反馈队列进程调度算法
图 2-4 函数名称及作用
6.2 详细设计及实现
1). 头文件
头文件中含有图 2-2、图 2-3 和图 2-4 的内容。
//显示进程队列
PCB *create_process( );
//创建进程函数,成功时返回新创建进程
的 PCB,失败时返回 NULL。
void block_process_by_name( );
//阻塞指定名称的进程。
void wakeup_process( );
//唤醒进程
void FCFS( );
}PCB; PCB pcb_table[MAX_PROCESS];
//下一个进程控制块指针 //进程名 //进程编号 //进程启动时刻 //要求运行时间 //时间片 //优先数
//自定义数据类型:进程控制块 //进程控制块表
PCB *pcb_run=NULL; PCB *pcb_free=NULL; PCB *pcb_ready=NULL; PCB *pcb_ready_rear=NULL; PCB *pcb_blocked=NULL; PCB *pcb_blocked_rear=NULL;
2、实验内容 选择两个调度算法作为两个实验题目,实现处理器调度。
3、实验要求 要求完成以下功能:运行处理器调度算法,显示就绪进程队列、显示运行进
程队列、显示阻塞进程队列、创建新进程、阻塞进程、唤醒进程、删除进程、退 出程序。
4、实验预习内容 (1)进程控制块
为了管理和控制进程,系统在创建每一个进程时,都为其开辟一个专用的存储区,用以 随时记录它在系统中的动态特性。而当一个进程被撤消时,系统就收回分配给它的存储区。 通常,把这一存储区称为该进程的“进程控制块”(Process Control Block)。 由于 PCB 是随着进程的创建而建立,随着进程的撤消而取消的,因此系统是通过 PCB 来“感 知”一个个进程的,PCB 是进程存在的唯一标志。