zoukankan      html  css  js  c++  java
  • (哈)先来先服务调度算法

    代码(自行变通!)

    #include <stdio.h>
    struct sjf{
    char name[10];
    float dt;//到达时间
    float st;//服务时间
    float begin_time;//开始运行时间
    float wct;//运行完成时间
    float zt;//周转时间
    float dczt;//带权周转时间
    };
    sjf a[100];
    void input(sjf *p,int n)
    {
    int i;
    for(i=0;i<=n-1;i++)
    {
    printf(" *********请输入第 %d 个进程的信息: ",i+1);
    printf(" 进程名称:");
    scanf("%s",&p[i].name);
    printf(" 到达时间:");
    scanf("%f",&p[i].dt);
    printf(" 服务时间:");
    scanf("%f",&p[i].st);
    }
    }
    void Print(sjf *p,float dt,float st,float begin_time,float wct,float zt,float dczt,int n)
    {
    int k;
    float sum1=0,sum2=0;
    printf(" run order:");
    printf("%s",p[0].name);
    for(k=1;k<n;k++)
    {
    printf("-->%s",p[k].name);
    }
    printf(" 进程信息如下: ");
    printf(" 进程名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间 ");
    for(k=0;k<n;k++)
    {
    printf("%3s %3.0f %.0f %.0f %3.0f %.0f %3.2f ",p[k].name,p[k].dt,p[k].st,p[k].begin_time,p[k].wct,p[k].zt,p[k].dczt);
    sum1+=p[k].zt;
    sum2+=p[k].dczt;
    }
    printf(" 平均周转时间:%.2f ",sum1/n);
    printf(" 平均带权周转时间:%.2f ",sum2/n);
    }
    //排序
    void sort(sjf *p,int n)
    {
    for(int i=0;i<=n-1;i++)
    for(int j=0;j<=i;j++)
    if(p[i].dt<p[j].dt)
    {
    sjf temp;
    temp=p[i];
    p[i]=p[j];
    p[j]=temp;
    }
    }
    //运行阶段
    void deal(sjf *p, float dt,float st,float begin_time,float wct,float &zt,float &dczt,int n)
    { int k;
    for(k=0;k<=n-1;k++)
    {
    if(k==0)
    {
    p[k].begin_time=p[k].dt;
    p[k].wct=p[k].dt+p[k].st;
    }
    else
    {
    p[k].begin_time=p[k-1].wct;
    p[k].wct=p[k-1].wct+p[k].st;
    }
    }
    for(k=0;k<=n-1;k++)
    {
    p[k].zt=p[k].wct-p[k].dt;
    p[k].dczt=p[k].zt/p[k].st;
    }
    }
    void SJF(sjf *p,int n)
    {
    float dt=0,st=0,begin_time=0,wct=0,zt=0,dczt=0;//对结构进行初始化
    sort(p,n);
    for(int m=0;m<n-1;m++)
    {
    if(m==0)
    p[m].wct=p[m].dt+p[m].st;
    else
    p[m].wct=p[m-1].wct+p[m].st;
    int i=0;
    for(int n=m+1;n<=n-1;n++)
    {
    if(p[n].dt<=p[m].wct)//判断内存中每次完成之后有多少到达的进程
    i++;
    }
    float min=p[m+1].st;
    int next=m+1; //m+1=n
    for(int k=m+1;k<m+i;k++) //找出到达后的进程中最小的进程
    {
    if(p[k+1].st<min)
    {
    min=p[k+1].st;
    next=k+1;
    }
    }
    sjf temp;
    temp=p[m+1];
    p[m+1]=p[next];
    p[next]=temp;
    }
    deal(p,dt,st,begin_time,wct,zt,dczt,n);

    Print(p,dt,st,begin_time,wct,zt,dczt,n);
    }
    int main()
    {
    int n;
    printf(" --------------先来先服务调度算法----------------- ");
    printf(" 请输入进程的个数: ");
    scanf("%d",&n);
    input(a,n);
    sjf *b=a;
    sjf *c=a;
    SJF(b,n);
    return 0;
    }

  • 相关阅读:
    LeetCode Related Info
    LeetCode Climbing Stairs
    Linux命令语句秘籍
    Java基础学习 —— io
    Jquery的入门学习
    Java基础学习 —— bat处理文件
    Java基础学习 —— 线程
    Java基础学习——泛型
    java基础学习——集合
    两个div叠加触发事件发生闪烁问题
  • 原文地址:https://www.cnblogs.com/1314-520/p/12706996.html
Copyright © 2011-2022 走看看