假设有n项作业位于就绪队列中,这些作业的提交时间用数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(持续时间)用数组durations存储。采用SJF算法,计算n项作业的平均等待时间。当存在多个相同长度的短作业时,按照提交时间的先后顺序进行调度。假设0<= n <= 100。求出所有作业的平均等待时间。

函数原型:void minWaitingTime(int requestTimes[],int durations[],int n)

测试用例:

输入

4
0 2 4 5
7 4 1 4

输出:

4.0

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAX 0x7FFFFFFF void minWaitingTime(int requestTimes[],int durations[],int n)
{
int i,time,j,k;
float res;
int index,arriveTime,indextemp;
int *done = (int *)malloc(sizeof(int) * n); //表示作业是否执行过,1表示执行完毕,0表示未执行
int *wait = (int *)malloc(sizeof(int) * n); //表示等待时间
for(i = ; i < n; ++i){
wait[i] = ;
done[i] = ;
} time = ; //time表示总作业执行时间
for(i = ; i < n; i++){
if(i == ){ //执行第一个作业
time += durations[i];
done[i] = ;
for(j = ; j < n; j++){
if(requestTimes[j] < time)
wait[j] = time - requestTimes[j];
}
}
else{
index = GetMin(durations,done,n);
//判断是否有多个最短作业,如有选择其中先到达的
arriveTime = requestTimes[index];
for(indextemp = index + ; indextemp < n; indextemp++){
if(done[indextemp] == && durations[indextemp] == durations[index] &&
requestTimes[indextemp] < arriveTime)
index = indextemp;
} time += durations[index];
done[index] = ;
//执行选出的最短作业,并更新其它作业的等待时间
for(indextemp = ; indextemp < n && i < n-; indextemp++)
if(done[indextemp] == &&requestTimes[indextemp] < time)
wait[indextemp] = time - requestTimes[indextemp];
}
} res = 0.0;
for(i = ; i < n; i++)
res += wait[i]; printf("%f\n",res / n); }
//每次取出服务时间最短且示执行过的作业
int GetMin(int durations[],int done[],int n)
{
int i,j,min = MAX;
for(i = ; i < n; i++)
if(durations[i] < min && done[i] == ){
min = durations[i];
j = i;
}
return j;
} int main()
{
int requestTimes[];
int durations[];
int i,n;
scanf("%d",&n);
for(i = ; i < n; i++)
scanf("%d",&requestTimes[i]);
for(i = ; i < n; i++)
scanf("%d",&durations[i]); minWaitingTime(requestTimes,durations,n); system("pause");
return ;
}

短作业优先调度算法(SJF)的更多相关文章

  1. 【操作系统】先来先服务和短作业优先算法(C语言实现)

    [操作系统] 先来先服务算法和短作业优先算法实现 介绍: 1.先来先服务 (FCFS: first come first service) 如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列 ...

  2. C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法

    说明 该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程. 运行过程如下: 输入进程个数 输入各个进程的到达事件 输入各个进程的要求服务事件 选择一种调度算法 程序给出调度结果:各进程的 ...

  3. 最短作业优先(SJF)

    1. 最短作业优先: 最短作业优先(SJF)是一种调度任务请求的调度策略.每个任务请求包含有请求时间(即向系统提交的请求的时间)和持续时间(即完成任务所需时间). 当前任务完成后,SJF策略会选择最短 ...

  4. golang模拟动态高优先权优先调度算法

    实验二  动态高优先权优先调度 实验内容 模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下: 设置进程体:进 ...

  5. 0422 Step2-FCFS调度

    一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...

  6. 操作系统常用调度算法(转载https://www.cnblogs.com/kxdblog/p/4798401.html)

    操作系统常用调度算法   在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用.下面介绍几种常用的调度算法. 先来先服务(FCFS)调度算法 ...

  7. OS中常用的调度算法总结 (转)

    http://blog.chinaunix.net/uid-25132162-id-361291.html 一.常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的 ...

  8. OS调度算法常用摘要

    一.常见的批处理作业调度 1.先来先服务调度算法(FCFS):就是依照各个作业进入系统的自然次序来调度作业.这样的调度算法的长处是实现简单,公平. 其缺点是没有考虑到系统中各种资源的综合使用情况,往往 ...

  9. 操作系统也谈"算法"

    前言: 近来在准备校招的笔试面试,复习到操作系统时感觉概念性的东西比较多,不过对于以下的几类算法还是有必要做个小小总结. [作业调度算法] 先来先服务(FCFS, First Come First S ...

随机推荐

  1. 编译osg的一个错误

    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets! 提示找不到CMAKELIST.T ...

  2. HVTableView 分享组

    HVTableView HVTableView是UITableView(带有展开/折叠功能)的子集,可以方便地用在很多app中.开发者可以使用展开/折叠列表而不用为每个单元格创建一个详细的viewCo ...

  3. java 构造方法

    class MyTestClass { public int Value; public boolean equals(MyTestClass obj){ return obj.Value ==thi ...

  4. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  5. cas 在.net 下的单点登录实现及 ,Net Mvc的接入

    最近在研究单点登录,发现用的最广的就是cas了,查了下资料,发现有人写了详细的说明 地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870 ...

  6. C#中用schema验证xml的合法性

    class ValidateXML { public string ErrString = string.Empty; public void ValidationEventCallBack(Obje ...

  7. 修改FastColoredTextBox控件完成选择

    //判断是否是中文        public bool IsChina(char c)        { bool BoolValue = false;            if (Convert ...

  8. Linux 进程退出后自动启动

    /********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系 ...

  9. python的复制,深拷贝和浅拷贝的区别

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

  10. Angularjs中的promise

    promise 是一种用异步方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或抛出的异常.在与远程对象打交道非常有用,可以把它们看成一个远程对象的代理. 要在Angular中创建 ...