进程调度算法

需求分析

分别实现先到先服务调度(FCFS)、最短作业优先调度(SJF)、高响应比优先调度、(抢占式)优先权调度和时间片轮转调度五种进程调度算法。

概要设计

1.先到先服务调度(FCFS)

  按照进程的到来顺序运行,先来的进程先服务,后到的进程后服务。

2.最短作业优先调度(SJF)

  按照作业的长短即要求服务时间运行,短作业优先服务。

3.高响应比优先调度(HRRN)

  每个进程在每个时刻都有一个响应比,按照响应比决定服务顺序。

4.(抢占式)优先权调度

  每个进程都有一个优先权重,进程按照优先权重抢占式获得CPU服务。

5.时间片轮转调度(RR)

  每个进程固定运行一个时间片的长度后让出处理机,让其他进程获得服务。

设计思想

   以结构体保存每个进程的包括开始时间、运行时间、结束时间、周转时间的所有信息,运用队列或优先队列模拟等待队列,运用某些算法动态的改变等待队列的进程排列实现以上五种进程调度算法。

代码实现

1.先到先服务调度(FCFS)

#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;

struct node{

string pname;

double arrivetime;

double servetime;

double starttime;

double endtime;

double cycletime;

double withheightcycletime;

}process[maxn];

bool cmp(const node &a,const node &b)
{
    return a.arrivetime<b.arrivetime;
}
void run(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(i==1)
        {
            process[i].starttime=process[i].arrivetime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
        }
        else
        {
            process[i].starttime=process[i-1].endtime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
        }
    }
}

void input(int n)
{

   for(int i=1;i<=n;i++)
   {
       cout<<"请输入第"<<i<<"个进程的名称、到达时间和服务时间"<<endl;
       cin>>process[i].pname>>process[i].arrivetime>>process[i].servetime;
       process[i].cycletime=0;
       process[i].endtime;
       process[i].starttime;
       process[i].withheightcycletime;
   }
}
void print(int n)
{
    cout<<"进程执行顺序"<<endl;
    for(int i=1;i<=n;i++)
        {
            if(i==1)
                cout<<process[i].pname;
            else
                cout<<"->"<<process[i].pname;
        }
    cout<<endl;
    cout<<"进程名称\t"<<"到达时间\t"<<"服务时间\t"<<"开始时间\t"<<"结束时间\t"<<"周转时间\t"<<"带权周转时间\t"<<endl;
    for(int i=1;i<=n;i++)
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<setw(8)<<process[i].pname<<"\t"<<setw(8)<<process[i].arrivetime<<"\t"<<setw(8)<<process[i].servetime<<"\t"<<setw(8)<<process[i].starttime<<"\t"<<setw(8)<<process[i].endtime<<"\t"<<setw(8)<<process[i].cycletime<<"\t"<<setw(12)<<process[i].withheightcycletime<<endl;
    }
}
void FCFS_PRO()
{
   cout<<"请输入进程的数量"<<endl;
   int n;
   cin>>n;
   input(n);
   sort(process+1,process+n+1,cmp);
   run(n);
   print(n);
}

int main()
{
   FCFS_PRO();
   return 0;
}
//5
//A 0 4
//B 1 3
//C 2 5
//D 3 2
//E 4 4

2.最短作业优先调度(SJF)

#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;

struct node{

string pname;

double arrivetime;

double servetime;

double starttime;

double endtime;

double cycletime;

double withheightcycletime;

}process[maxn];

bool cmp(const node &a,const node &b)
{
    if(a.arrivetime!=b.arrivetime)
        return a.arrivetime<b.arrivetime;
    else
        return a.servetime<b.servetime;
}
bool servetimecmp(const node &a,const node &b)
{
    return a.servetime<b.servetime;
}
void run(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(i==1)
        {
            process[i].starttime=process[i].arrivetime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
        }
        else
        {
            double time=process[i-1].endtime;
            int j;
            for(j=i;j<=n;)
                if(process[j].arrivetime<=time)
                   j++;
            sort(process+i,process+j,servetimecmp);
            process[i].starttime=process[i-1].endtime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
        }
    }
}

