操作系统-进程调度模拟算法(附源码)_第1页
操作系统-进程调度模拟算法(附源码)_第2页
操作系统-进程调度模拟算法(附源码)_第3页
操作系统-进程调度模拟算法(附源码)_第4页
操作系统-进程调度模拟算法(附源码)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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;typedef struct nod

5、echar 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 GetFirst()run = ready;

6、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 next;p = run;while (p != NULL)cout n

7、ame 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 next;p = run;while (p != NULL)cout name t round

8、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) /比第一个还要大,则插入到队头in-next = ready;ready = in;elsewhile (fst-next != NU

9、LL) /移动指针查找第一个比它小的元素的位置进行插入 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 (ready = NULL)in-next = ready;ready = in;elsewhile (fst-next != NULL)

10、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;elsewhile (fst-next != NULL)fst = fst-next;in-next = fst-next;fst-next = in;/优先级调度输入函数 void PrioCreate()PCB *tmp;int i;cout Enter the name and n

11、eedtime: 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; /设置其优先级,需要的时间越多,优先级越低tmp-round = 0;tmp-count = 0;InsertPrio(tmp); /按照优先级从高到低,插入到就绪队列 cout 进程名t优先级tcpu时间t需要时间 进程状态

12、 计数器 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-needtime;tmp-cputime = 0;tmp-state = W;tmp-prio = 0;tmp-round = 2;tmp-count = 0;InsertTime(tmp);cout 进程名t轮数tCPU时间t需要时

13、间 进程状态 计数器 prio -= 3; /优先级减去三 run-cputime+; /CPU时间片加一 run-needtime-;/进程执行完成的剩余时间减一 if (run-needtime = 0)/如果进程执行完毕,将进程状态置为F,将其插入到完成队列 run-state = F;run-count+;InsertFinish(run);flag = 0;else /将进程状态置为W,入就绪队列run-state = W;run-count+; /进程执行的次数加一InsertTime(run);flag = 0;flag = 1;GetFirst(); /继续取就绪队列队头进程进

14、入执行队列 void RoundRun() /时间片轮转调度算法int flag = 1;GetFirst();while (run != NULL)Output2();while (flag)run-count+;run-cputime+;run-needtime-;if (run-needtime = 0) /进程执行完毕 run-state = F;InsertFinish(run);flag = 0;else if (run-count = run-round)/时间片用完 run-state = W;run-count = 0; /计数器清零,为下次做准备 InsertTime(ru

15、n);flag = 0;flag = 1;GetFirst();int main(void)int n;cout 输入进程个数: num;getchar();cout -进程调度算法模拟- endl;cout 1、优先级调度算法 endl;cout 2、循环轮转调度算法 endl;cout - 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论