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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(作业调度算法(先来先服务算法,短作业算法).doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

作业调度算法(先来先服务算法,短作业算法).doc

1、《操作系统》实验报告 题目:作业调度算法 班级:网络工程 姓名:朱锦涛 学号:E31314037 一、实验目的 用代码实现页面调度算法,即先来先服务(FCFS)调度算法 、短作业优先算法、高响应比优先调度算法。通过代码的具体实现,加深对算法的核心的理解。 二、实验原理 1.先来先服务(FCFS)调度算法 FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几

2、个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。 2.短作业优先算法 SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存。 3、高响应比优先调度算法 高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。 如果我们引入一个动态

3、优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可以描述为: 优先权 = (等待时间 + 要求服务时间)/要求服务时间 三、实验内容 源程序: #include #include #include struct work { int id; int arrive_time; int work_time; int wait; float priority; }; typedef stru

4、ct sjf_work { struct work s_work; //数据域 struct sjf_work * pNext; //指针域 }NODE,*PNODE; void FCFS(); void SJF(); void showmenu(); bool Is_empty(PNODE pHead); int cnt_work(PNODE pHead); PNODE do_work(PNODE pHead,int *w_finish_time,int i); void show(int *w_finish_time,int i,PNODE q,int

5、w_rel_time); void HRRN(); PNODE priorit(PNODE pHead); void do_work_1(PNODE pHead,int *w_finish_time,int i); int main() { int choice; //设置选择数 showmenu(); //显示菜单 scanf("%d",&choice); while(choice != 0) //选择算法 { switch(choice) { case 1 : printf("您选择的是先来先服务算法:\n");

6、 FCFS(); break; case 2 : printf("您选择的是短作业优先算法:\n"); SJF(); break; case 3 : printf("您选择的是高响应比优先调度算法\n"); HRRN(); break; default: printf("请重新选择!"); break; } printf("\n"); printf("下面是菜单,请继续,或者按‘0’退出"); showmenu(); scanf("%d",&c

7、hoice); } printf("感谢您使用本系统,再见!"); return 0; } void FCFS() { int j,k; int w_rel_time[5]; int w_finish_time[5]; float rel_time = 0; struct work temp; int i; struct work w[5]; srand(time(0)); for(i=0;i<5;i++) { w[i].id = rand()%10; w[i].arrive_time = rand()%10;

8、 w[i].work_time = rand()%10+1; } for(j=0;j<5;j++) { printf("第%d个作业的编号是:%d\t",j+1,w[j].id); printf("第%d个作业到达时间:%d\t",j+1,w[j].arrive_time); printf("第%d个作业服务时间:%d\t",j+1,w[j].work_time); printf("\n"); } for(j=1;j<5;j++) for(k=0;k<5-j;k++) { if(w[k].arrive_tim

9、e > w[k+1].arrive_time) { temp = w[k]; w[k] = w[k+1]; w[k+1] = temp; } } printf("\n"); w_finish_time[0] = w[0].arrive_time + w[0].work_time; for(j=0;j<5;j++) { if(w_finish_time[j] < w[j+1].arrive_time) { w_finish_time[j+1] = w[j+1].arrive_t

10、ime + w[j+1].work_time; } else w_finish_time[j+1] = w_finish_time[j] + w[j+1].work_time; } for(j=0;j<5;j++) w_rel_time[j] = w_finish_time[j] - w[j].arrive_time; for(j=0;j<5;j++) { rel_time += w_rel_time[j]; } for(j=0;j<5;j++) { print

11、f("第%d个系统执行的作业到达时间:%d ",j+1,w[j].arrive_time); printf("编号是:%d ",w[j].id); printf("服务时间是:%d ",w[j].work_time); printf("完成时间是:%d ",w_finish_time[j]); printf("周转时间是:%d ",w_rel_time[j]); printf("\n"); } printf("平均周转时间:%f\n",rel_time/5); } void SJ