void input(int n)
{

   for(int i=1;i<=n;i++)
   {
       cout<<"请输入第"<<i<<"个进程的名称、到达时间和服务时间"<<endl;
       cin>>process[i].pname>>process[i].arrivetime>>process[i].servetime;
       process[i].cycletime=0;
       process[i].endtime;
       process[i].starttime;
       process[i].withheightcycletime;
   }
}
void print(int n)
{
    cout<<"进程执行顺序"<<endl;
    for(int i=1;i<=n;i++)
        {
            if(i==1)
                cout<<process[i].pname;
            else
                cout<<"->"<<process[i].pname;
        }
    cout<<endl;
    cout<<"进程名称\t"<<"到达时间\t"<<"服务时间\t"<<"开始时间\t"<<"结束时间\t"<<"周转时间\t"<<"带权周转时间\t"<<endl;
    for(int i=1;i<=n;i++)
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<setw(8)<<process[i].pname<<"\t"<<setw(8)<<process[i].arrivetime<<"\t"<<setw(8)<<process[i].servetime<<"\t"<<setw(8)<<process[i].starttime<<"\t"<<setw(8)<<process[i].endtime<<"\t"<<setw(8)<<process[i].cycletime<<"\t"<<setw(12)<<process[i].withheightcycletime<<endl;
    }
}
void SJF_PRO()
{
   cout<<"请输入进程的数量"<<endl;
   int n;
   cin>>n;
   input(n);
   sort(process+1,process+n+1,cmp);
   run(n);
   print(n);
}

int main()
{
   SJF_PRO();
   return 0;
}

3.高响应比优先调度(HRRN)

#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;

struct node{

string pname;

double arrivetime;

double servetime;

double starttime;

double endtime;

double cycletime;

double withheightcycletime;

double priority;

}process[maxn];

bool cmp(const node &a,const node &b)
{
    if(a.arrivetime!=b.arrivetime)
        return a.arrivetime<b.arrivetime;
    else
        return a.servetime<b.servetime;
}
bool responsecmp(const node &a,const node &b)
{
    return a.priority>b.priority;
}
void run(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(i==1)
        {
            process[i].starttime=process[i].arrivetime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;


        }
        else
        {
            double time=process[i-1].endtime;
            for(int j=i;j<=n;j++)
            {
                process[j].priority=(time-process[j].arrivetime+process[j].servetime)/process[j].servetime;
                if(process[j].priority<1)
                process[j].priority=1;
            }
            sort(process+i,process+n+1,responsecmp);
            process[i].starttime=process[i-1].endtime;
            process[i].endtime=process[i].starttime+process[i].servetime;
            process[i].cycletime=process[i].endtime-process[i].arrivetime;
            process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
        }
    }
}

void input(int n)
{

   for(int i=1;i<=n;i++)
   {
       cout<<"请输入第"<<i<<"个进程的名称、到达时间和服务时间"<<endl;
       cin>>process[i].pname>>process[i].arrivetime>>process[i].servetime;
       process[i].cycletime=0;
       process[i].endtime;
       process[i].starttime;
       process[i].withheightcycletime;
       process[i].priority=1;
   }
}
void print(int n)
{
    cout<<"进程执行顺序"<<endl;
    for(int i=1;i<=n;i++)
        {
            if(i==1)
                cout<<process[i].pname;
            else
                cout<<"->"<<process[i].pname;
        }
    cout<<endl;
    cout<<"进程名称\t"<<"到达时间\t"<<"服务时间\t"<<"开始时间\t"<<"结束时间\t"<<"周转时间\t"<<"带权周转时间\t"<<endl;
    for(int i=1;i<=n;i++)
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<setw(8)<<process[i].pname<<"\t"<<setw(8)<<process[i].arrivetime<<"\t"<<setw(8)<<process[i].servetime<<"\t"<<setw(8)<<process[i].starttime<<"\t"<<setw(8)<<process[i].endtime<<"\t"<<setw(8)<<process[i].cycletime<<"\t"<<setw(12)<<process[i].withheightcycletime<<endl;
    }
}
void HRRN_PRO()
{
   cout<<"请输入进程的数量"<<endl;
   int n;
   cin>>n;
   input(n);
   sort(process+1,process+n+1,cmp);
   run(n);
   print(n);
}

int main()
{
   HRRN_PRO();
   return 0;
}

4.(抢占式)优先权调度

#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;

struct node
{

    string pname;

    int id;

    double arrivetime;

    double servetime;

    double starttime;

    double endtime;

    double cycletime;

    double withheightcycletime;

    double priority;

} process[maxn];

