先来先服务,短作业优先,最高响应比三种算法下求平均周转和带权周转时间的实现

本文介绍了一个C++程序,用于演示三种不同的进程调度算法:先来先服务(FCFS)、短作业优先(SWF)和最高响应比优先(TRRF)。通过用户输入作业的到达时间和运行时间,程序计算并输出每种算法下的运行次序、平均周转时间及平均带权周转时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





codear发表于 2006年04月11日 21:20:00 (http://blog.youkuaiyun.com/coDear)
#include<iostream.h>
#define N 6
struct time{
    float arriveTime;
    float runTime;
    float finishTime;
    float totalTime;
    float weightTotalTime;
    char name;
};

 void InputTime(time *p)
 {
     int i;//counter
     cout<<"input name & arrive time & run time:"<<endl;
     for(i=0;i<=N-1;i++){
         float temp1,temp2;
         char name;
         cout<<"作业名:"<<endl;
         cin>>name;
         p[i].name=name;
         cout<<"到达时:"<<endl;
         cin>>temp1;
         p[i].arriveTime=temp1;
         cout<<"运行时间:"<<endl;
         cin>>temp2;
         p[i].runTime=temp2;
        
     }
         
 }
 void Print(time *p,float totalTimeSum,float weightTotalTimeSum){

     cout<<"运行次序:"<<endl;
     for(int k=0;k<=N-1;k++)
     {
         cout<<p[k].name<<" ";
        
     }
     cout<<endl;
     cout<<"平均周转时间:"<<totalTimeSum/N<<endl;
     cout<<"平均带权周转时间:"<<weightTotalTimeSum/N<<endl;
}
 void sort(time *p)
 {
     for(int i=0;i<=N-1;i++)
         for(int j=0;j<=i;j++)
             if(p[i].arriveTime<p[j].arriveTime)
             {
                 time temp;
                 temp=p[i];
                 p[i]=p[j];
                 p[j]=temp;
             }
 }

 void deal(time *p,float &totalTimeSum,float &weightTotalTimeSum)
 {
    
              int k;//counter
     for(k=0;k<=N-1;k++)
     {
         if(k==0)
             p[k].finishTime=p[k].arriveTime+p[k].runTime;
         else
             p[k].finishTime=p[k-1].finishTime+p[k].runTime;
     }

     for(k=0;k<=N-1;k++)
     {
     p[k].totalTime=p[k].finishTime-p[k].arriveTime;
     p[k].weightTotalTime=p[k].totalTime/p[k].runTime;
    
        
         totalTimeSum+=p[k].totalTime;
         weightTotalTimeSum+=p[k].weightTotalTime;
     }
 }



 void FCFS(time *p)
 {
     float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"先来先服务:"<<endl;

Print(p,totalTimeSum,weightTotalTimeSum);

    
 }


void SWF(time *p)
 {
    
     float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

        for(int m=0;m<N-1;m++)
        {
        
            if(m==0)
            p[m].finishTime=p[m].arriveTime+p[m].runTime;
            else
                p[m].finishTime=p[m-1].finishTime+p[m].runTime;

            int i=0;
            for(int n=m+1;n<=N-1;n++)
            {
                
                if(p[n].arriveTime<=p[m].finishTime)
                    i++;
            }
            float min=p[m+1].runTime;
            int follow=m+1;
            for(int k=m+1;k<m+i;k++)
            {
                
            if(p[k+1].runTime<min)
            {min=p[k+1].runTime;
            follow=k+1;}
            
            }
            time temp;
            temp=p[m+1];
            p[m+1]=p[follow];
            p[follow]=temp;
        }
        
    

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"短作业优先:"<<endl;


    Print(p,totalTimeSum,weightTotalTimeSum);
}

void TRRF(time *p){
    float totalTimeSum=0,weightTotalTimeSum=0;

     sort(p);

        for(int m=0;m<N-1;m++)
        {
            
            if(m==0)
            p[m].finishTime=p[m].arriveTime+p[m].runTime;
            else
                p[m].finishTime=p[m-1].finishTime+p[m].runTime;

            int i=0;
            for(int n=m+1;n<=N-1;n++)
            {
                
                if(p[n].arriveTime<=p[m].finishTime)
                    i++;
            }
            float max=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;
            int follow=m+1;
            for(int k=m+1;k<m+i;k++)
            {
                
                if(max<=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime){
            max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;
            follow=k+1;
                }
            
            }
            time temp;
            temp=p[m+1];
            p[m+1]=p[follow];
            p[follow]=temp;
        }
        
    

     deal(p,totalTimeSum,weightTotalTimeSum);

     cout<<"最高响应比优先:"<<endl;


    Print(p,totalTimeSum,weightTotalTimeSum);
}
        

void main(){
    
    time a[N];
    InputTime(a);
    time *b=a;time *c=a;
    FCFS(a);
    SWF(b);
    TRRF(c);

}
    
/*
input name & arrive time & run time:
作业名:
a
到达时:
0
运行时间:
6
作业名:
b
到达时:
2
运行时间:
50
作业名:
c
到达时:
5
运行时间:
20
作业名:
d
到达时:
5
运行时间:
10
作业名:
e
到达时:
12
运行时间:
40
作业名:
f
到达时:
15
运行时间:
8
先来先服务:
运行次序:
a b c d e f
平均周转时间:74.1667
平均带权周转时间:5.2425
短作业优先:
运行次序:
a d f c e b
平均周转时间:44.8333
平均带权周转时间:1.6025
最高响应比优先:
运行次序:
a d c f b e
平均周转时间:48.5
平均带权周转时间:2.0275
Press any key to continue
*/ 
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间平均周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间平均周转时间。 3. 实验内容 (1)编程实现本实验的程序,要: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间周转时间周转时间,并为整个进程序列计算平均周转时间平均周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间平均周转时间。 进程号 到达时间执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值