12、F() { int w_rel_time[10]; int w_finish_time[10]; float rel_time = 0; srand(time(0)); int i; int j = 0; PNODE pHead = (PNODE)malloc(sizeof(NODE)); if (NULL == pHead) { printf("分配失败, 程序终止!\n"); exit(-1); } PNODE pTail = pHead; pTail->pNext = NULL; //定义该链表有头结点,且第一个节点初始化为

13、空 for(i=0;i<10;i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("分配失败, 程序终止!\n"); exit(-1); } pNew->s_work.id = rand()%100; pNew->s_work.arrive_time = rand()%10; pNew->s_work.work_time = rand()%10+1; pTail->pNext = pNew; pNew->pNext

14、 = NULL; pTail = pNew; } PNODE p = pHead->pNext; //p指向第一个节点 while (NULL != p) { printf("第%d个作业的编号是:%d\t",j+1,p->s_work.id); printf("第%d个作业到达时间:%d\t",j+1,p->s_work.arrive_time); printf("第%d个作业服务时间:%d\t",j+1,p->s_work.work_time); printf("\n"); p = p->pNext; printf("\

15、n"); j++; } p = pHead->pNext; PNODE q = p; //p,q都指向第一个节点 p = p->pNext; while(p != NULL) { if(p->s_work.arrive_time < q->s_work.arrive_time) q = p; p = p->pNext; } PNODE r = pHead->pNext; //r也指向第一个节点 int cnt = 0; //记录所有节点数据域中到达时间最短且相等的个数 while(r!= NULL)

16、 { if( r->s_work.arrive_time == q->s_work.arrive_time ) cnt++; r = r->pNext; } p = pHead->pNext; while(p != NULL) //在相等到达时间的作业中找服务时间最短的作业 { if(cnt > 1) { if( p->s_work.arrive_time == q->s_work.arrive_time ) if( p->s_work.work_time < q->s_work.work_time ) q = p

17、 p = p->pNext; } else p =NULL; } //确定q所指作业最先到达且服务时间最短 w_finish_time[0] = q->s_work.arrive_time + q->s_work.work_time; w_rel_time[0] = w_finish_time[0] - q->s_work.arrive_time; printf("第1个系统执行的作业到达时间:%d ",q->s_work.arrive_time); printf("编号是:%d ",q->s_work.id); print

18、f("服务时间是:%d \n",q->s_work.work_time); printf("完成时间是:%d ",w_finish_time[0]); printf("周转时间是:%d \n",w_rel_time[0]); p = pHead; //寻找q的前一个节点,方便删掉q节点 while( p->pNext != q ) { p = p->pNext; } p->pNext = q->pNext; free(q); q = NULL; for(i=0;i<9&&!Is_empty(pHead);i++) {

19、 printf("现在系统还剩%d个作业!\n",cnt_work(pHead)); q = do_work(pHead,w_finish_time,i); show(w_finish_time,i,q,w_rel_time); p = pHead; //寻找q的前一个节点,方便删掉q节点 while( p->pNext != q ) { p = p->pNext; } p->pNext = q->pNext; free(q); q = NULL; } for(j=0;j<10;j++) {

20、 rel_time += w_rel_time[j]; } printf("平均周转时间:%f\n",rel_time/10); } bool Is_empty(PNODE pHead) //判断作业是否做完 { PNODE p; p = pHead->pNext; int len = 0; while(p != NULL) { len++; p = p->pNext; } if(len == 0) return true; //当没有作业时,返回为真 else return false; } int

21、 cnt_work(PNODE pHead) //计算当前还剩多少作业 { PNODE p; p = pHead->pNext; int len = 0; while(p != NULL) { len++; p = p->pNext; } return len; } PNODE do_work(PNODE pHead,int *w_finish_time,int i) { PNODE p,q; int cnt = 0; //计数器清0,计算当前作业完成时,系统中有多少个作业已经到达 p = pHead->pNext

22、 q = p; while(p != NULL) { if( p->s_work.arrive_time <= w_finish_time[i] ) { cnt ++; q = p; p = p->pNext; } else { p = p->pNext; } } //q指向当前到达时间小于刚刚完成的作业,但不一定是服务时间最短的(如果有的话) printf("系统中有%d个作业在当前作业完成时已经到达!\n",cnt); p = pHead->pNext; while(p !=

