时间片轮转调度算法的C语言模拟实现
来源:互联网 发布:栅格矢量化算法 编辑:程序博客网 时间:2024/05/16 14:33
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。
以下是C算法的模拟实现:
#include<stdio.h>#define MAX 10struct 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<counter; i++) { copy_task[j++]=tasks[i];//对进程的初始化信息备份 } time_temp=tasks[0].come_time; while(charge()) { for(i=0; i<counter; 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<counter; 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<counter; 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<counter; 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;}
0 0
- 时间片轮转调度算法的C语言模拟实现
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- 用C语言实现对N个进程的简单时间片轮转法Round Robin的调度模拟
- 进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度_Java语言模拟实现
- 模拟时间片轮转算法(C++)
- 时间片轮转调度算法
- 时间片轮转调度算法
- 时间片轮转调度算法
- 时间片轮转调度算法
- 模拟时间片轮转的JavaScript实现
- 操作系统——模拟时间片轮转调度算法
- 进程调度:时间片轮转调度算法
- C # 时间片轮转算法
- 进程调度算法--时间片轮转算法
- 操作系统进程调度模拟程序 基于优先级调度和时间片轮转调度算法
- 基于mykernel的时间片轮转调度的实现
- 时间片轮转进程调度算法
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- tangowithdjango ch8 ModelForm
- 第八周项目1-数组做数据成员(3)
- NYOJ10skiing
- PHP字符串实体操作
- 时间片轮转调度算法的C语言模拟实现
- mysql+C#实战一:向数据库里面写入数据
- hiho 30 扫雷一
- java_API_常用字符串方法
- hdu 1902 The Dragon of Loowater
- SSH框架整合常见异常错误
- fedora 多java版本共存
- 总结:常用数据类型在16BIT,32BIT,64BIT系统下的长度
- 为什么说Druid是“最好的数据库连接池”?体现在哪些方面?这是如何实现的? (mybatis是不自带jdbc链接池的)