1、操作系统进程调度模拟算法附源码进程调度模拟算法课程名称:计算机操作系统 班级:信1501-2实验者姓名:李琛 实验日期:2018年5月1日评分: 教师签名:一、实验目的进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。二、实验要求1.设计进程控制块 PCB 的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的 CPU 时间、进程到完成还需要的时间、进程的状态、当前队列指针等。2.编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3.按
2、要求输出结果。三、实验过程分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。 (一)进程控制块结构如下: NAME进程标示符 PRIO/ROUND进程优先数/进程每次轮转的时间片数(设为常数 2) CPUTIME进程累计占用 CPU 的时间片数 NEEDTIME进程到完成还需要的时间片数 STATE进程状态 NEXT链指针 注: 1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算; 2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时
3、给定。(二)进程的就绪态和等待态均为链表结构,共有四个指针如下: RUN当前运行进程指针 READY就需队列头指针 TAIL 就需队列尾指针 FINISH 完成队列头指针(三)程序说明 1. 在优先数算法中,进程优先数的初值设为: 50-NEEDTIME每执行一次,优先数减 1,CPU 时间片数加 1,进程还需要的时间片数减 1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加 2,进程还需要的时间片数减 2,并退出 CPU,排到就绪队列尾,等待下一次调度。 2. 程序的模块结构如下: 整个程序可由主程序和如下 7 个过程组成: 2 (1)INSERT1
4、在优先数算法中,将尚未完成的 PCB 按优先数顺序插入到就绪队列中; (2)INSERT2在轮转法中,将执行了一个时间片单位(为 2),但尚未完成的进程的 PCB,插到就绪队列的队尾; (3)FIRSTIN调度就绪队列的第一个进程投入运行; (4)PRINT显示每执行一次后所有进程的状态及有关信息。 (5)CREATE创建新进程,并将它的 PCB 插入就绪队列; (6)PRISCH按优先数算法调度进程; (7)ROUNDSCH按时间片轮转法调度进程。 主程序定义 PCB 结构和其他有关变量。实验代码:Main.cpp#include#includeusing namespace std;typ
5、edef struct node char name20; /进程名 int prio; /进程优先级 int round; /分配CPU的时间片 int cputime; /CPU执行时间 int needtime; /进程执行所需时间 char state; /进程状态 int count; /记录执行次数 struct node *next; /链表指针PCB;int num;/定义三个队列,就绪队列,执行队列,完成队列PCB *ready = NULL; /就绪队列PCB *run = NULL; /执行队列PCB *finish = NULL; /完成队列/取得第一个就绪节点void
6、 GetFirst() run = ready; if (ready != NULL) run-state = R; ready = ready-next; run-next = NULL; /优先级输出队列void Output1() PCB *p; p = ready; while (p != NULL) cout name t prio t cputime t needtime t state t count next; p = finish; while (p != NULL) cout name t prio t cputime t needtime t state t count
7、next; p = run; while (p != NULL) cout name t prio t cputime t needtime t state t count next; /轮转法输出队列void Output2() PCB *p; p = ready; while (p != NULL) cout name t round t cputime t needtime t state t count next; p = finish; while (p != NULL) cout name t round t cputime t needtime t state t count n
8、ext; p = run; while (p != NULL) cout name t round t cputime t needtime t state t count next; /创建优先级队列/创建优先级队列,规定优先数越小,优先级越低 void InsertPrio(PCB *in) PCB *fst, *nxt; fst = nxt = ready; if (ready = NULL) /如果队列为空,则为第一个元素 in-next = ready; ready = in; else /查到合适的位置进行插入 if (in-prio = fst-prio) /比第一个还要大,则插
9、入到队头 in-next = ready; ready = in; else while (fst-next != NULL) /移动指针查找第一个比它小的元素的位置进行插入 nxt = fst; fst = fst-next; if (fst-next = NULL) /已经搜索到队尾,则其优先级数最小,将其插入到队尾即可 in-next = fst-next; fst-next = in; else /插入到队列中 nxt = in; in-next = fst; /将进程插入到就绪队列尾部void InsertTime(PCB *in) PCB *fst; fst = ready; if
10、 (ready = NULL) in-next = ready; ready = in; else while (fst-next != NULL) fst = fst-next; in-next = fst-next; fst-next = in; /将进程插入到完成队列尾部void InsertFinish(PCB *in) PCB *fst; fst = finish; if (finish = NULL) in-next = finish; finish = in; else while (fst-next != NULL) fst = fst-next; in-next = fst-
11、next; fst-next = in; /优先级调度输入函数 void PrioCreate() PCB *tmp; int i; cout Enter the name and needtime: endl; for (i = 0; i num; i+) if (tmp = (PCB *)malloc(sizeof(PCB) = NULL) cerr malloc tmp-name; getchar(); cin tmp-needtime; tmp-cputime = 0; tmp-state = W; tmp-prio = 50 - tmp-needtime; /设置其优先级,需要的时间
12、越多,优先级越低 tmp-round = 0; tmp-count = 0; InsertPrio(tmp); /按照优先级从高到低,插入到就绪队列 cout 进程名t优先级tcpu时间t需要时间 进程状态 计数器 endl;/时间片输入函数 void TimeCreate() PCB *tmp; int i; cout 输入进程名字和进程时间片所需时间: endl; for (i = 0; i num; i+) if (tmp = (PCB *)malloc(sizeof(PCB) = NULL) cerr malloc tmp-name; getchar(); cin tmp-needti
13、me; tmp-cputime = 0; tmp-state = W; tmp-prio = 0; tmp-round = 2; tmp-count = 0; InsertTime(tmp); cout 进程名t轮数tCPU时间t需要时间 进程状态 计数器 prio -= 3; /优先级减去三 run-cputime+; /CPU时间片加一 run-needtime-;/进程执行完成的剩余时间减一 if (run-needtime = 0)/如果进程执行完毕,将进程状态置为F,将其插入到完成队列 run-state = F; run-count+; InsertFinish(run); fla
14、g = 0; else /将进程状态置为W,入就绪队列 run-state = W; run-count+; /进程执行的次数加一 InsertTime(run); flag = 0; flag = 1; GetFirst(); /继续取就绪队列队头进程进入执行队列 void RoundRun() /时间片轮转调度算法 int flag = 1; GetFirst(); while (run != NULL) Output2(); while (flag) run-count+; run-cputime+; run-needtime-; if (run-needtime = 0) /进程执行完
15、毕 run-state = F; InsertFinish(run); flag = 0; else if (run-count = run-round)/时间片用完 run-state = W; run-count = 0; /计数器清零,为下次做准备 InsertTime(run); flag = 0; flag = 1; GetFirst(); int main(void) int n; cout 输入进程个数: num; getchar(); cout -进程调度算法模拟- endl; cout 1、优先级调度算法 endl; cout 2、循环轮转调度算法 endl; cout -
16、endl; cout 输入选择序号: n; switch (n) case 1: cout 优先级调度: endl; PrioCreate(); Priority(); Output1(); break; case 2: cout 循环轮转算法: endl; TimeCreate(); RoundRun(); Output2(); break; case 0: exit(1); break; default: cout Enter error! endl; break; cout endl; return 0;四、实验结果优先级调度时间片轮转法五、实验总结通过本次实验,我学到了进程调度算法,了解了进程调度是CPU管理的核心,不同的调度算法会使得进程运行时间不同,运行的先后顺序也不同,这就会有一个算法选择的问题.掌握了用C语言实现进程调度算法的模拟,提高了编程能力,以及对进程调度算法的理解。在思考上出现的一个问题是,队列是先进先出的,在优先级算法中怎么来向链表中插入新的进程,使其能够按优先级排序.第一想到的是用数组,后来发现不如链表方便,所以换成链表,但是发现自己用链表有待提高.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1