23、 NULL) { if(cnt>1) //执行此次判断后,q现在指向所有条件都满足的作业(如果有的话) { if( p->s_work.arrive_time <= w_finish_time[i] ) { if( p->s_work.work_time < q->s_work.work_time ) { q = p; p = p->pNext; } else p = p->pNext; } else p = p->pNext; } else

24、//当前作业完成时,没有作业到达的情况 { p = p->pNext; //用q来接收最先到达的,用p来遍历 while( p != NULL ) { if( p->s_work.arrive_time< q->s_work.arrive_time ) q = p; p = p->pNext; } w_finish_time[i+1] = q->s_work.arrive_time + q->s_work.work_time; } } w_finish_time[i+1] = w

25、finish_time[i] + q->s_work.work_time; return q; } void show(int *w_finish_time,int i,PNODE q,int *w_rel_time) { w_finish_time[i+1] = w_finish_time[i] + q->s_work.work_time; w_rel_time[i+1] = w_finish_time[i+1] - q->s_work.arrive_time; printf("第%d个系统执行的作业到达时间:%d ",i+2,q->s_work.arrive

26、time); printf("编号是:%d ",q->s_work.id); printf("服务时间是:%d\n",q->s_work.work_time); printf("完成时间是:%d ",w_finish_time[i+1]); printf("周转时间是:%d \n",w_rel_time[i+1]); } void showmenu() { printf("**********************************\n"); printf("请选择你要执行的命令~: \n"); printf("1:先来先服务

27、算法\n"); printf("2:短作业优先算法\n"); printf("3: 高响应比优先算法\n"); printf("0: 退出菜单\n"); printf("**********************************\n"); } void HRRN() { int w_rel_time[10]; int w_finish_time[10]; float rel_time = 0; float priority; //计算优先权 srand(time(0)); int i; int j = 0; PNODE

28、 pHead = (PNODE)malloc(sizeof(NODE)); if (NULL == pHead) { printf("分配失败, 程序终止!\n"); exit(-1); } PNODE pTail = pHead; pTail->pNext = NULL; //定义该链表有头结点,且第一个节点初始化为空 for(i=0;i<10;i++) //定义了十个进程 { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf(

29、"分配失败, 程序终止!\n"); exit(-1); } pNew->s_work.id = rand()%100; pNew->s_work.arrive_time = rand()%10; pNew->s_work.work_time = rand()%10+1; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } PNODE p = pHead->pNext; //p指向第一个节点 while (NULL != p) { printf("第%

30、d个作业的编号是:%d\t",j+1,p->s_work.id); printf("第%d个作业到达时间:%d\t",j+1,p->s_work.arrive_time); printf("第%d个作业服务时间:%d\t",j+1,p->s_work.work_time); printf("\n"); p = p->pNext; printf("\n"); j++; } p = pHead->pNext; PNODE q = p; //p,q都指向第一个节点 p = p->pNext; while(p != NULL)

31、 { if(p->s_work.arrive_time < q->s_work.arrive_time) q = p; p = p->pNext; } PNODE r = pHead->pNext; //r也指向第一个节点 int cnt = 0; //记录所有节点数据域中到达时间最短且相等的个数 while(r!= NULL) { if( r->s_work.arrive_time == q->s_work.arrive_time ) cnt++; r = r->pNext; } p = pHead->pNext;

32、 while(p != NULL) //在相等到达时间的作业中找服务时间最短的作业 { if(cnt > 1) { if( p->s_work.arrive_time == q->s_work.arrive_time ) if( p->s_work.work_time < q->s_work.work_time ) q = p; p = p->pNext; } else p =NULL; } //确定q所指作业最先到达且服务时间最短 w_finish_time[0] = q->s_work.ar

