短作业优先SJF

SJF调度算法:

       短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
      为了和FCFS调度算法进行比较,我们仍利用FCFS算法中所使用的实例,并改用SJ(P)F算法重新调度,再进行性能分析。由上图中的(a)和(b)可以看出,采用SJ(P)F算法后,不论是平均周转时间还是平均带权周转时间,都有较明显的改善,尤其是对短作业D,其周转时间由原来的(用FCFS算法时)11降为3;而平均带权周转时间是从5.5降到1.5。这说明SJF调度算法能有效地降低作业的平均等待时间,提高系统吞吐量。
  SJ(P)F调度算法也存在不容忽视的缺点:

  1.     该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。
  2.     该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。
  3.     由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

参考与:https://blog.csdn.net/houchaoqun_xmu/article/details/55539362
代码

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<queue>
#include<list>
#include<thread>
#include<mutex>
#include<Windows.h>
using namespace std;
#define MAX_TIME 99999
int g_time = 0;
mutex g_mutex_time;



struct process_node
{
	int prcess_id;  //进程编号
	int _start;  //进入时间
	void(*main_doing)(int args, char *ptr_argv[]);//本进程完成的任务
	int begin;   //开始时间
	int finish;  //完成时间
	int _function; //需要运行时间
	int function; //已经运行的时间
	bool complete;	 //是否完成   true 完成
};

list<process_node*>q_list;//进程队列


void showlist()
{

	for (auto ib = q_list.begin(); ib != q_list.end(); ib++)
	{
		cout << (*ib)->prcess_id << "    ";
	}
	cout << "\n";

}
void main_doing(int args, char *ptr_argv[])
{
	cout << args << "这是一个运行的实例" << endl;
	Sleep(200);
}

void Come_Init_Prcess(void(*main_doing)(int args, char *ptr_argv[]),  int _function) //模拟进程到来并且初始化
{
	static int id = 0;
	process_node *p = new process_node;
	p->prcess_id = ++id;
	p->_start = g_time;
	p->main_doing = main_doing;
	p->_function = _function;
	p->begin = MAX_TIME;
	p->finish = MAX_TIME;
	p->function = 0;
	p->complete = false;
	q_list.push_back(p);
}
void Time_End_Work(process_node & current_process)//时间片结束的前的工作
{
	if (current_process.function >= current_process._function)//判断是否完成
	{
		current_process.complete = true;
		current_process.finish = g_time;
		cout << "进程" << current_process.prcess_id << "完成任务" << endl;
		q_list.remove(&current_process);
	}
}
void One_End_Process(process_node & current_process)
{
	int current_point = g_time;
	cout << "当前时间" << current_point << endl;
	while (current_point + current_process._function >= g_time)
	{
		current_process.main_doing(current_process.prcess_id, NULL);
	}
	current_process.function += g_time - current_point;
	Time_End_Work(current_process);
}
process_node& Obtain_Obtain()//获取优先者
{
	int temp = 9999;
	process_node *p_temp = nullptr;
	while (q_list.size() == 0);
	for (auto ib = q_list.begin(); ib != q_list.end(); ib++)
	{
		if ((*ib)->_function - (*ib)->function < temp)
		{
			temp = (*ib)->_function - (*ib)->function;
			p_temp = (*ib);
		}
	}

	cout << "优先的是程序" << p_temp->prcess_id << endl;
	p_temp->begin = g_time;
	return *p_temp;
}
void Run_begin()
{

	while (1)
	{
		process_node &p_temp = Obtain_Obtain();
		showlist();
		One_End_Process(p_temp);
	}
}
//时间实例到达
void pthread_model()
{
	time_t ts;
	srand((unsigned int)time(&ts));
	while (1)
	{
		int x_temp = 0;
		lock_guard<mutex>ldg(g_mutex_time);
		cout <<"时间:["<<g_time<<"]" << endl;
		if (g_time%2==0)
		{
			while (1)
			{
				x_temp = rand() % 5;
				if (x_temp > 0)
				{
					break;
				}
			}
			Come_Init_Prcess(main_doing, x_temp);
			cout << "实例到达" << endl;
		}
		Sleep(1000);
		g_time++;
	}

}

