计算机操作系统进程调度算法(短作业优先)C++实现
进程的短作业优先调度算法使用了C++STL中queue,队列中存当前就绪的进程。
说说遇到的问题,第一次知道了double类型的数不能直接用“==”与 0 比较是否相等,这个问题困了我很长时间。
解决办法:定义一个你觉得精度够了的无穷小的数,需要比较的double类型的数若小于该数,即可认为需要比较的数是 0 了
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const double e=1e-6; //设置一个无穷小的数
class Process //创建进程类
{
public:
char process_name[5]; //进程名
double submit_time; //进程提交时间
double run_time; //进程服务时间
double temp; //介个也是进程的服务时间
double turnover_time; //进程周转时间
double Wi; //进程带权周转时间
};
Process jincheng[99]; //创建全局变量,进程对象数组
void swap(queue<int> q) //将每次运行新进程时就绪队列中服务时间最短的交换到就绪队列的队首
{
int sum=q.size();
int a[99];
double flag1=99.0;
queue<int> q1;
q1=q;
for(int x=0;x<sum;x++)
{
if(flag1>jincheng[q1.front()].temp)
{
flag1=jincheng[q1.front()].temp;
}
q1.pop();
}
for(x=0;x<sum;x++)
{
a[x]=q.front();
q.pop();
}
for(x=0;x<sum;x++)
{
if(flag1==jincheng[a[x]].temp)
{
break;
}
}
q.push(x);
for(x=0;x<sum;x++)
{
if(x!=q.front())
{
q.push(x);
}
}
}
int main()
{
queue<int> q;
int n;
cout<<"请输入进程的数量:"<<endl;
cin>>n;
cout<<"请依次输入每个进程的名字,提交时间,服务时间:(用空格隔开)"<<endl;
for(int i=0;i<n;i++)
{
cin>>jincheng[i].process_name>>jincheng[i].submit_time>>jincheng[i].run_time;
jincheng[i].temp=jincheng[i].run_time;
}
q.push(0);
double max_time=jincheng[0].submit_time;
for(i=0;i<n;i++)
{
max_time+=jincheng[i].temp;
}
for(double j=jincheng[0].submit_time+0.1;j<=max_time;j=j+0.1)
{
for(i=0;i<n;i++)
{
double y=jincheng[i].submit_time;
if(fabs(j-y)<e) //判断每个时间片完后是否有新进程到达
{
q.push(i);
}
}
jincheng[q.front()].run_time=jincheng[q.front()].run_time-0.1;
if(jincheng[q.front()].run_time<e) //判断当前进程是否服务结束
{
jincheng[q.front()].turnover_time=j-jincheng[q.front()].submit_time;
jincheng[q.front()].Wi=jincheng[q.front()].turnover_time*1.0/jincheng[q.front()].temp;
q.pop();
swap(q);
}
}
cout<<"进程名\t"<<"周转时间\t"<<"带权周转时间"<<endl;
for(i=0;i<n;i++)
{
cout<<jincheng[i].process_name<<"\t"<<jincheng[i].turnover_time<<"\t\t"<<jincheng[i].Wi<<endl;
}
return 0;
}