ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:141.02KB ,
资源ID:6376086      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6376086.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统进程调度模拟算法附源码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统进程调度模拟算法附源码.docx

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