失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 进程调度时间片轮转c语言 时间片轮转调度算法的C语言模拟实现

进程调度时间片轮转c语言 时间片轮转调度算法的C语言模拟实现

时间:2022-09-29 23:59:25

相关推荐

进程调度时间片轮转c语言 时间片轮转调度算法的C语言模拟实现

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。

以下是C算法的模拟实现:

#include

#define MAX 10

struct task_struct

{

char name[10]; /*进程名称*/

int number; /*进程编号*/

float come_time; /*到达时间*/

float run_begin_time; /*开始运行时间*/

float run_time; /*运行时间*/

float run_end_time; /*运行结束时间*/

int priority; /*优先级*/

int run_flag; /*调度标志*/

int start_flag; //是否为第一次开始调度

} tasks[MAX];

int counter; /*实际进程个数*/

int time_counter=0;

int poutput(); /*调度结果输出*/

int time();

int charge();//判断是否所有的进程都被执行过

void main()

{

pinput();

printf("时间片轮转算法。\n\n");

time();

poutput();

}

int time()

{

float time_temp=0;

int i;

int j=0;

int k=0;

struct task_struct copy_task[MAX];//备份

for(i=0; i

{

copy_task[j++]=tasks[i];//对进程的初始化信息备份

}

time_temp=tasks[0].come_time;

while(charge())

{

for(i=0; i

{

if(tasks[i].come_time>time_temp)

{

time_temp=tasks[i].come_time;

}

if(tasks[i].run_flag==0)//该进程还未结束

{

if(tasks[i].start_flag==0) //该条件成立则说明,该进程是第一次执行,记录开始执行时间

{

tasks[i].run_begin_time=time_temp;

tasks[i].start_flag=1;

}

if(tasks[i].run_time/time_counter>1)//至少有两倍的时间片未执行

{

tasks[i].run_time=tasks[i].run_time-time_counter;

time_temp=time_temp+time_counter;

}

else if(tasks[i].run_time-time_counter==0)

{

time_temp=time_temp+time_counter;

tasks[i].run_end_time=time_temp;

tasks[i].run_flag=1;

tasks[i].run_time=copy_task[i].run_time;

}

else//仅剩下不足一倍的时间片

{

time_temp=time_temp+tasks[i].run_time;

tasks[i].run_end_time=time_temp;

tasks[i].run_flag=1;

tasks[i].run_time=copy_task[i].run_time;

}

}

}

}

}

int charge()//判断是否全部进程都执行完毕

{

int k;

int super_flag=0;//判断是否全部的进程都执行完毕

for(k=0; k

{

if(tasks[k].run_flag==0)

{

super_flag=1;

return super_flag;

break;

}

else

{

super_flag=0;

}

}

return super_flag;

}

int pinput() /*进程参数输入*/

{

int i;

printf("please input the process counter:\n");

scanf("%d",&counter);

printf("please input the length of time:\n");

scanf("%d",&time_counter);

for(i=0; i

{

printf("******************************************\n");

printf("please input the process of %d th :\n",i+1);

printf("please input the name:\n");

scanf("%s",tasks[i].name);

printf("please input the number:\n");

scanf("%d",&tasks[i].number);

printf("please input the come_time:\n");

scanf("%f",&tasks[i].come_time);

printf("please input the run_time:\n");

scanf("%f",&tasks[i].run_time);

printf("please input the priority:\n");

scanf("%d",&tasks[i].priority);

tasks[i].run_begin_time=0;

tasks[i].run_end_time=0;

tasks[i].run_flag=0; //运行是否结束

tasks[i].start_flag=0;//是否首次被执行

}

return 0;

}

int poutput() /*调度结果输出*/

{

int i;

float turn_round_time=0,f1,w=0;

printf("进程名 进程号 到达时间 运行时间 开始时间 结束时间 优先级 周转时间\n");

for(i=0; i

{

f1=tasks[i].run_end_time-tasks[i].come_time;

turn_round_time+=f1;

printf("%s\t%d\t%5.3f\t%5.3f\t%5.3f\t %5.3f\t %d\t %5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].priority,f1);

}

printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);

return 0;

}

如果觉得《进程调度时间片轮转c语言 时间片轮转调度算法的C语言模拟实现》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。