bool cmp(const node &a,const node &b)
{
    if(a.arrivetime!=b.arrivetime)
        return a.arrivetime<b.arrivetime;
    else
        return a.priority>b.priority;
}
bool operator<(const node &a,const node &b)
{
    return a.priority<b.priority;
}
bool endtimecmp(const node &a,const node &b)
{
        return a.endtime<b.endtime;
}
priority_queue<node>que;
int vis[maxn];
void run(int n)
{
    for(int i=1;i<=n;i++)
    {
        process[i].id=i;
    }
    process[1].endtime=process[1].arrivetime+process[1].servetime;
    process[1].starttime=process[1].arrivetime;
    int vis[maxn];
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    que.push(process[1]);
    int endtime=process[1].starttime+process[1].servetime;
    for(int k=process[1].starttime+1; k<=endtime; k++)
    {
        int index=n+1;
        for(int i=2; i<=n; i++)
            if(!vis[i])
            {
                index=i;
                break;
            }
        if(process[index].arrivetime==k)
        {
            node cur=que.top();
            for(int i=k; i<=endtime; i++)
            {
                int flag=0;
                for(int j=cur.id+1; j<=n; j++)
                    if(process[j].arrivetime==i&&!vis[j]&&process[j].priority>cur.priority)
                    {
                        que.pop();
                        cout<<"当前运行进程:"<<cur.pname<<endl;
                        priority_queue<node>t=que;
                        cout<<"当前就绪队列为:";
                        if(!t.empty())
                        {
                            while(!t.empty())
                            {
                                node newcur=t.top();
                                t.pop();
                                cout<<newcur.pname<<" ";
                            }
                            cout<<endl;
                        }
                        else
                        {
                            cout<<"无"<<endl;
                        }
                        process[j].starttime=i;
                        que.push(process[j]);
                        vis[j]=1;
                        flag=1;
                        endtime=i+process[j].servetime;
                        cur.servetime=cur.servetime-(i-cur.starttime);
                        if(cur.servetime==0)
                            process[cur.id].endtime=i;
                        if(cur.servetime>0)
                            que.push(cur);
                        break;
                    }
                    else if(process[j].arrivetime==i&&!vis[j]&&process[j].priority<=cur.priority)
                    {
                        que.push(process[j]);
                        vis[j]=1;
                    }
                if(flag==1)
                    break;
            }


        }
        if(k==endtime)
        {
            node cur=que.top();
            que.pop();
            cout<<"当前运行进程:"<<cur.pname<<endl;
            process[cur.id].endtime=k;
            priority_queue<node>t=que;
            cout<<"当前就绪队列为:";
            if(!t.empty())
            {
                while(!t.empty())
                {
                    node cur=t.top();
                    t.pop();
                    cout<<cur.pname<<" ";
                }
                cout<<endl;
            }
            else
            {
                cout<<"无"<<endl;
            }
            if(que.empty())
            {
                for(int i=1; i<=n; i++)
                {
                    if(!vis[i])
                    {
                        process[i].starttime=process[i].arrivetime;
                        que.push(process[i]);
                        k=process[i].arrivetime;
                        process[i].starttime=k;
                        vis[i]=1;
                        break;
                    }

                }
            }
            else
            {
                endtime+=que.top().servetime;
                node cur=que.top();
                que.pop();
                cur.starttime=k;
                que.push(cur);
            }

        }
    }
    for(int i=1;i<=n;i++)
    {
        process[i].cycletime=process[i].endtime-process[i].arrivetime;
        process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
    }
}
void input(int n)
{

    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个进程的名称、到达时间、服务时间和优先权重"<<endl;
        cin>>process[i].pname>>process[i].arrivetime>>process[i].servetime>>process[i].priority;
        process[i].cycletime=0;
        process[i].endtime;
        process[i].starttime;
        process[i].withheightcycletime;

    }
}
void print(int n)
{
    sort(process+1,process+n+1,endtimecmp);
    cout<<"进程执行顺序"<<endl;
    for(int i=1; i<=n; i++)
    {
        if(i==1)
            cout<<process[i].pname;
        else
            cout<<"->"<<process[i].pname;
    }
    cout<<endl;
    cout<<"进程名称\t"<<"优先权重\t"<<"服务时间\t"<<"到达时间\t"<<"结束时间\t"<<"周转时间\t"<<"带权周转时间\t"<<endl;
    for(int i=1; i<=n; i++)
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<setw(8)<<process[i].pname<<"\t"<<setw(8)<<process[i].priority<<"\t"<<setw(8)<<process[i].servetime<<"\t"<<setw(8)<<process[i].arrivetime<<"\t"<<setw(8)<<process[i].endtime<<"\t"<<setw(8)<<process[i].cycletime<<"\t"<<setw(10)<<process[i].withheightcycletime<<endl;
    }
}
void PRIORITYWEIGHT_PRO()
{
    cout<<"请输入进程的数量"<<endl;
    int n;
    cin>>n;
    input(n);
    sort(process+1,process+n+1,cmp);
    run(n);
    print(n);
}

