课程设计 处理器调度算法模拟_第1页
课程设计 处理器调度算法模拟_第2页
课程设计 处理器调度算法模拟_第3页
课程设计 处理器调度算法模拟_第4页
课程设计 处理器调度算法模拟_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、南通大学计算机学院操作系统课程设计报告书设计题目处理器调度算法模拟专业班级软嵌161学生姓名候玉权学号1613072015指导教师二红日期 2018.07.05实验报告正文内容1、课程设计的目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪状态进程 个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在 单处理器情况下处理器调度,帮助学生加深了解处理器调度的工作。2、课程设计的要求用C+语言编写程序完成单处理机的进程调度3、课程设计的环境在机房完成,运行环境vs20174、问题描述对cpu调度算法进行模拟实现,包含先来先服务,短作业优先,响应比最

2、高优先,时间片 轮转等算法。5、算法分析数据结构struct efchar name10;进程名称int number;进程编号float daodatime;到达时间float kaishitime;/开始运行时间float yunxingtime;/运行时间float jieshutime;/运行结束时间int shengyutime;/剩余时间int fuwutime;服务时间int order;/运行次序int run_flag;调度标志int priority;/优先级struct ef *next;先来先服务算法int fcfs()/先来先服务float tp = 0;int i;

3、int zx;tp = ef0.daodatime;for (i = 0; ic; i+)efi.kaishitime = tp;efi.jieshutime = efi.kaishitime + efi.yunxingtime;efi.run_flag = 1;tp = efi.jieshutime;zx = i;efzx.order = i + 1;return 0;2,青输入第1个进程的名字多法度先 先目 算务调先优 来数 度先程 调先也比级 S 2,青输入第1个进程的名字多法度先 先目 算务调先优 来数 度先程 调先也比级 S 择来间费先出程人 选先时短进输 请 L

4、卜青输入第1个进程的到达时间:2请输入第1个进程的运行时间:2,青输入第2个进程的名字b卜青输入第功个进程的编号:3,青输入第N个进程的到达时间:3卜青输入第2个进程的运行时间:3进程名编号到达时间运行时间开始时间结束时间平均周转时间平均带权周转时间a1222410. 5b3334731. 16667h青按任意键继续. . . .短作业优先int sjf()/短作业优先float temp_time = 0;int i = 0, j;int zx, tc;float yunxingtime;yunxingtime = efi.yunxingtime;j = 1;while (jc) & (ef

5、i.daodatime = efj.daodatime)if (efj.yunxingtimeefi.yunxingtime)yunxingtime = efj.yunxingtime;i = j;j+;查找第一个被调度的进程对第一个被调度的进程求相应的参数zx = i;efzx.kaishitime = efzx.daodatime;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.run_flag = 1;temp_time = efzx.jieshutime;efzx.order = 1;tc = 1;while (tcc

6、)for (j = 0; jc; j+)if (efj.daodatime = temp_time) & (!efj.run_flag)yunxingtime = efj.yunxingtime; zx = j; break;for (j = 0; jc; j+)if (efj.daodatime = temp_time) & (!efj.run_flag) if (efj.yunxingtimeyunxingtime)yunxingtime = efj.yunxingtime;zx= j;查找下一个被调度的进程对找到的下一个被调度的进程求相应的参数efzx.kaishitime = temp

7、_time;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.run_flag = 1;temp_time = efzx.yunxingtime;tc+;efzx.order = tc;return 0;C:WI N DOWSsystem 32cmd.exe2X度调度先 畀务调先优 先也比级 来间隹先出 先时短 ltL.6.ccl先C:WI N DOWSsystem 32cmd.exe2X度调度先 畀务调先优 先也比级 来间隹先出 先时短 ltL.6.ccl先优: 业目 1 8 程次进输响应比高优先i

