时间片轮转调度算法资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p=(structshijian*)malloc(sizeof(structshijian)); //初始化一个空间给进程进入
printf("输入第%d个进程的名字、到达时间、服务时间:\n",i+1);
scanf("%s%d%d",&p->name,&p->daodatime,&p->fuwutime);
三、实验代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedefstruct PCB2
{
char name[10];//进程名
int runtime;//要求运行时间
intfrist;//定义优先数
char zhuangtai; //定义状态,R为就绪,F为完成
《操作系统》课程实验报告
实验名称:时间片轮转调度算法
班级:****************
学号:*************
姓名:**************
指导老师:***************
成绩:
一、实验目的:
1、测试数据可以随即输入或从文件中读入。
2、必须要考虑到进程的到达时间
3、最终能够计算每一个进程的周转时间的带权周转时间。
if(p->shengyutime<0) //当P运行完,即剩余时间小于0时,仍然把它当做0处理
p->shengyutime=0;
printf("\n************程序开始运行*****************\n");
printf("进程到达时间服务时间剩余时间当前状态\n");
while(t!=NULL) //时间不为空时,输出当前进程的信息,并把时间片交给下一个进程
{
t=q;
q=q->next;
}
if(q==head) //而当Q是队首时,则下一个队首变成P,以便每个进程都能够得到时间片
{
p->next=head;
head=p;
}
else if(t==rear) //当执行时间片到达队尾时(执行完时),返回给队首P
{
rear->next=p;
p->next=NULL;
{
printf("%2c%8d%8d%14d%10s\n",t->name,t->daodatime,t->fuwutime,t->shengyutime,t->state);
t=t->next;
}
getchar(); //按住回车键观看
if(p->shengyutime==0)//当队首的剩余时间为0时,先把队首改成P的下一个,然后释放内存,删除队首节点
{
inta,i;
structshijian *head, *rear,*p,*q,*t;//定义队首、队尾、P是队尾指针、Q是队首指针和执行时间
head=rear=NULL;//初始化队首和队尾为空
printf("请输入进程数目:");
scanf("%d",&a);
for(i=0;i<a;i++)
{
{
r=p;
p->state="就绪";
p=p->next;
}
}
}
}
void main()
{
int N;
int number;
char Tishikuang;//提示框
do{
printf("★*********★********★*******★******★********★*********★************★\n");
};
structshijian {//定义时间片的结构体
char name; //定义进程名
intdaodatime;//到达Biblioteka Baidu间
intfuwutime; //服务时间
intshengyutime;//剩余时间
char *state;//所处状态
structshijian *next;
};
structshijian *time()
rear=p;
}
else //否则给队首P占用执行时间,P执行完后到Q
{
t->next=p;
p->next=q;
}
}
}
return head;//返回队首
}
void output(structshijian *head)//定义输出函数
{
structshijian *p,*t,*r;
intnum;
printf("请输入时间片:");
p->shengyutime=p->fuwutime;
p->state="就绪";
if(rear==NULL) //当输入结束时,把P的数据放到队首,以便执行下一步
{
head=p;
p->next=NULL;
rear=p;
}
else //否则执行时间就为空,队首变成Q
{
t=NULL;
q=head;
while(q&&q->daodatime<p->daodatime)//当Q和Q的到达时间小于P的到达时间时,把执行时间给Q
显示函数:在进程调度前、调度中和调度后进行显示。
排序函数:对就绪状态的进程按照进入就绪队列的时间排序,新到达的进行应优先于刚刚执行过的进程进入就绪队列的队尾。
调度函数:每次从就绪队列队首调度优一个进程执行,状态变化。并在执行一个时间片后化,服务时间变化,状态变化。当服务时间为0时,状态变为F。
删除函数:撤销状态为F的进行。
{
if(p==head)
{
head=p->next;
free(p);
p=head;
}
else //否则返回执行,把队尾的下一个指针变成P的下一个指针,队尾的位置移动到队首
{
r->next=p->next;
p=r->next;
r=p;
}
}
else //否则把队首的位置给队尾,把队首的状态显示为“就绪”状态
4、时间片大小可以不为1,但至少实现时间片大小为1的RR调度。
二、实验内容:
模拟实现时间片轮转调度算法,具体如下:
设置进程体:进程名,进程的到达时间,服务时间,,进程状态(W——等待,R——运行,F——完成),进程间的链接指针
进程初始化:由用户输入进程名、服务时间进行初始化,同时,初始化进程的状态为W。
scanf("%d",&num);
while(head!=NULL) //当队首不为空时,把P给队首
{
r=p=head;
while(p!=NULL) //把执行时间给队首
{
t=head;
p->shengyutime=p->shengyutime-num; //P的剩余时间=剩余时间-时间片
p->state="运行"; //状态变成运行态
相关文档
最新文档