int main()
{
    PRIORITYWEIGHT_PRO();
    return 0;
}

5.时间片轮转调度(RR)

#include <bits/stdc++.h>

using namespace std;

const int maxn=1010;

struct node
{

    string pname;

    int id;

    double arrivetime;

    double servetime;

    double starttime;

    double endtime;

    double cycletime;

    double withheightcycletime;

} process[maxn];

bool cmp(const node &a,const node &b)
{
  return a.arrivetime<b.arrivetime;
}
bool endtimecmp(const node &a,const node &b)
{
  return a.endtime<b.endtime;
}

queue<node>que;
int vis[maxn];
void run(int length,int n)
{
    for(int i=1;i<=n;i++)
        process[i].id=i;
    int inque=0;
    memset(vis,0,sizeof(vis));
    int curtime=process[1].arrivetime;
    que.push(process[1]);
    inque++;
    vis[1]=1;
    while(!que.empty())
    {
        while(!que.empty())
        {
            node cur=que.front();
            que.pop();
            if(cur.servetime<=length)
            {
                curtime+=cur.servetime;
                cur.endtime=curtime;
                process[cur.id].endtime=curtime;
                for(int i=inque+1;i<=n;i++)
                {
                    if(process[i].arrivetime<=curtime&&!vis[i])
                    {
                        que.push(process[i]);
                        vis[i]=1;
                        inque++;
                    }
                }
            }
            else
            {
                curtime+=length;
                cur.servetime-=length;
                for(int i=inque+1;i<=n;i++)
                {
                    if(process[i].arrivetime<=curtime&&!vis[i])
                    {
                        que.push(process[i]);
                        vis[i]=1;
                        inque++;
                    }
                }
                que.push(cur);
            }
        }
        if(que.empty())
        {
            for(int i=inque+1;i<=n;i++)
            {
                if(!vis[i])
                {
                    que.push(process[i]);
                    inque++;
                    vis[i]=1;
                    curtime=process[i].arrivetime;
                    break;
                }
            }
        }
    }

    for(int i=1;i<=n;i++)
    {
        process[i].cycletime=process[i].endtime-process[i].arrivetime;
        process[i].withheightcycletime=process[i].cycletime/process[i].servetime;
    }
}
void input(int n)
{

    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个进程的名称、到达时间和服务时间"<<endl;
        cin>>process[i].pname>>process[i].arrivetime>>process[i].servetime;
        process[i].cycletime=0;
        process[i].endtime;
        process[i].starttime;
        process[i].withheightcycletime;

    }
}
void print(int n)
{
    sort(process+1,process+n+1,endtimecmp);
    cout<<"进程执行顺序"<<endl;
    for(int i=1; i<=n; i++)
    {
        if(i==1)
            cout<<process[i].pname;
        else
            cout<<"->"<<process[i].pname;
    }
    cout<<endl;
    cout<<"进程名称\t"<<"服务时间\t"<<"到达时间\t"<<"结束时间\t"<<"周转时间\t"<<"带权周转时间\t"<<endl;
    for(int i=1; i<=n; i++)
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<setw(8)<<process[i].pname<<"\t"<<setw(8)<<process[i].servetime<<"\t"<<setw(8)<<process[i].arrivetime<<"\t"<<setw(8)<<process[i].endtime<<"\t"<<setw(8)<<process[i].cycletime<<"\t"<<setw(10)<<process[i].withheightcycletime<<endl;
    }
}
void RR_PRO()
{
    cout<<"请输入进程的数量"<<endl;
    int n;
    cin>>n;
    int length;
    cout<<"请输入时间片长度"<<endl;
    cin>>length;
    input(n);
    sort(process+1,process+n+1,cmp);
    run(length,n);
    print(n);
}

int main()
{
    RR_PRO();
    return 0;
}

//5
//A 0 4
//B 1 3
//C 2 5
//D 3 2
//E 4 4

运行实例

1.先到先服务调度(FCFS)

  

2最短作业优先调度(SJF)

3高响应比优先调度(HRRN)

4(抢占式)优先权调度

5时间片轮转调度(RR)

 

 

 

 

 

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值