8、nt hrrf() /响应比高优先int j, zx, tc;float temp_time, respond_rate, max_respond_rate;第一个进程被调度ef0.kaishitime = ef0.daodatime;ef0.jieshutime = ef0.kaishitime + ef0.yunxingtime;temp_time = ef0.jieshutime;ef0.run_flag = 1;ef0.order = 1;tc = 1;/调度其他进程while (tcc)max_respond_rate = 0;for (j = 1; jc; j+)if (efj.d

9、aodatime max_respond_rate)max_respond_rate = respond_rate;zx = j;找响应比高的进程efzx.kaishitime = temp_time;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;temp_time = efzx.jieshutime;efzx.run_flag = 1;tc+= 1;efzx.order = tc;return 0;2447130. 51. 16667a 21b 2E气青按任意键继续. .:3进程名编号到达时间运行时间开始时间结束时间平均周转时间平均

10、带权周转时间3请输入第2个进程的运行时间:2请输入第2个进程的到达时间:冒输入第2个进程的编号:;2请输入第2个进程的名字2请输入第1个进程的运行时间:2请输入第1个进程的到达时间:请输入第1个进程的编号:2请输入第1个进程的名字I 遍 C:WI N DOWSsystem 3 2cm d.exe1BLI2户虫15.16.4 I-.度先 畀务调先优 调先也比级 择来间费先出 先时短时间片轮struct ef *input()int N, i;/定义队首、队尾struct ef *head, *rear;/ p是队尾指针,q是队首指针,t是执行时间 struct ef *p, *q, *t;/初始

