C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢相关的知识,希望对你有一定的参考价值。
操作系统,希望高手赐教
参考技术A #include<stdlib.h>#define MAX 5 //进程数量
#define RR 2 //时间片大小
/*时间片轮转算法*/
struct pro
int num;
int arriveTime;
int burst;
int rt; //记录进程被运行的次数
struct pro *next;
;
int TOTALTIME; //记录所有进程的总时间
//函数声明
struct pro* creatList();
void insert(struct pro *head,struct pro *s);
struct pro* searchByAT(struct pro *head,int AT);
void del(struct pro* p);
int getCount(struct pro *head,int time);
struct pro* searchEnd(struct pro *head);
void move(struct pro *headF,struct pro *headT,int n);
struct pro* creatList() //创建链表,按照进程的到达时间排列,记录所有进程的信息
struct pro* head=(struct pro*)malloc(sizeof(struct pro));
head->next=NULL;
struct pro* s;
int i;
TOTALTIME=0;
for(i=0;i<MAX;i++)
s=(struct pro*)malloc(sizeof(struct pro));
printf("请输入进程名:\n");
scanf("%d",&(s->num));
printf("请输入到达时间:\n");
scanf("%d",&(s->arriveTime));
printf("请输入运行时间:\n");
scanf("%d",&(s->burst));
TOTALTIME+=s->burst; //计算总时间
s->rt=1; //rt的初始值为1
s->next=NULL;
insert(head,s);
return head; //到达队列中的进程按照其到达时间的先后顺序排列
void insert(struct pro *head,struct pro *s) //插入节点
struct pro *p=searchByAT(head,s->arriveTime);
s->next=p->next;
p->next=s;
return;
struct pro* searchByAT(struct pro *head,int AT) //查找第一个到达时间大于等于AT的节点,返回其前一个指针
struct pro *p,*q;
p=head;
q=head->next;
while(q!=NULL&&q->arriveTime<=AT)
p=q;
q=q->next;
return p;
void del(struct pro* p) //删除p的下一个节点
struct pro *tmp;
tmp=p->next;
p->next=tmp->next;
free(tmp);
return;
int getCount(struct pro *head,int time) //察看在time之前到达但未移动到运行队列的进程数量
int count=0;
struct pro *s,*t;
s=head;
t=s->next;
while(t!=NULL&&t->arriveTime<=time)
s=t;
t=t->next;
count++; //count记录当前时刻到达的进程数
return count;
struct pro* searchEnd(struct pro *head) //查找并返回循坏队列的尾节点的前一个节点
struct pro *p,*q;
p=head;
q=head->next;
while(q->next!=head)
p=q;
q=q->next;
return p;
void move(struct pro *headF,struct pro *headT,int n) //将headF后的n个节点移动到循环队列headT中
struct pro *r,*s,*t;
s=headF;
t=s->next;
r=t; //r记录要移动的第一个节点
while(n>1)
t=t->next;
n--;
s->next=t->next; //以上完成从原队列中摘除相关节点,r,t分别为第一个和最后一个节点
s=searchEnd(headT);
t->next=s->next;
s->next=r;
void run(struct pro *head)
int time=0; //记录当前时间
int newarrive;//新到达进程数
struct pro *runhead=(struct pro*)malloc(sizeof(struct pro));
runhead->next=runhead; //创建新的循环链表,存放当前就绪队列中的进程
struct pro *p,*q;
p=runhead;
q=p->next; //q记录当前应当运行的进程
while(time<=TOTALTIME)
newarrive=getCount(head,time);
if(newarrive>0)
move(head,runhead,newarrive); //将head后的newarrive个节点移动到runhead队列中
if(runhead->next==runhead) //就绪队列中没有进程
time++;
else if(q==runhead)
p=q;
q=q->next;
else
printf("进程名:%d\n",q->num);
printf("到达时间:%d\n",q->arriveTime);
if(q->rt==1)
printf("响应时间:%d\n",time-q->arriveTime);
else
printf("第%d次运行开始时间:%d\n",q->rt,time);
if(q->burst<=RR)
time+=q->burst;
printf("第%d次运行结束时间:%d\n",q->rt,time);
printf("周转时间:%d\n",time-q->arriveTime);
printf("************************************\n");
struct pro *tmp=q;
q=q->next;
p->next=q;
free(tmp);
else //q->burst>RR
time+=RR;
printf("第%d次运行结束时间:%d\n",q->rt,time);
printf("************************************\n");
q->burst-=RR;
q->rt++;
p=q;
q=q->next;
void main()
struct pro *head=creatList();
printf("当前时间片大小为:%d\n",RR);
run(head);
本回答被提问者采纳
调度算法:时间片轮转优先级多级反馈队列
调度算法:时间片轮转、优先级、多级反馈队列
知识总览图
注:比起早期的批处理操作系统来说,由于计算机造价大幅降低,因此之后出现交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好地满足交互式系统的需求。因此这三种算法适合用于交互式系统。(比如UNIX使用的就是多级反馈队列调度算法)
时间片轮转调度算法(RR,Round-Robin)
时间片大小为2
6时刻(P3(1)–>P2(2)–>P4(6)–>P1(1)):6时刻,P1时间片用完,下处理机,重新放回到就绪队尾,发生调度
7时刻(P2(2)–>P4(6)–>P1(1)):虽然P3的时间片没用完,但是由于P3只需要运行1个单位的时间,运行完了会主动放弃处理机,因此也会发生调度。队头进程P2上处理机。
9时刻(P4(6)–>P1(1)):进程P2时间片用完,并刚好运行完,发生调度,P4上处理机
11时刻(P1(1)–>P4(4)):P4时间片用完,重新回到就绪队列。P1上处理机。
时间片大小为5
若按照先来先服务调度算法
优先级调度算法
非抢占式的优先级调度算法
抢占式的优先级调度算法
思考
FCFS算法的优点是公平。
SJF算法的优点是能尽快处理完短作业,平均等待/周转时间等参数很优秀。
时间片轮转调度算法可以让各个进程得到及时的响应。
优先级调度算法可以灵活地调整各种进程服务的机会。
能否对其它算法做个折中权衡?得到一个综合表现优秀平衡的算法呢?
基于这个想法,人们就提出了多级反馈队列调度算法。
多级反馈队列调度算法
以上是关于C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢的主要内容,如果未能解决你的问题,请参考以下文章
操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)