c语言实现短进程不可抢占调度算法,(C语言实现)进程调度—时间片轮转调度算法...

一、设计目的:

本设计模拟在单处理器情况下的时间片轮转进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点。

二、设计内容

设计程序模拟单处理机系统中时间片轮转进程调度算法,每个进程由一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、到达时间、需要运行时间、完成标志与否、进程状态、还需运行的时间等。

进程的需要运行时间和到达时间以及进程运行的时间片人为设定。

每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3种状态。

时间片轮转调度算法的思想:给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

三、程序结构:

首先,对所有的进程按到达时间升序排序,这个排序的稳定的,也就是说如果他们同时到达则先输入的排在前面;

接着,把当前时间time赋值为process[1].at;

后来,对就绪队列中的进程一一执行,直到所有进程运行完毕。

自己写的源程序:#include

#define N 50

struct PCB

{

int pn; //process name进程名字

int at; //arrival time到达时间

int st; //service time服务时间

int ct; //completion time完成时刻

int sc; //sign completion标志是否完成

int st1; //剩余服务时间

}process[N];

int sjp(int n)

{

int i,j,T;

printf("\n请输入时间片:\n");

scanf("%d",&T);

for(i=1;i<=n;i++) //收集进程信息

{

process[i].sc=0;

printf("\n%d:\n请依次输入进程的信息\n请输入pn:",i);

scanf("%d",&process[i].pn);

printf("请输入at:");

scanf("%d",&process[i].at);

printf("请输入st:");

scanf("%d",&process[i].st);

process[i].st1=process[i].st;

}

for(i=1;i<=n;i++)

for(j=i+1;j<=n;j++) //按照各进程到达时间升序,对进程排序 注意:稳定的排序

{

if(process[j].at

{

process[0]=process[j];

process[j]=process[i];

process[i]=process[0];

}

}

//for(i=1;i<=n;i++) //检查排序是否正确

//printf("%d\t",process[i].pn);

int time=process[1].at; //当前时间的初值

int flag=1;

int sum=0;//记录完成的进程数

printf("\n第几次调度进程 运行的进程pn 开始运行时间 运行时间 剩余服务时间 结束时间\n");

int z=1; //记录第几次调度进程

while(sum

{

flag=0; //标志就绪队列中是否还有进程

for(i=1;i<=n;i++) //时间片轮转法执行各进程

{

if(process[i].sc==1) continue; //已完成的进程

else

{

if(process[i].st1<=T&&time>=process[i].at)//未完成的进程但是还需服务的时间少于等于一个时间片

{

flag=1;

time=time+process[i].st1;

process[i].sc=1;

process[i].ct=time;

printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-process[i].st1,process[i].st1,0,time);

process[i].st1=0;

}

else if(process[i].st1>T&&time>=process[i].at)//未完成的进程但其还需服务时间至少大于一个时间片

{

flag=1;

time=time+T;

process[i].st1-=T;

printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-T,T,process[i].st1,time);

}

if(process[i].sc==1) sum++; //一个进程执行完就+1

}

}

if(flag==0&&sum

{

for(i=1;i<=n;i++)

if(process[i].sc==0) {time=process[i].at;break;}

}

}

}

int main()

{

int n;

printf("\t\t时间片轮转调度算法\n");

printf("请输入总进程数:\n");

scanf("%d",&n);

sjp(n);

return 0;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值