#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();
}

时间片轮转算法源代码相关推荐

  1. 计算机cpu轮转时间,CPU时间片轮转算法

    <CPU时间片轮转算法>由会员分享,可在线阅读,更多相关<CPU时间片轮转算法(8页珍藏版)>请在人人文库网上搜索. 1.CPU时间片轮转算法时间片轮转法进行CPU调度一.实验 ...

  2. 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

    首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...

  3. matlab中腐蚀图像的编写,Matlab实现二值图像的腐蚀算法源代码

    标签: 1.二值图像的腐蚀原理:我们知道,二值图像就是0和1组成的矩阵,0为黑1为白,腐蚀作用在1上面也就是图像高光白色部分,然后白色部分往外收缩.腐蚀就是类似于黑色军队反攻白色军队,最终把自己的黑色 ...

  4. 作业调度进程c语言代码,进程调度 时间片轮转调度算法源代码(C语言)

    #include #include #define MAX 5   //进程数量 #define RR 2   //时间片大小 /*时间片轮转算法*/ struct pro { int num; in ...

  5. quake3中求1/sqrt(x)的算法源代码

    quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) {long i;float x2, y;const float thr ...

  6. C#,楔子数(Sphenic Number)的暴力算法与高效算法源代码

    楔子数(Sphenic Number)来自于一个题目: Schoolboy Vasya is interested in the problem of distinguishing prime num ...

  7. 农历天干地支算法源代码大全(javascript、vbscript、C#、flash、C++、C等等)

    农历天干地支算法源代码大全 (javascript.vbscript.C#.flash.C++.C等等) WonSoft编 文章提供计算农历天干地支及当年属相的算法源程序,使用的语言为Javascri ...

  8. 时间片轮转算法思想(java)

    目录 一.要求 二 .实验原理 阐述多道作业从提交到执行流程说明三级调度的概念.之间的区别与关系: ​ 阐述FCFS.SJF/SPF.HRRN.RR和多级反馈队列调度算法思想.特点及优缺点: 三.实验 ...

  9. 进程调度-时间片轮转算法

    进程调度   一.实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及继承调度算法的理解. 二.实验内容和要求 设计一个有N个进程并发的进程调度程序,采用时间片轮转算法. Ø      ...

最新文章

  1. python Unicode转ascii码的一种方法
  2. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
  3. MySQL实战45讲学习笔记:MySQL架构(第一讲)
  4. Capsule下一代CNN深入探索
  5. 微信突然出现redirect_uri 参数错误
  6. 刷新本地的DNS缓存数据
  7. 大型网站技术架构(八)--网站的安全架构(转)
  8. PSIM软件中 Simplified C Block模块 和 C Block模块区别
  9. JunitTest上集
  10. 大数据分析技术有什么特点
  11. 百会项目与redmine的对比
  12. Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别
  13. 编程中的c语言32个英文代码,C语言图形编程代码(国外英文资料).doc
  14. IBM GPFS并行文件系统
  15. c语言判断闰年次数,C语言判断闰年,即判断年份是否为闰年
  16. kubectl edit 与kubectl rollout
  17. iOS中app在iTunes中更新版本流程
  18. thinksystem sr550 安装ubuntu14.04 无法识别网卡驱动(连不了网)
  19. 为什么总有一些程序员,持续陷入焦虑、无法幸福?
  20. 历年评书出版一览表(1955~1994)

热门文章

  1. 廉价交换机走俏的原因以及使用中的风险
  2. 客厅计算机笔记本cpu,自己装一台客厅迷你小电脑,我很幸运避开数个大坑
  3. Babel(es6与se5 之间相互转换)
  4. 基于FME实现不动产数据一键导出自然资源部汇交格式
  5. 开发一个 Linux 调试器(四):Elves 和 dwarves
  6. 51nod 1113 矩阵快速幂 (矩阵的n次方)
  7. 2021最新支持APP|公众号聊天在线客服程序源码
  8. 生鲜配送企业要如何突破局限性?存在哪些弊端?
  9. 25岁以后还适合花钱学编程,当程序员吗?
  10. LeetCode 715. Range 模块