进程调度算法(短作业优先)

计算机操作系统进程调度算法(短作业优先)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;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值