33、rive_time + q->s_work.work_time; w_rel_time[0] = w_finish_time[0] - q->s_work.arrive_time; printf("第1个系统执行的作业到达时间:%d ",q->s_work.arrive_time); printf("编号是:%d ",q->s_work.id); printf("服务时间是:%d \n",q->s_work.work_time); printf("完成时间是:%d ",w_finish_time[0]); printf("周转时间是:%d \n",w_rel_

34、time[0]); p = pHead; //寻找q的前一个节点,方便删掉q节点 while( p->pNext != q ) { p = p->pNext; } p->pNext = q->pNext; free(q); q = NULL; //已经找到并执行第一个进程,执行完之后又将其删除了 for(i=0;i<9&&!Is_empty(pHead);i++) { printf("现在系统还剩%d个作业!\n",cnt_work(pHead)); do_work_1(pHead,w_finish_time,i)

35、 q = priorit(pHead); show(w_finish_time,i,q,w_rel_time); p = pHead; //寻找q的前一个节点,方便删掉q节点 while( p->pNext != q ) { p = p->pNext; } p->pNext = q->pNext; free(q); q = NULL; } for(j=0;j<10;j++) { rel_time += w_rel_time[j]; } printf("平均周转时间:%f\n",rel_t

36、ime/10); } void do_work_1(PNODE pHead,int *w_finish_time,int i) { PNODE p,q; int cnt = 0; //计数器清0,计算当前作业完成时,系统中有多少个作业已经到达 p = pHead->pNext; q = p; while(p != NULL) { if( p->s_work.arrive_time <= w_finish_time[i] ) { cnt ++; q = p; p = p->pNext; }

37、 else { p = p->pNext; } } //q指向当前到达时间小于刚刚完成的作业,但有可能有另外几个进程也已经到达了,所以要进行下面的判断 printf("系统中有%d个作业在当前作业完成时已经到达!\n",cnt); p = pHead->pNext; while(p != NULL) { if(cnt>1) //说明此时有好几个都已经到达了 { if(p->s_work.arrive_time <= w_finish_time[i]) { p->s_work.wait = w_finis

38、h_time[i] - p->s_work.arrive_time; p = p->pNext; } else { p->s_work.wait = 0; p = p->pNext; } } else //当前作业完成时,没有作业到达的情况 { p = p->pNext; //此时p指向第一个节点,q指向第二个节点,还是找最先到达的 while( p != NULL ) { if( p->s_work.arrive_time < q->s_work.arrive_

39、time ) q = p; p = p->pNext; } w_finish_time[i+1] = q->s_work.arrive_time + q->s_work.work_time; return; } } w_finish_time[i+1] = w_finish_time[i] + q->s_work.work_time; } PNODE priorit(PNODE pHead) { PNODE p = pHead->pNext; while(p != NULL) { if(p->s_work

40、wait > 0) { p->s_work.priority = (p->s_work.wait + p->s_work.work_time) / p->s_work.work_time; //计算每一个已经等待的进程的优先等级 p = p->pNext; } else p = p->pNext; } p = pHead->pNext; PNODE q; q = p; p = p->pNext; //p已经指向第二个节点 while(p != NULL) { if(p->s_work.wait > 0

41、) { if(p->s_work.priority > q->s_work.priority) { q = p; p = p->pNext; } else p = p->pNext; } else p = p->pNext; } printf("该进程优先级最高,为:%f\n",q->s_work.priority); return q; } 实验结果: 系统自动为每个算法模拟分配五个作业,同时随机生成作业的编号,作业的到达时间,作业估计运行的时间。 1.先来先服务算法 该算法严格按照各作业到达时间来为其分配进程和资源,实验的结果见截图,最后算出该算法五个作业的平均周转时间。 2.短作业优先 短作业优先算法考虑的比较多,系统先找出最先到达的作业,若有多个相同时间到达的作业,则按照其运行时间长短先为时间短的服务。 3.高响应比优先算法 代码中主要运用PNODE priorit(PNODE pHead)函数计算作业的优先权。 四.实验小结 通过的代码的实现,对三种作业调度算法有了更深的理解。短作业优先算法要考虑的是后备队列

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服