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);
本回答被提问者采纳

调度算法:时间片轮转优先级多级反馈队列

调度算法:时间片轮转、优先级、多级反馈队列

知识总览图

Snipaste_2020-11-01_17-55-10

注:比起早期的批处理操作系统来说,由于计算机造价大幅降低,因此之后出现交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好地满足交互式系统的需求。因此这三种算法适合用于交互式系统。(比如UNIX使用的就是多级反馈队列调度算法)

时间片轮转调度算法(RR,Round-Robin)

时间片大小为2

Snipaste_2020-11-01_17-25-27

Snipaste_2020-11-01_17-16-11

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

在这里插入图片描述

若按照先来先服务调度算法

在这里插入图片描述

优先级调度算法

Snipaste_2020-11-01_17-44-34

非抢占式的优先级调度算法

Snipaste_2020-11-01_17-31-39

抢占式的优先级调度算法

Snipaste_2020-11-01_17-34-28

Snipaste_2020-11-01_17-43-35

思考

FCFS算法的优点是公平。

SJF算法的优点是能尽快处理完短作业,平均等待/周转时间等参数很优秀。

时间片轮转调度算法可以让各个进程得到及时的响应。

优先级调度算法可以灵活地调整各种进程服务的机会。

能否对其它算法做个折中权衡?得到一个综合表现优秀平衡的算法呢?

基于这个想法,人们就提出了多级反馈队列调度算法。

多级反馈队列调度算法

Snipaste_2020-11-01_17-54-38

Snipaste_2020-11-01_17-51-49

以上是关于C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢的主要内容,如果未能解决你的问题,请参考以下文章

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

进程调度算法时间片轮转调度算法多级反馈队列调度算法(Java实现)

急求 程序代码 c/c++ 操作系统中的 处理机调度算法

时间片轮转算法和优先级调度算法模拟实现

进程调度算法spf,fpf,时间片轮转算法实现

一个简单的时间片轮转内核代码的分析(课程作业)