logo资料库

操作系统课程设计(进程调度与银行家算法).doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
1. 进程调度算法 1. 实验目的 调度的实质是操作系统按照某种特定的分配策略来分配资源。进 程调的目的是分配 CPU 资源。由于进程调度程序执行的频率很高, 因此调度算法的好坏将直接影响到操作系统的性能。本实验的目的是 编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不 同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较 各种算法的性能优劣。 2. 实验原理 (1) 进程调度算法 进程调度算法包括先来先服务调度算法,优先数调度算法,时间片轮 转算法和分级调度算法等 4 种。下面对前 3 种算法作一简单介绍。 (a) 先来先服务(FCFS)调度算法 本算法在进行调度时,总是选择一个最先进入进程就绪队列的进 程,把处理器分配给它,使之开始运行。该进程一直运行到完成或发 生阻塞事件时,才放弃处理器。 (b) 优先调度算法 对每个进程确定一个优先数,进程调度总是让具有最高优先数的 进程先使用处理器。如果就绪队列出现优先数相同的进程,则对这些 有相同优先数的进程采用先来先服务算法进行调度。
对于占用处理器的进程,系统可以使用“抢占式”或“非抢占式”的 策略。“非抢占式”指进程一旦占用处理器,除非自己愿意,否则操 作系统不能将处理器强行夺走,即使该进程的优先数已经小于就绪队 列中的某个进程。“抢占式”则相反,一旦就绪队列中的某个进程优 先数大于正在执行的进程,立刻进行进程切换。 进程的优先数可以发生变化。本实验的基本要求是实现固定优先 数的调度算法。 (c) 时间片轮转调度算法 在需要保证响应的场合通常采用时间片轮转算法来分配处理器 的。本算法将所有的就绪进程按先来先服务的原则排成一个队列,每 次调度时把 CPU 分配给队首进程,令其执行一个时间片。时间片用 完,调度程序自动停止该进程的执行,将它放到进程就绪队列的末尾, 等待下一次执行,然后将 CPU 分配给就绪队列中新的队首进程,也 让它执行一个时间片。重复这个过程,直到所有的进程执行完毕。 (2) 衡量算法性能的参数 下面引入两个衡量调度算法性能的参数。 (a) 平均周转时间: 1 n T=  n 1 i  i  (b) 平均带权周转时间:
1 i n W=  n 1 si   i 其中:n 为进程数目 Ti 为第 i 个进程的周转时间,即进程从开始运行到结束的时间。 Tsi 为第 i 个进程要求执行的时间,即需要在 CPU 上的执行时间。 3、实验内容 ( a ) 建立进程的进程控制块,进程控制块至少应该包括: 进程名称 进程需要执行的时间 进程执行开始的时间 进程执行结束的时间 进程的优先权 ( b ) 编程实现先来先服务算法、优先数调度算法和时间片轮转调度 算法。 ( c ) 进程及相关的信息的输入。这些信息可以直接从键盘上输入, 也可以从文件上读取。 ( d ) 时间片与时间流逝的模拟。 ( e ) 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个 进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整 个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果 按一定的格式显示在计算机屏幕上或者输出到文件夹中。
4.程序运行截图 1,运行程序后,将出现如下界面: 2,在这我们不妨输入 2,并输入第一个进程的相应信息(用户可根 据实际情况输入),得到如下界面:
3,接着输入第二个进程的信息,界面如下: 4,任意选择一种算法,执行得到相应结果。 (1)若 选 择 1. 先 来 先 服 务 , 则 的 到 如 下 结 果 : (2)若 选 择 2. 优 先 级 调 度 , 则 得 到 如 下 结 果 :
(3)若 选 择 3. 短 作 业 优 先 , 则 得 到 如 下 结 果 : 5.源程序清单。 #include using namespace std; #define MAX 10 struct task_struct { char name[10]; /*进程名称*/
int number; /*进程编号*/ float come_time; /*到达时间*/ float run_begin_time; /*开始运行时间*/ float run_time; /*运行时间*/ float run_end_time; /*运行结束时间*/ int priority; /*优先级*/ int order; /*运行次序*/ int run_flag; /*调度标志*/ }tasks[MAX]; int counter; /*实际进程个数*/ int fcfs(); /*先来先服务*/ int ps(); /*优先级调度*/ int sjf(); /*短作业优先*/ int pinput(); /*进程参数输入*/ int poutput(); /*调度结果输出*/ void main() { int option; pinput(); printf("请选择调度算法(0~3):\n"); printf("1.先来先服务\n"); printf("2.优先级调度\n"); printf(" 3.短作业优先\n"); printf(" 0.退出\n"); scanf("%d",&option); switch (option) { case 0: printf("运行结束。\n"); break; case 1: printf("对进程按先来先服务调度。\n\n"); fcfs(); poutput(); break; case 2: printf("对进程按优先级调度。\n\n"); ps(); poutput(); break; case 3: printf("对进程按短作业优先调度。\n\n"); sjf();
poutput(); break; } } int fcfs() /*先来先服务*/ { float time_temp=0; int i; int number_schedul; time_temp=tasks[0].come_time; for(i=0;itasks[i].priority) { max_priority=tasks[j].priority; i=j; } j++; } /*查找第一个被调度的进程*/ /*对第一个被调度的进程求相应的参数*/ number_schedul=i; tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;
分享到:
收藏