需求分析
分别实现先到先服务调度(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)