操作系统---时间片轮转

霸气de小男生 提交于 2020-02-29 09:07:38

#include<iostream>
using namespace std;
#include <string>
#include<queue>
static const int MaxNum=100;
    
    deque<char>item;
    int  ArrivalTime[MaxNum];
    int  ServiceTime[MaxNum];
    int  PServiceTime[100];//还需要服务的时间
    int  FinishTime[MaxNum];
    int  WholeTime[MaxNum];//周转时间;
    double  WeightWholeTime[MaxNum];//带权周转时间
    bool Finished[MaxNum];
    int n,q,insert=0,pass_time=0;

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    void get_run_time(){

            //求周转时间;
       for(int i=0;i<n;i++)
       {
        WholeTime[i]=FinishTime[i]-    ArrivalTime[i];
        //周转时间=完成时间-到达时间;
       }
            //求带权周转时间
       for(i=0;i<n;i++)
       {
            WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
       }


    }

    double AverageWT(){
        //平均周转时间
       double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WholeTime[i];

       }
       return sum/(n*1.0);
    
    }
    
    double AverageWWT(){
        //FCFS平均带权周转时间
        double sum=0;
       for(int i=0;i<n;i++)
       {
           sum+=WeightWholeTime[i];

       }
       return sum/(n*1.0);
    
    }

    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@调度函数@@@@@@@@@@@@@@@@@@@@@@
    int getitem()
    {    //获取进程的下标
        if(pass_time>=ArrivalTime[insert])
             return insert++;    //如果有就绪进程存在,返回下标
        else return -1;//否则返回-1;
    }
    void additem()
    {    //将就绪进程加进队列    
        char str='A'+insert-1;//通过下标取得元素
        item.push_back(str);            
    }
    

void main(){
  freopen("text.txt","rt",stdin);
    
    int i=0;
    //cout<<"请输入进程个数"<<endl;
    cin>>n;
    if(n==0)return;
//    cout<<"进程到达系统时刻分别为"<<endl;
    for(i=0;i<n;cin>>ArrivalTime[i++]);
//    cout<<"进程需要服务时间分别为:"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>ServiceTime[i];
        PServiceTime[i]=ServiceTime[i];
    }
        
//输入时间片的大小    
    cin>>q;
    if(q==0)return;//如果时间片等于0,就不必进行操作了。属于非法参数。


    item.push_back('A');//先将第一个请求服务的进程入队。
    insert++;//下次即将入队的下标

    char temp='A';//中间变量,存放队列首元素。

    int j=0;//队列首元素的下标

    while(!item.empty())//求各个进程完成的系统时间
    {
    
        temp=item.front();    //得到队列首元素的值;
        j=temp-'A';        //得到队列首元素的下标;
        
        if(PServiceTime[j]>q)//如果队列首元素剩余服务时间>时间片轮转的时间,进行的操作
        {  
            PServiceTime[j]-=q;//得到此次服务后还需要服务的时间
            pass_time+=q;//得到系统时间=当前时间+时间片轮转的时间
            
            //将首个就绪请求服务进程加进对尾,再将队列首元素移位到队尾;
            item.pop_front();
            if(insert!=n)
            {
                while(-1!=getitem() && insert<=n) additem();//将已申请的进程进入就绪队列。注意前面的insert参数在调用getitem()函数时,都会比原先的下标超1;
                            
            }
            item.push_back(temp);
            
            
        }
        else//如果队列首元素的剩余服务时间<时间片的轮转时间,进行如下操作
        {
            item.pop_front();//对头直接出对列;
            pass_time+=PServiceTime[j];//得到系统时间=当前时间+当前进程还需要服务的时间
            PServiceTime[j]=0;//将当前进程还要服务的时间清零

            FinishTime[j]=pass_time;//记录当前进程服务完成的系统时间

        //将首个就绪请求服务进程加进对尾
            if(insert!=n)
            {
                while(-1!=getitem() && insert<=n) additem();//将已申请的进程进入就绪队列。注意前面的insert参数在调用getitem()函数时,都会比原先的下标超1;
                            
            }
        }
        
       /*cout<<"@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
            int num=item.size();
            while(num--){cout<<item.front()<<" ";item.push_back(item.front());item.pop_front();}
            cout<<endl;    */    
    
    }
    cout<<"时间片轮转时间为:"<<q<<endl;
    get_run_time();    //求周转时间;
    cout<<"FCFS平均周转时间"<<AverageWT()<<endl;
    cout<<"FCFS平均带权周转时间"<<AverageWWT()<<endl;


}



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!