int main()
{
	thread th_model(pthread_model);
	thread th_main(Run_begin);
	th_model.join();
	th_main.join();

	cin.get();

}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 先来先服务(FCFS)进程调度算法是一种简单的调度算法,按照进程到达的先后顺序进行调度。即先到达的进程先执行,后到达的进程后执行。这种算法的优点是简单易懂,缺点是可能会出现长作业等待时间过长的情况。 作业优先SJF)进程调度算法是一种根据进程执行时间长来进行调度的算法。即执行时间的进程先执行,执行时间长的进程后执行。这种算法的优点是可以减少长作业等待时间,缺点是可能会出现作业饥饿的情况。 ### 回答2: 进程调度算法是计算机操作系统中非常重要的一部分,FCFS(先来先服务)和SJF作业优先)是其中比较常见的两种算法。下面将分别对两种算法进行介绍及比较。 FCFS算法:先来先服务,即按照进入就绪队列的顺序,先进入队列的进程先被执行。该算法的优点是简单易懂,不需要对进程的属性进行过多的分析。但是,该算法存在一个致命的弊端:无法处理作业和长作业混杂的情况,因为如果遇到一个长作业作业就会被迫等待很长时间,导致系统的响应速度变慢。 SJF算法:作业优先,即在就绪队列中,选择最作业先执行。该算法的优点是可以尽可能地提高系统的响应速度,保证作业更快地完成。但是该算法也存在一些缺点:由于进程的执行时间不确定,因此难以做出一个准确的预测,如果预测错误,可能会出现长时间的等待,导致系统效率降低。 两种算法的比较:FCFS算法最大的优点是简单易懂,没有太多的计算复杂度,但是对于作业和长作业混杂的情况,无法满足系统性能的要求。而SJF算法虽然能够提高系统的响应速度,并且对于作业友好,但也存在预测困难的问题,也会产生等待的情况。因此,需要根据具体的情况选择适合的算法,如果作业的执行时间能够事先预测,SJF算法是一个很好的选择,否则则可以选择FCFS算法。但是在实际应用中,为了更好地提高系统的性能,一般会采用优先级调度算法,根据进程的属性进行优先级的排序,以此来保证更加合理的进程调度顺序。同时,还可以采用时间片轮转的方法,将长作业进行切割,让多个进程共享CPU,提高系统的处理能力。 ### 回答3: 先来先服务(FCFS)是一种最简单的调度算法,也被称为先到先服务或先进先出。该算法的基本原理是按照进程到达的顺序进行调度,即先到来的进程先执行,后到达的进程后执行。FCFS算法适用于进程执行时间相同时,优先级相同的情况。由于该算法的简单性,一般只有在任务队列中的进程个数固定且任务时间相等时才使用。但是,FCFS算法的显著缺陷是无法解决作业等待长作业的问题,因此在实际应用中,FCFS算法很少使用。 作业优先SJF)是一种比FCFS算法更为高效的调度算法,也被称为最作业优先。该算法的基本原理是按照进程需要执行的时间的长来进行调度,即先优先选择需要执行时间较的进程,而不是按照它们到达的顺序来进行调度。SJF算法适用于任务队列中的进程的时间不一致的情况。该算法具有高响应度、高效率和低等待时间的优点,能够降低平均等待时间。但是,该算法也存在着一定的问题,如容易出现饥饿现象(即在系统运行的过程中,某些进程始终无法被调度执行)。因此,通常可以将作业优先算法与其他调度算法一起使用,以避免饥饿现象的出现。 总之,先来先服务和作业优先都是进程调度算法中常见的两种,它们各有优缺点,需要根据具体的情况选择合适的算法来保证系统的效率和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值