题目描述:
某多处理器多道批处理系统一次允许将所有作业调入内存,且能并行执行,其并行数等于处理机个数。该系统采用SJF的调度方式(最短作业优先,系统在调度时,总是优先调度执行处理时间最短的作业)。
现给定处理器个数m,作业数n,每个作业的处理时间分别为t1,t2...tn。
当n>m时,首先处理时间短的m个作业进入处理器处理,其他的进入等待,当某个作业处理完成时,依次从等待队列中取处理时间最短的作业进入处理。
求系统处理完所有作业的耗时为多少?
注:不考虑作业切换的消耗。
输入描述:
输入2行,第一行为2个整数(采用空格分隔),分别表示处理器个数m和作业数n;第二行输入n个整数(采用空格分隔),表示每个作业的处理时长t1,t2...tn。
0<m,n<100,0<t1,t2...tn<100。
输出描述:
输出处理总时长
示例1:
输入
3 5
8 4 3 1 10
输出
13
#include<iostream>
using namespace std;
//搜索就绪队列中时长最短的作业
int timeMin(int* time,int n){
int min=time[0];
int k=0;
for(int i=0;i<n;i++)
if(min>time[i]) {k=i; min=time[i];}
time[k]=100;//被处理的作业通过修改时长表示已被处理
return min;
}
//搜索就绪队列中时长最长作业
int timeMax(int* time,int n){
int max=time[0];
for(int i=0;i<n;i++)
if(max<time[i]) max=time[i];
return max;
}
//多cpu多道批处理模拟
int processingTime(int m,int n,int* time){
int count=n;
if(count==0) return 0;//作业数为0,返回总时间0
//作业数大于cpu数
if(n>m){
int flag[m][2]={0};//第一行标志cpu是否被占用,第二行显示作业当前运行所需时间
int resultTime=0;//多道多cpu下完成所有作业所需的处理时间
int end=0;//作业全部处理结束的标志
while(end!=1){
//处理时间+1后循环扫描cpu状态
for(int i=0;i<m&&count>0;i++){
//仍有等待的作业并且有空闲的cpu,则当前cpu对作业进行处理
if(flag[i][0]==0){
flag[i][0]=1;
flag[i][1]=timeMin(time,n);//短作业优先
count--;//作业数-1
}
}
//判断是否所有cpu均空闲
int flagK=0;//标志flagK记录当前空闲的cpu数
for(int i=0;i<m;i++)
if(flag[i][1]==0) flagK++;
if(flagK==m) {end=1; continue;}//cpu均空闲,结束的标志置1
//对cpu状态数组的处理
for(int i=0;i<m;i++){
//若当前作业没有处理完,当前作业还需要的处理时间-1
if(flag[i][1]>0) flag[i][1]--;
//如果当前cpu空闲,将cpu标志位置0
if(flag[i][1]==0) flag[i][0]=0;
}
resultTime++;//处理时间增加一个单位
}
return resultTime;
}
//作业数小于或等于cpu数,完成所有作业所需时间为最长作业时间
else return timeMax(time,n);
}
int main(){
int m;//处理机数
int n;//作业数
int time[100];//作业队列
cin>>m>>n;
for(int i=0;i<n;i++) cin>>time[i];
cout<<processingTime(m,n,time);
}
运行结果:
第一次写博客,不足之处请大家多多指正!