11、化队首和队尾为空head = rear = NULL;cout ”请输入进程数目: N;for (i = 0; i N; i+)/初始化一个空间给进程p = (struct ef *)malloc(sizeof(struct ef);cout ”请输入第” i+1 个进程的名字n p-name;cout ”请输入第” i + 1 个进程的编号:n p-number;cout ”请输入第” i + 1 个进程的到达时间:n p-daodatime;cout ”请输入第” i + 1 个进程的服务时间:n p-fuwutime;p-shengyutime = p-fuwutime;p-next =

12、 NULL;/当输入结束时,把p的数据放到队首,以便下一步执行if (rear = NULL)head = p;p-next = NULL;rear = p;/否则执行时间为空,队首变成qelset = NULL;q = head;/当q和q的到达时间小于p的到达时间时,把执行时间给qwhile (q & q-daodatime daodatime)t = q;q = q-next;/当q是队首时,则下一个队首变成p,以便每个进程都能够得到时间片if (q = head)p-next = head;head = p;/当执行时间片到达队尾时(执行完成),返回给队首pelse if (t = r

13、ear)rear-next = p;p-next = NULL;rear = p; /否则给队首p占用执行时间,P执行完后到q elset-next = p; p-next = q;/返回队首 return head;void run(struct ef *head)struct ef *p, *t, *r;int num;/运行过程vector vec_out;cout”请输入时间片:num;/当队首不为空时,把p给队首 while (head != NULL)r = p = head;/ 把执行时间给队首 while (p != NULL) t = head;/ p的剩余时间=剩余时间-时

14、间片 p-shengyutime = p-shengyutime - num;p-jieshutime = p-kaishitime + p-fuwutime; string s = p-name;vec_out.push_back(s);/当p运行完,即剩余时间小于0时,仍然把它当做0处理 if (p-shengyutime shengyutime = 0;cout进程编号到达时间服务时间剩余时间完成时间nendl;/时间不为空时,输出当前进程的信息,并把时间片交给下一个进程 while (t != NULL) cout name number ” daodatime fuwutime sh

15、engyutime ”jieshutime next;/当队首的剩余时间为0时,先把队首改成p的下一个,然后释放内存,删除队 首节点if (p-shengyutime = 0) if (p = head)head = p-next;free(p);p = head;否则返回执行,把队尾的下一个指针变成p的下一个指针,队尾的位置移 动到队首elser-next = p-next;p = r-next;r = p;否则把队首的位置给队尾,把队首的状态显示为“就绪”状态else r = p;p = p-next;cout执行顺序:nendl;cout vec_out0.c_str()endl;for

16、 (int i = 1; ivec_out.size(); i+) cout vec_outi.c_str()endl;void yunxing()定义时间片的队首结构体 struct ef *head;/队首执行的时间head =input();run(head);7、程序源代码#include stdafx.h”#include#include using namespace std;#define MAX 10/实际进程个数/实际进程个数/先来先服务短作业优先/响应比高优先优先级调度进程参数输入/调度结果输出int fcfs();int sjf();int hrrf();int yxj(

17、);int in();int out();struct ef进程名称进程编号到达时间进程名称进程编号到达时间/开始运行时间/运行时间/运行结束时间/剩余时间/服务时间/运行次序调度标志/优先级int number;float daodatime;float kaishitime;float yunxingtime;float jieshutime;int shengyutime;int fuwutime;int order;int run_flag;int priority;struct ef *next;efMAX;int fcfs()/先来先服务float tp = 0;int i;int

18、 zx;tp = ef0.daodatime;for (i = 0; ic; i+) efi.kaishitime = tp;efi.jieshutime = efi.kaishitime + efi.yunxingtime;efi.run_flag = 1;tp = efi.jieshutime;zx = i;efzx.order = i + 1;return 0;int yxj() /优先级调度float temp_time = 0;int i = 0, j;int zx, tc;int max_priority;max_priority = efi.priority;j = 1;whil

19、e (jefi.priority)max_priority = efj.priority;i = j;j+;查找第一个被调度的进程对第一个被调度的进程求相应的参数zx = i;efzx.kaishitime = efzx.kaishitime;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.run_flag = 1;temp_time = efzx.jieshutime;efzx.order = 1;tc = 1;while (tcc)max_priority = 0;for (j = 0; jc; j+)if (efj.da

20、odatime max_priority)max_priority = efj.priority;zx = j;查找下一个被调度的进程/对找到的下一个被调度的进程求相应的参数efzx.kaishitime = temp_time;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.run_flag = 1;temp_time = efzx.jieshutime;tc+;efzx.order = tc;return 0;int sjf()/短作业优先float temp_time = 0;int i = 0, j;int zx, t

21、c;float yunxingtime;yunxingtime = efi.yunxingtime;j = 1;while (jc) & (efi.daodatime = efj.daodatime)if (efj.yunxingtimeefi.yunxingtime)yunxingtime = efj.yunxingtime;i = j;j+;查找第一个被调度的进程对第一个被调度的进程求相应的参数zx = i;efzx.kaishitime = efzx.daodatime;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.r

22、un_flag = 1;temp_time = efzx.jieshutime;efzx.order = 1;tc = 1;while (tcc)for (j = 0; jc; j+)if (efj.daodatime = temp_time) & (!efj.run_flag)yunxingtime = efj.yunxingtime; zx = j; break;for (j = 0; jc; j+)if (efj.daodatime = temp_time) & (!efj.run_flag) if (efj.yunxingtimeyunxingtime)yunxingtime = ef

23、j.yunxingtime;zx= j;查找下一个被调度的进程对找到的下一个被调度的进程求相应的参数efzx.kaishitime = temp_time;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;efzx.run_flag = 1;temp_time = efzx.yunxingtime;tc+;efzx.order = tc;return 0;int hrrf() /响应比高优先int j, zx, tc;float temp_time, respond_rate, max_respond_rate;第一个进程被调度ef0.k

24、aishitime = ef0.daodatime;ef0.jieshutime = ef0.kaishitime + ef0.yunxingtime;temp_time = ef0.jieshutime;ef0.run_flag = 1;ef0.order = 1;tc = 1;/调度其他进程while (tcc)max_respond_rate = 0;for (j = 1; jc; j+)if (efj.daodatime max_respond_rate)max_respond_rate = respond_rate;zx = j;找响应比高的进程efzx.kaishitime = t

25、emp_time;efzx.jieshutime = efzx.kaishitime + efzx.yunxingtime;temp_time = efzx.jieshutime;efzx.run_flag = 1;tc+= 1;efzx.order = tc;return 0;int in() 进程参数输入int i;cout ”请输入进程数目:nc;for (i = 0; ic; i+)cout ”请输入第” i+1 个进程的名字n ;cout ”请输入第” i + 1 个进程的编号:n efi.number;cout ”请输入第” i + 1 个进程的到达时间:n efi

26、.daodatime;cout ”请输入第” i + 1 个进程的运行时间:n efi.yunxingtime;efi.kaishitime = 0;efi.jieshutime = 0;efi.order = 0;efi.run_flag = 0;return 0;int out() /*调度结果输出*/int i;float turn_round_time = 0, fl, w = 0;cout进程名编号到达时间运行时间开始时间结束时间平均周转时间平均带权周 转时间nendl;for (i = 0; ic; i+) f1 = efi.jieshutime - efi.daodatime;t

27、urn_round_time += f1;w += (f1 / efi.yunxingtime);cout efi.number efi.daodatime efi.yunxingtime efi.kaishitime ” efi.jieshutime turn_round_time / c w / cendl;/cout 平均周转时间=nturn_round_time / cendl;/cout 带权周转时间=n w / cendl;return 0;struct ef *input()int N, i;/定义队首、队尾 struct ef *head, *rear;/ p

28、是队尾指针,q是队首指针,t是执行时间 struct ef *p, *q, *t;/初始化队首和队尾为空 head = rear = NULL;cout ”请输入进程数目: N;for (i = 0; i N; i+) /初始化一个空间给进程 p = (struct ef *)malloc(sizeof(struct ef);cout ”请输入第” i+1 个进程的名字n p-name;cout ”请输入第” i + 1 个进程的编号:n p-number;cout ”请输入第” i + 1 个进程的到达时间:n p-daodatime;cout ”请输入第” i + 1 个进程的服务时间:n

29、 p-fuwutime;p-shengyutime = p-fuwutime;p-next = NULL;/当输入结束时,把p的数据放到队首,以便下一步执行if (rear = NULL)head = p;p-next = NULL;rear = p;/否则执行时间为空,队首变成qelset = NULL;q = head;/当q和q的到达时间小于p的到达时间时,把执行时间给qwhile (q & q-daodatime daodatime)t = q;q = q-next;/当q是队首时,则下一个队首变成p,以便每个进程都能够得到时间片if (q = head)p-next = head;h

30、ead = p;/当执行时间片到达队尾时(执行完成),返回给队首pelse if (t = rear)rear-next = p;p-next = NULL;rear = p;/否则给队首p占用执行时间,p执行完后到qelset-next = p;p-next = q;/返回队首 return head;void run(struct ef *head)struct ef *p, *t, *r;int num;/运行过程vector vec_out;cout”请输入时间片:num;/当队首不为空时,把p给队首while (head != NULL)r = p = head;/把执行时间给队首w

31、hile (p != NULL)t = head;/ p的剩余时间=剩余时间-时间片 p-shengyutime = p-shengyutime - num;p-jieshutime = p-kaishitime + p-fuwutime;string s = p-name;vec_out.push_back(s);/当p运行完,即剩余时间小于0时,仍然把它当做0处理if (p-shengyutime shengyutime = 0;cout进程编号到达时间服务时间剩余时间完成时间nendl;/时间不为空时,输出当前进程的信息,并把时间片交给下一个进程 while (t != NULL)cout name number ” daodatime fuwutime shengyutime ”jieshutime next;/当队首的剩余时间为0时,先把队首改成p的下一个,然后释放内存,删除队首节点if (p-shengyutime = 0)if (p = head)head = p-next;free(p);p = head;否则返回执行,把队尾的下一个指针变成p的下一个指针,队尾的位置移动到队首elser-next = p-next;p = r-n

温馨提示

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

评论

0/150

提交评论