最短作业优先调度算法(SJF算法)的C++实现

原创 2016年08月29日 15:23:00

题目要求:

在作业调度中,该算法每次从后备作业队列中挑选估计服务时间最短的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。与在进程调度中的原理类似。假设有n项作业位于就绪队列中,这些作业的请求时间用数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(也称持续时间)用数组durations存储。当每个作业被完成后,接下来优先选择服务时间(持续时间)短的,如果多个服务时间一样,则优先选择请求时间最先的。采用SJF算法,计算n项作业的平均等待时间。所有要执行的任务的请求时间必须在上一个任务完成的时间内。假设0<= n <= 100。


测试用例:

requestTimes = {0, 2, 4, 5};

durations = {7, 4, 1, 4};

可以理解为一定首先执行第一个任务,请求时间为0,执行了7个时间单位;

接下来在服务时间最短的中选择,显然是任务3,请求时间为4,执行1个时间单位;

再接下来发现2和4这两个任务服务时间一样短,则优先选择请求时间最先的,显然是选择任务2,执行4个时间单位

最后是任务4(并且只有任务4了),请求时间为5,执行4个时间单位

等待时间:任务1是0,任务3是3,任务2是5,任务4是7,所以平均等待时间是4。


int findmin_duration(vector<int> &a,int *b,int end_time, int n)
{
	int min = INT_MAX;
	int pos = 0;
	for (int i = 1; i < n; i++)
	{
		if (a[i] < min && b[i] <= end_time)
		{
			min = a[i];
			pos = i;
		}
	}
	a[pos] = INT_MAX;
	return pos;
}

float average_wait_time(int *requestTimes, int *durations, int n)
{
	vector<int> durate(n,0);
	vector<int> startTime(n, 0);
	vector<int> endTime(n, 0);
	vector<int> waitTime(n, 0);
	int i;
	for (i = 0; i < n; i++)
		durate[i] = durations[i];
	startTime[0] = requestTimes[0];
	endTime[0] = durations[0] + startTime[0];
	waitTime[0] = startTime[0] - requestTimes[0];
	int minIndex = 0;
	int lastIndex = minIndex;
	for (i = 1; i < n; i++)
	{
		minIndex = findmin_duration(durate, requestTimes, endTime[lastIndex], n);
		startTime[minIndex] =  endTime[lastIndex];
		endTime[minIndex] = durations[minIndex] + startTime[minIndex];
		waitTime[minIndex] = startTime[minIndex] - requestTimes[minIndex];
		lastIndex = minIndex;
	}

	int s = 0;
	for (i = 0; i < n; i++)
		s += waitTime[i];
	float avageTime = (float)s / (float)n;
	return avageTime;
}
int main(int argc, char* argv[])
{
	int requestTimes[4] = { 0, 1, 3, 9 };
	int durations[4] = { 2, 1, 7, 5 };
	//int requestTimes[] = { 0, 2, 4, 5 };
	//int durations[] = { 7, 4, 1, 4 };
	cout << average_wait_time(requestTimes, durations, 4) << endl;
	getchar();
	return 0;
}


版权声明:本文为EbowTang原创文章,后续可能继续更新本文。如果转载,请务必复制本文末尾的信息!

操作系统进程调度算法——短作业优先算法c语言源代码

  • 2010年11月19日 13:44
  • 4KB
  • 下载

c++经典算法思想

贪婪算法(greedy method)中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(greedy c...
  • ghevinn
  • ghevinn
  • 2012年08月28日 10:30
  • 1969

任务分配问题

任务分配问题是在加权二分图中寻找最大(或最小)加权匹配的问题。 目录   [隐藏]  1 详述2 举例3 算法4 参看 详述[编辑] 分为以下几类...
  • u012116229
  • u012116229
  • 2015年03月11日 21:32
  • 1707

蚁群算法求解分布式系统任务分配问题

  • 2012年11月08日 15:40
  • 112KB
  • 下载

算法设计与分析——任务分配问题

【问题描述】假设有n个任务需要分配给n个人执行,每个人只执行一个任务,每个任务只由一个人执行。第i个人执行第j个任务的成本是Cij(1...
  • qq_28666193
  • qq_28666193
  • 2016年11月26日 16:01
  • 2905

贪心算法实例(一):多任务分配问题

贪心算法多任务分配
  • u012845311
  • u012845311
  • 2017年06月17日 09:37
  • 649

分支界限法 任务分配问题

2.5.1题目描述 分配问题要求将n个任务分配给n给人,每个人完成任务的代价不同,要求分配的结果最优,此题可以使用回溯求解。 2.5.2程序使用说明 Java环境1.8.0_111 IDE:eclip...
  • mymy_blog
  • mymy_blog
  • 2017年01月19日 21:45
  • 1608

最短作业优先算法

 public class Job { private String name = ""; private String inTime = ""; private int maybeRunTime =...
  • JaunLee
  • JaunLee
  • 2007年09月28日 18:00
  • 5481

短作业优先调度算法

短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。 短作业优先调...
  • WOSHIWANGLIHONGA
  • WOSHIWANGLIHONGA
  • 2016年07月11日 19:07
  • 4712

操作系统-------进程调度算法(C++实现)

(1)    优先数法 进程就绪队列按优先数大小从高到低排列,链首进程首先投入运行。进程每执行一次,进程需要的时间片数减1、该进程的优先数减3。这样,该进程如果在一个时间片中没有完成,其优先数降低一级...
  • M_GSir
  • M_GSir
  • 2016年11月10日 22:45
  • 2943
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最短作业优先调度算法(SJF算法)的C++实现
举报原因:
原因补充:

(最多只允许输入30个字)