用时间片轮转调度算法算法算出下面题目。

时间片轮转法与优先调度算法,进程调度,C代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "conio.h"
#include "malloc.h"
typedef struct node
name[10];&
&& struct node *
PCB *finish,*ready,*tail,*
&void firstin()
run-&state='R';&&
ready=ready-&&
&void prt1(char a)
& if(toupper(a)=='P')
cputime& needtime&
priority& state\n");
needtime&&
state\n");
&void prt2(char a,PCB *q)
if(toupper(a)=='P')&
printf("& %-10s%-10d%-10d%-10d
%c\n",q-&name,
q-&cputime,q-&needtime,q-&prio,q-&state);
printf("& %-10s%-10d%-10d%-10d%-10d
%-c\n",q-&name,
q-&cputime,q-&needtime,q-&count,q-&round,q-&state);
&void prt(char algo)
&& PCB *p;
prt1(algo);&
&& if(run!=NULL)
prt2(algo,run);
&& while(p!=NULL)
prt2(algo,p);
&& while(p!=NULL)
prt2(algo,p);
void insert1(PCB *q)
&& PCB *p1,*s,*r;
while((p1!=NULL)&&b)&
if(p1-&prio&=s-&prio)
if(r!=p1)&
r-&next=s;
s-&next=p1;
s-&next=p1;&
void insert2(PCB *p2)
tail-&next=p2;&
&& tail=p2;
&& p2-&next=NULL;
&void create1(char alg)
&& PCB *p;
&& char na[10];
&& ready=NULL;
finish=NULL;&
&& run=NULL;
&& printf("Enter name and time of
process\n");
&& for(i=1;i&=N;i++)
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p-&name,na);
p-&cputime=0;
p-&needtime=
p-&state='w';
p-&prio=50-
if(ready!=NULL)
& insert1(p);
& p-&next=
& ready=p;
&& //clr11();
printf("&&&&&&&&&
output of priority:\n");
printf("************************************************\n");
prt(alg);&
&& ready=ready-&
&& run-&state='R';
&void create2(char alg)
&& PCB *p;
&& char na[10];
&& ready=NULL;
&& finish=NULL;
&& run=NULL;
&& printf("Enter name and time of
round process\n");
&& for(i=1;i&=N;i++)
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p-&name,na);
p-&cputime=0;
p-&needtime=
p-&count=0;
p-&state='w';
p-&round=2;&
if(ready!=NULL)
& insert2(p);
& p-&next=
& ready=p;
&& //clrscr();
printf("&&&&&&&&&&&&&
output of round\n");
printf("************************************************\n");
prt(alg);&&
&& ready=ready-&
&& run-&state='R';
void priority(char alg)
while(run!=NULL)
run-&cputime=run-&cputime+1;
run-&needtime=run-&needtime-1;
&& if(run-&needtime==0)
&& run-&next=
&& finish=
&& run-&state='F';
&& run=NULL;
& if(ready!=NULL)
firstin();
&& prt(alg);
void roundrun(char alg)
&& while(run!=NULL)
run-&cputime=run-&cputime+1;
run-&needtime=run-&needtime-1;
run-&count=run-&count+1;
if(run-&needtime==0)
& run-&next=
& run-&state='F';
& run=NULL;
& if(ready!=NULL)
firstin();
if(run-&count==run-&round)&
run-&count=0;&
if(ready!=NULL)
run-&state='W';
insert2(run);
firstin();
void main(int argc, char* argv[])
&& //clrscr();
&& printf("type the
algorithm:P/R(priority/roundrobin)\n");
&& scanf("%c",&algo);
&& printf("Enter process
number\n");
&& scanf("%d",&N);
&& if(algo=='P'||algo=='p')
create1(algo);
priority(algo);
if(algo=='R'||algo=='r')
& create2(algo);
& roundrun(algo);
&& //return 0;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。急用,谢谢:用C++编程实现时间片轮转调度算法
[问题点数:100分,结帖人sherry_ws]
急用,谢谢:用C++编程实现时间片轮转调度算法
[问题点数:100分,结帖人sherry_ws]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。C语言实现时间片轮转法的cpu调度模拟_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C语言实现时间片轮转法的cpu调度模拟
来源:Linux社区&
作者:甜123
/*这是实验课题目,上课时写的,不是很完整,仅当留着做个纪念,有问题大家一起学习讨论。*//*废话不多说,直接上代码!*/&/*****时间片轮转法进行CPU调度算法********/#include&stdio.h&#include&malloc.h&#include&string.h&#define N 10& //定义最大进程数#define TIME 2//定义时间片大小typedef struct pcb{& & char id[10];//进程标识数& &//到达时间& &//进程已经占用的cpu时间& &//进程还需要的时间& & char state[12];//进程运行状态:wait or runing& & struct pcb *}pcb,*PCB;PCB//设置全局变量用来修改就绪队列PCBint count=0;//记录就绪队列中进程数void CreatProcess(){& & //创建进程& & PCB p,q;//进程的头尾指针都有& &//记录要创建的进程数& & int i,j;& & int arrive[N];& & head=tail=(PCB)malloc(sizeof(pcb));& & head-&next=NULL;& & p=& & printf("输入你要创建的进程数:");& & scanf("%d",&num);& & count=& & printf("********按照进程到达时间从小到大创建就绪队列******\n");& & //初始对其排序来创建就绪队列& & for(i=1;i&=i++){& & & & p-&next=(PCB)malloc(sizeof(pcb));& & & & p=p-&& & & & tail=p;& & & & printf("输入进程%d的标示符:",i);& & & & scanf("%s",p-&id);& & & & printf("输入进程%d的到达时间:",i);& & & & scanf("%d",&p-&arrivetime);& & & & printf("输入进程%d已占用的cpu时间:",i);& & & & scanf("%d",&p-&runtime);& & & & printf("输入进程%d还需要的cpu时间:",i);& & & & scanf("%d",&p-&needtime);& & & & printf("输入进程%d当前状态:(run 或者wait):",i);& & & & scanf("%s",p-&state);& & }& & tail-&next=p-&next=NULL;}void RR_RunProcess(){& & //运行进程,简单轮转法Round Robin& & PCB p,q,& & p=head-&& & while(1){& & if(head-&next==NULL)& & {& & & & printf("此时就绪队列中已无进程!\n");& & & & & && & }& & else & & {& & & & while(p){& & & & & & if((p-&needtime&0)&&!(strcmp(p-&state,"wait"))){& & & & & & & & printf("进程%s开始,\n",p-&id );& & & & & & & & strcpy(p-&state,"run");& & & & & & & & p-&runtime+=TIME;& & & & & & & & p-&needtime-=TIME;& & & & & & & & & if(p-&needtime&0)& & & & & & & & & & p-&needtime=0;& & & & & & }& & & & & & temp=p;//把该时间片内运行完的进程存到临时temp中& & & & & & //把temp接到链表尾部,销毁P; & & & & & & if(temp-&needtime&0){//把该时间片内运行完的进程接到就绪队列的尾部& & & & & & & & if(count&1){& & & & & & & & head-&next=temp-&& & & & & & & & tail-&next=& & & & & & & & tail=tail-&& & & & & & & & strcpy(tail-&state,"wait");& & & & & & & & tail-&next=NULL;& & & & & & & & }& & & & & & & & else if(count==1){//当只有一个进程等待时,分开讨论& & & & & & & & & & head-&next=& & & & & & & & & & tail=& & & & & & & & & & strcpy(tail-&state,"wait");& & & & & & & & & & tail-&next=NULL;&& & & & & & & & }& & & & & & & & & & & & & & & }& & & & & & if(temp-&needtime==0){//销毁就绪队列中已经结束的进程& & & & & & & & count--;//此时就绪队列中进程数减1& & & & & & & & printf("进程%s结束.\n",p-&id);& & & & & & & & head-&next=temp-&& & & & & & & & free(temp);//撤销就绪队列中已经结束的进程&& & & & & & }&& & & & & & p=head-&&& & & & }&& & }& & }}void main(){& & printf("**************进程的初始状态!**************\n");& & CreatProcess();& & printf("*******************************************\n\t\t程序运行结果如下:\n\n");& & printf("*******************************************\n");& & RR_RunProcess();//简单轮转法Round Robin& }
运行结果如下附件:
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
读C++ Primer 之构造函数陷阱
读C++ Primer 之智能指针
读C++ Primer 之句柄类
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(一):Linux下C编程概要
Linux-C成长之路(二):基本数据类型
Linux-C成长之路(三):基本IO函数操作
Linux-C成长之路(四):运算符
Linux-C成长之路(五):控制流
Linux-C成长之路(六):函数要义
Linux-C成长之路(七):数组与指针
Linux-C成长之路(八):存储类,动态内存
Linux-C成长之路(九):复合数据类型
Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:
相关资讯 & & &
& (03月23日)
& (03月19日)
& (04月03日)
& (03月19日)
& (03月18日)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
采用时间片轮转算法的进程调度程序.doc17页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
采用时间片轮转算法的进程调度程序
指导老师:
第1部分 课设简介 2
1.1 课程设计题目 2
1.2 课程设计目的 2
1.3 课程设计内容 3
1.4 时间安排 3
第2部分 实验原理分析 3
2.1问题描述 3
2.2问题分析 3
第3部分 主要的功能模块 4
3.2主要的函数 5
3.3 测试用例及运行结果 6
第4部分 源代码 9
第5部分 总结及参考文献 16
5.1 总结 16
参考文献 16
第1部分 课设简介
1.1 课程设计题目
采用时间片轮转算法的进程调度程序
1.2 课程设计目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
1)进一步巩固和复习操作系统的基础知识。
2)培养学生结构化程序、模块化程序设计的方法和能力。
3)提高学生调试程序的技巧和软件设计的能力。
4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
1.3 课程设计内容
设计并实现一个采用时间片轮转算法的进程调度演示程序
1.4 时间安排
1)分析设计贮备阶段
2)编程调试阶段
3)写课程设计报告、考核(2 天)
第2部分 实验原理分析
2.1问题描述
设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,
正在加载中,请稍后...处理机调度与死锁-常用调度算法与银行家解决速锁问题
本文由发表于4年前 |
&被围观 5,870 views+
1、对于本章内的基本调度算法:算法思想、就绪队列的组织、是抢占还是非抢占
FCFS先来先服务调度算法
算法思想:
当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
FCFS是非抢占式的调度算法。
短作业(进程)优先调度算法
算法思想:
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
短作业调度算法是非抢占式的调度算法。
非抢占式优先权调度算法和抢占式优先权调度算法
算法思想:
非抢占式优先权调度算法:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成,或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一个优先权最高的进程。
抢占式优先权调度算法:系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度就立即停止当前进程的执行,重新将处理机分配给新到的优先权最高的进程。
静态优先权和动态优先权
算法思想:
静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的。
高响应比优先调度算法
算法思想:
为每个作业引入动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然后寄回分配到处理机。该优先权的变化规律可描述为:
优先权=(等待时间+要求服务时间)/ 要求服务事件
基于时间片的轮转调度算法
算法思想:
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
多级反馈队列调度算法
算法思想:
设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之。
当一个新进程进入内存后,首先将它放入第一个队列的末尾,按FCFS原则排队等待调度。如果一个时间片后进程尚未完成,调度程序便将该进程转入第二个队列的末尾,再同样地按FCFS原则等待调度执行。当一个长作业从第一个队列一次降到第n个队列后,在第n队列中便采取按时间片轮转的方式运行。
仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。
2、典型的动态优先权调度调度算法:高响应比优先度调度算法;典型的实时调度算法:最低松弛度优先调度算法;时间片轮转法中,时间片取值的影响,如何确定时间片的大小
时间片取值的影响:
如果选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销;反之,如果选择太长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算法便退化为FCFS算法,无法满足交互式用户的需求。
如何确定时间片的大小:
时间片应略大于一次典型的交互需要的时间。这样可使大多数进程在一个时间片内完成。一般应考虑三个因素:系统对相应时间的要求、就绪队列中进程的数目和系统的处理能力。
3、什么是死锁,死锁产生的原因及必要条件
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因:可归结为如下两点:(1)竞争资源。(2)进程间推进顺序非法。
产生死锁的必要条件:互斥条件,请求和保持条件,不剥夺条件和环路等待条件。
4、死锁的避免----避免死锁的银行家算法,数据结构,算法思想
银行家算法中的数据结构:
① 可利用资源向量 Available
② 最大需求矩阵Max
③ 分配矩阵 Allocation
④ 需求矩阵 Need
三个矩阵间存在下述关系:
Need[i,j] = Max[i,j] –Allocation[i,j]
算法思想:
(1)如果Request i[j] &= Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request i[j] &= Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的值:
Available[j]:=Available[j] – Request i[j];
Allocation[i,j]:=Allocation[i,j] + Request i[j];
Need[i,j]:=Need[i,j] – Request i[j];
(4)系统执行安全性算法,减产此次算法分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
安全性算法:
(1)设置两个向量:
① 工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:=Available。
② Finish,表示系统是否有足够的资源分配给进程,使之运行完成。开始时限做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true。
(2)从进程集合中找到一个能满足下述条件的进程:
① Finish[i] = false;
② Need[i,j] &= Work[j];
若找到,执行步骤(3),否则,执行步骤(4)
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]:=Work[j] + Allocation[i,j];
Finish[i]:=
go to step 2;
(4)如果所有进程的Finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
5、死锁的检测和解除----资源分配图,检测方法、解除方法
资源分配图:
系统死锁可利用资源分配图来描述。该图是由一组节点N和一组边E所组成的一个对偶G=(N1E)。用圆圈代表一个进程,用方框代表一类资源。
检查方法:
我们可以利用把资源分配图加以简化的方法,来检查当系统处于S状态时是否为死锁状态。简化方法如下:
① 在资源分配图中,找出一个既不阻塞又非独立的进程结点Pi。分配资源使Pi运行再释放全部资源,相当于消去Pi所求的请求边和分配边,使之成为孤立的结点。
② Pi释放资源后,使其他进程获取资源运行。这样不断减缓资源分配图
③ 在进程一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则成该图是可完全简化的。
有关文件已经证明,所有的简化顺序,都将得到相同的不可简化图。S为死锁的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。
解除方法:
常用解除死锁的两种方法是:① 剥夺资源; ② 撤销进程。
6、在银行家算法中,若出现下述资源分配情况:
Allocation
⑴ 该状态是否安全?
⑵ 若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?
⑴该状态是安全的,因为存在一个安全序列& P0P3P4P1P2&。下表为该时刻的安全序列表。
Allocation
Work+Allocation
3 12 14 16
⑵若进程P2提出上述请求,系统不能将资源分配给它,因为分配之后系统将进入不安全状态。
P2请求资源:P2发出请求向量Request2(1,2,2,2),系统按银行家算法进行检查:
①Request2(1,2,2,2)≤Need2(2,3,5,6);
②Request2(1,2,2,2)≤Available(1,6,2,2);
③系统暂时先假定可为P2分配资源,并修改P2的有关数据,如下表:
Allocation
可用资源Available(0,4,0,0)已不能满足任何进程的需要。
7、在什么情况下需要使用作业控制块JCB?其中包含了哪些内容?
为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块。
在JCB 中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。
8、在抢占调度方式中,抢占的原则是什么?
抢占的原则有:优先权原则;短作业(进程)优先原则;时间片原则。
9、为什么说多级反馈队列调度算法能较好满足各方面用户的需要?
(1) 所有类型的作业都会在很短的时间内启动,用户会获得响应;
(2) 终端型用户作业、短批处理作业用户,能在较短的时间内完成;
(3) 系统吞吐率高;
(4) 长批处理作业,能够最终得到处理。
10、在解决死锁问题的几个方法中,哪种方法最易于实现?哪种方法资源利用率最高?
“预防死锁”最容易实现;“避免死锁”资源利用率最高。
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:
指弹吉他 && 技术

我要回帖

更多关于 加权轮转调度算法 的文章

 

随机推荐