时间片轮转算法源代码
#include<stdio.h>
#define MAX 10
struct task_struct
{
char name[10]; /*进程名称*/
float arrivetime; /*到达时间*/
float starttime; /*开始运行时间*/
float runtime; /*运行时间*/
float finishtime; /*运行结束时间*/
int runflag; /*调度标志*/
int startflag; //是否为第一次开始调度
} tasks[MAX];
int counter; /*实际进程个数*/
int pinput();
int timecounter=0;
int poutput(); /*调度结果输出*/
int time();
int charge();//判断是否所有的进程都被执行过
int time()
{
float 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];//对进程的初始化信息备份
}
temp=tasks[0].arrivetime;//temp=第一个进程的到达时间
while(charge())//while条件,charge为0跳出(说明进程都已经全部执行完毕),为1进入(进程还未执行完毕,继续执行)
{
for(i=0; i<counter; i++)
{
if(tasks[i].arrivetime>temp)//如果第i个的到达时间大于第一个的到达时间,则将第i个的到达时间与temp交换,更新temp的记录,但是第一次运行的时候不走这一步
{
temp=tasks[i].arrivetime;
}
if(tasks[i].runflag==0)//第i个进程还未结束
{
if(tasks[i].startflag==0) //该条件成立则说明,该进程是第一次执行,记录开始执行时间
{
tasks[i].starttime=temp;//第一个进程的到达时间为temp
tasks[i].startflag=1;//运行完上一步后记录该进程已经不是第一次运行了
}
if(tasks[i].runtime/timecounter>1)//,运行时间除以时间片长度,说明至少有两倍的时间片未执行
{
tasks[i].runtime=tasks[i].runtime-timecounter;//剩余运行时间就等于原来运行时间减去一个时间片长度
temp=temp+timecounter;//temp继续记录已用的时间片长度
}
else if(tasks[i].runtime-timecounter==0)//即运行时间除以时间片长度为1,该进程剩下的刚好是一个时间片长度,说明该进程只需在运行一一步就可以运行完毕
{
temp=temp+timecounter;//temp加上最后一个时间片长度就为该进程的结束时间
tasks[i].finishtime=temp;
tasks[i].runflag=1;//标记该进程已经执行完毕
tasks[i].runtime=copy_task[i].runtime;//为了计算周转时间,运行时间从备份里面还原到最开始的运行时间
}
else//仅剩下不足一倍的时间片,则剩余运行时间除以时间片长度<1
{
temp=temp+tasks[i].runtime;//剩余运行时间不够一个时间片长度,则结束时间等于temp加上该进程的运行时间
tasks[i].finishtime=temp;
tasks[i].runflag=1;//标记该进程已经运行完毕
tasks[i].runtime=copy_task[i].runtime;
}
}
}
}
return 0;
}
int charge()//判断是否全部进程都执行完毕
{
int k;
int superflag=0;//判断是否全部的进程都执行完毕
for(k=0; k<counter; k++)
{
if(tasks[k].runflag==0)//只要
{
superflag=1;
return superflag;
break;
}
else
{
superflag=0;
}
}
return superflag;
}
int pinput() /*进程参数输入*/
{
int i;
printf("请输入进程个数:\n");
scanf("%d",&counter);
printf("请输入时间片长度:\n");
scanf("%d",&timecounter);
for(i=0; i<counter; i++)
{
printf("******************************************\n");
printf("请输入进程名称、到达时间、运行时间:(中间用空格隔开)\n");
scanf("%s%f%f",tasks[i].name,&tasks[i].arrivetime,&tasks[i].runtime);
tasks[i].starttime=0;
tasks[i].finishtime=0;
tasks[i].runflag=0; //运行是否结束
tasks[i].startflag=0;//是否首次被执行
}
return 0;
}
int poutput() /*调度结果输出*/
{
int i;
float zztime=0,f1,w=0;
printf("进程名 到达时间 运行时间 开始时间 结束时间 周转时间\n");
for(i=0; i<counter; i++)
{
f1=tasks[i].finishtime-tasks[i].arrivetime;
zztime+=f1;
printf("%s\t%5.3f\t%5.3f\t%5.3f\t %5.3f\t%5.3f\n",tasks[i].name,tasks[i].arrivetime,tasks[i].runtime,tasks[i].starttime,tasks[i].finishtime,f1);
}
printf("平均周转时间=%5.2f\n",zztime/counter);
return 0;
}
void main()
{
pinput();
printf("时间片轮转算法。\n\n");
time();
poutput();
}
时间片轮转算法源代码相关推荐
- 计算机cpu轮转时间,CPU时间片轮转算法
<CPU时间片轮转算法>由会员分享,可在线阅读,更多相关<CPU时间片轮转算法(8页珍藏版)>请在人人文库网上搜索. 1.CPU时间片轮转算法时间片轮转法进行CPU调度一.实验 ...
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- matlab中腐蚀图像的编写,Matlab实现二值图像的腐蚀算法源代码
标签: 1.二值图像的腐蚀原理:我们知道,二值图像就是0和1组成的矩阵,0为黑1为白,腐蚀作用在1上面也就是图像高光白色部分,然后白色部分往外收缩.腐蚀就是类似于黑色军队反攻白色军队,最终把自己的黑色 ...
- 作业调度进程c语言代码,进程调度 时间片轮转调度算法源代码(C语言)
#include #include #define MAX 5 //进程数量 #define RR 2 //时间片大小 /*时间片轮转算法*/ struct pro { int num; in ...
- quake3中求1/sqrt(x)的算法源代码
quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) {long i;float x2, y;const float thr ...
- C#,楔子数(Sphenic Number)的暴力算法与高效算法源代码
楔子数(Sphenic Number)来自于一个题目: Schoolboy Vasya is interested in the problem of distinguishing prime num ...
- 农历天干地支算法源代码大全(javascript、vbscript、C#、flash、C++、C等等)
农历天干地支算法源代码大全 (javascript.vbscript.C#.flash.C++.C等等) WonSoft编 文章提供计算农历天干地支及当年属相的算法源程序,使用的语言为Javascri ...
- 时间片轮转算法思想(java)
目录 一.要求 二 .实验原理 阐述多道作业从提交到执行流程说明三级调度的概念.之间的区别与关系: 阐述FCFS.SJF/SPF.HRRN.RR和多级反馈队列调度算法思想.特点及优缺点: 三.实验 ...
- 进程调度-时间片轮转算法
进程调度 一.实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及继承调度算法的理解. 二.实验内容和要求 设计一个有N个进程并发的进程调度程序,采用时间片轮转算法. Ø ...
最新文章
- python Unicode转ascii码的一种方法
- oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
- MySQL实战45讲学习笔记:MySQL架构(第一讲)
- Capsule下一代CNN深入探索
- 微信突然出现redirect_uri 参数错误
- 刷新本地的DNS缓存数据
- 大型网站技术架构(八)--网站的安全架构(转)
- PSIM软件中 Simplified C Block模块 和 C Block模块区别
- JunitTest上集
- 大数据分析技术有什么特点
- 百会项目与redmine的对比
- Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别
- 编程中的c语言32个英文代码,C语言图形编程代码(国外英文资料).doc
- IBM GPFS并行文件系统
- c语言判断闰年次数,C语言判断闰年,即判断年份是否为闰年
- kubectl edit 与kubectl rollout
- iOS中app在iTunes中更新版本流程
- thinksystem sr550 安装ubuntu14.04 无法识别网卡驱动(连不了网)
- 为什么总有一些程序员,持续陷入焦虑、无法幸福?
- 历年评书出版一览表(1955~1994)
热门文章
- 廉价交换机走俏的原因以及使用中的风险
- 客厅计算机笔记本cpu,自己装一台客厅迷你小电脑,我很幸运避开数个大坑
- Babel(es6与se5 之间相互转换)
- 基于FME实现不动产数据一键导出自然资源部汇交格式
- 开发一个 Linux 调试器(四):Elves 和 dwarves
- 51nod 1113 矩阵快速幂 (矩阵的n次方)
- 2021最新支持APP|公众号聊天在线客服程序源码
- 生鲜配送企业要如何突破局限性?存在哪些弊端?
- 25岁以后还适合花钱学编程,当程序员吗?
- LeetCode 715. Range 模块