复制代码的时候:最好点下图 [cpp] 旁边的那个标签进行复制,不然可能代码编译不了。

在短进程优先算法中需要注意:下一个进程是已经到达且运行时间最短的进程。

输入如下:

4
A   8.00   2.00
B   8.50   0.50
C  9.00   0.10
D  9.50   0.20

输出如下:

C代码:

#include <stdio.h>
#include <stdlib.h>
#define INF 1000000.0struct PCB {char id[10];    // 进程IDdouble reachTime;  // 进程到达的时间double needTime;   // 进程完成需要的时间double startTime;  // 进程开始的时刻double finishTime; // 进程完成的时刻double cTime;      // 进程周转时间double wcTime;     // 进程带权周转时间char state;       // 进程的状态( 设每个进程处于就绪R(ready),完成F(finish)两种状态之一 )
};/* 两种情况:1.在lastTime时刻,选择已经到达且拥有最短运行时间的进程2.在lastTime时刻,没有进程到达,此时选择拥有最早到达时间的进程
*/
int findNext( struct PCB arr[], int length, double lastTime ) {// p是已经到达且拥有最短运行时间的进程的下标// q是没有到达的进程中拥有最早到达时间的进程的下标int i, p, q;double minNeedTime, minReachTime;p = q = -1; minNeedTime = minReachTime = INF;for( i = 0; i < length; i++ ) {if( arr[i].state=='R' ) { // 进程处就绪状态// 第一情况if( arr[i].reachTime<=lastTime && arr[i].needTime<minNeedTime ){ p = i; minNeedTime = arr[i].needTime; }// 第二种情况if( arr[i].reachTime>lastTime && arr[i].reachTime<minReachTime ){ q = i; minReachTime = arr[i].reachTime; }}}// p为-1时,代表在lastTime时刻还没进程到达,此时选择下一个最早到达的进程qif( p != -1 ) return p;return q;
}int main() {int num, i;double lastTime;  // 为上一个进程的完成时间,用来确定当前进程的开始时间struct PCB *arr;printf( "请输入进程数:" );scanf( "%d", &num );arr = (struct PCB*)malloc(num*sizeof(struct PCB));lastTime = INF;  // 最开始lastTime的为第一个作业的reachTime(到达时间)printf( "请依次输入进程ID,进程到达时间,进程运行时间:\n" );for( i = 0; i < num; i++ ) {scanf( "%s%lf%lf", arr[i].id, &arr[i].reachTime, &arr[i].needTime );arr[i].state = 'R';if( lastTime>arr[i].reachTime ) lastTime = arr[i].reachTime;}// sum1为所有进程周转时间之和,sum2为所有进程带权周转时间之和double sum1=0.0, sum2=0.0;for( i = 0; i < num; i++ ) {int p = findNext( arr, num, lastTime ); // 找到下一个将要执行的进程// 两种情况:将要执行的进程可能已经到达,或者还没到达if( arr[p].reachTime<=lastTime ) arr[p].startTime = lastTime;else arr[p].startTime = arr[p].reachTime;// 确定进程的完成时间,周转时间,带权周转时间arr[p].finishTime = arr[p].startTime + arr[p].needTime;arr[p].cTime = arr[p].finishTime - arr[p].reachTime;arr[p].wcTime = arr[p].cTime/arr[p].needTime;arr[p].state = 'F';sum1 += arr[p].cTime;sum2 += arr[p].wcTime;lastTime = arr[p].finishTime; // 更新lastTime}printf( "\n进程  到达时间  运行时间  开始时间  完成时间  周转时间  带权周转时间\n" );for( i = 0; i < num; i++ ) {printf( "%4s  %8.2lf  %8.2lf  ", arr[i].id, arr[i].reachTime, arr[i].needTime );printf( "%8.2lf  %8.2lf  ", arr[i].startTime, arr[i].finishTime );printf( "%8.2lf  %12.2lf\n", arr[i].cTime, arr[i].wcTime );}printf( "平均周转时间: %.3lf\n", sum1/num );printf( "平均带权周转时间: %.3lf\n", sum2/num );return 0;
}

Java代码:

import java.util.Scanner;
import java.util.Arrays;public class Main {// 接口Comparable和类方法Arrays.sort()的配合使用可以使进程按reachTime(到达时间)排序private static class PCB implements Comparable<PCB> {String id;float reachTime;float needTime;float startTime;float finishTime;char state;public int compareTo( PCB b ) {if( reachTime==b.reachTime ) return 0;if( reachTime<b.reachTime ) return -1;return 1;}}private static final float INF = 10000000.0f;/* 两种情况:1.在lastTime时刻,选择已经到达且拥有最短运行时间的进程2.在lastTime时刻,没有进程到达,此时选择拥有最早到达时间的进程*/private static int findNext( PCB[] arr, float lastTime ) {int i, p = -1;float minNeedTime = INF;for( i = 0; i < arr.length; i++ ) {if( arr[i].state=='R' ) {/* 数组arr已经按reachTime排序,当出现arr[i].reachTime>lastTime时,说明在lastTime时刻无进程到达,终止循环.*/if( arr[i].reachTime > lastTime ) break;if( arr[i].needTime < minNeedTime ){ p = i; minNeedTime = arr[i].needTime; }}}if( p != -1 ) return p;return i;}public static void main( String[] args ) {Scanner sc = new Scanner( System.in );System.out.print( "请输入进程数:" );int num = sc.nextInt();PCB[] arr = new PCB[num];System.out.println( "请依次输入进程ID,进程到达时间,进程运行时间:" );for( int i = 0; i < num; i++ ) {arr[i] = new PCB();arr[i].id = sc.next();arr[i].reachTime = sc.nextFloat();arr[i].needTime = sc.nextFloat();arr[i].state = 'R';}Arrays.sort(arr); // 使进程按reachTime(到达时间)排序float lastTime=arr[0].reachTime;for( int i=0; i<num; i++ ) {// 找到下一个将要执行的进程int p = findNext( arr, lastTime );if( arr[p].reachTime<lastTime ) arr[p].startTime = lastTime;else arr[p].startTime = arr[p].reachTime;arr[p].finishTime = arr[p].startTime + arr[p].needTime;arr[p].state = 'F';lastTime = arr[p].finishTime;  // 更新lastTime}float sum1=0.0f, sum2=0.0f;System.out.println( "\n进程  到达时间  运行时间  开始时间  完成时间  周转时间  带权周转时间" );for( PCB jcb : arr ) {System.out.format( "%4s  %8.2f  %8.2f  ", jcb.id, jcb.reachTime, jcb.needTime );System.out.format( "%8.2f  %8.2f  ", jcb.startTime, jcb.finishTime );System.out.format( "%8.2f  ", jcb.finishTime-jcb.reachTime );System.out.format( "%12.2f\n", (jcb.finishTime-jcb.reachTime)/jcb.needTime );sum1 += jcb.finishTime-jcb.reachTime;sum2 += (jcb.finishTime-jcb.reachTime)/jcb.needTime;}System.out.format( "平均周转时间: %.3f\n", (sum1/num) );System.out.format( "平均带权周转时间: %.3f", (sum2/num) );}
}

如果你想实现以下效果:

可以将java代码的第 56- 66行代码换成以下代码:

/* 此时设每个进程处于就绪R(ready),运行E(excecuting),完成F(finish)三种状态之一,并假设起始状态都是就绪状态 ) */
int p = 0, cnt = 0;
for( float time=arr[p].reachTime; cnt<num; time+=0.1 )
{if( arr[p].reachTime<=time && arr[p].state=='R' ){arr[p].startTime = time;  // 记录开始时间arr[p].state = 'E';System.out.format( "在%.2f时刻: ", time );System.out.format( "进程%s开始运行\n", arr[p].id );}else if( time-arr[p].startTime<arr[p].needTime && arr[p].state=='E' ){System.out.format( "在%.2f时刻: ", time );System.out.format( "进程%s正在运行\n", arr[p].id );}else if( time-arr[p].startTime>=arr[p].needTime && arr[p].state=='E' ){arr[p].finishTime = time;  // 记录完成时间arr[p].state = 'F';System.out.format( "在%.2f时刻: ", time );System.out.format( "进程%s完成运行\n\n", arr[p].id );p = findNext( arr, time ); // 找到下一个要执行的进程time -= 0.1;  // 这个很重要,用于结束时刻是否将有进程运行cnt++;        // 已经完成cnt个进程}
}

如果你要实现FCFS(先到先服务算法):

将C的第61行代码换成 int p = i;     将Java代码的第59行代码也换成 int p = i;

即可实现。

短进程优先算法(C,Java实现)相关推荐

  1. 短进程算法c语言,短进程优先算法C语言实现

    短进程优先算法C语言实现 1.本实验实现了短进程优先的进程调度操作,但因为是非抢占式,所以实现起来比较简单. 短进程优先算法是以作业的长短来计算优先级,作业越短,其优先级越高.作业的长短是以作业所要求 ...

  2. 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...

    文章转自公众号"人人都是极客" 但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核 ...

  3. python 短进程优先算法_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  4. 操作系统:Java模拟CPU调度算法(非抢占短进程优先、可抢占优先权调度、多级反馈队列调度)

    本人是个普通学生,写下博客用于自我复习.自我总结. 本人编写算法水平不高,仅供各位参考. 首先,先简述一下各个算法的定义.因为我个人在查阅算法相关信息时,发现这些算法在某种程度上来说,可能会存在一些歧 ...

  5. SJF(短进程优先)调度算法C语言实现

    1.实验目的 (1)掌握进程调度过程: (2)掌握进程调度算法的原理. 2.实验内容及要求 采用SPF调度算法,编写并调试一程序,模拟进程调度过程. 已知进程名.到达时间.需要运行时间,编写程序输出进 ...

  6. 【JAVA操作系统——进程调度】非抢占式短作业优先算法

    测试要求 进程信息如下: 进程 到达时间 服务时间 A 0 3 B 1 6 C 2 4 D 3 9 E 4 1 请输出进程的调度过程,以及系统平均带权周转时间. 代码实现 package com.zj ...

  7. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)

    目录 先来先服务调度算法: 短进程优先调度算法: 两种进程调度算法优缺点 思维导图 程序代码: 先来先服务调度算法: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可 ...

  8. 操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

    先来先服务算法(FCFS) FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度 这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短, 做法是从后备队列中选择几 ...

  9. 非抢占式优先算法例题_非抢占短作业优先算法源代码(C语言)

    #include #include #define MAX 5 //进程数 /*短作业优先算法*/ struct pro { int num; //进程名 int arriveTime; //到达时间 ...

最新文章

  1. python代码示例图形-Python使用matplotlib绘制3D图形(代码示例)
  2. java中map怎么遍历,Java中怎么遍历Map的所有的元素
  3. python精要(82)-wxpython(3)-静态文本控件与状态栏
  4. 再添一所!华中科技大学成立人工智能与自动化学院
  5. 两数相除赋值整数变量(T-SQL)
  6. 95-235-050-源码-task-Flink task之间的数据交换
  7. 道了 14 年歉的扎克伯格,继续犯错的 Facebook
  8. 重庆自考学历计算机应用基础考试,2017年自考计算机应用基础模拟试题1
  9. centos8 开启ftp服务
  10. matlab中esp=1.0e-3,ESP系列杂谈(一): eFuse 简介
  11. XenServer 6.5实战系列之九:Creating a VM Template from a VM Snapshot
  12. 谷歌“Adobe Flash Player已被屏蔽”的解决办法
  13. 计算机的用途英语作文带翻译,关于旅行的英语作文带翻译(通用7篇)
  14. WeAdmin连接资源,相关错误
  15. win10+ASP.NET(VS2019)连接sqlsever数据库
  16. 将qlv格式的视频转成MP4格式的视频
  17. 【PS教程】PS照片做旧的方法,证书换照片教程
  18. INTRODUCING F#
  19. 工信部计算机二级证书有什么用,公务员考试,这三个证书用处大,持证年薪10W+...
  20. Unity 消息推送

热门文章

  1. 自动脚本引流怎么样?脚本引流靠谱吗?
  2. mfc 主窗口 缩小 放大 关闭 按钮
  3. EN 14342木地板产品—CE认证
  4. 读曾仕强的《易经的奥秘》简摘
  5. 2022-2028全球及中国飞行模拟装置行业研究及十四五规划分析报告
  6. 2022年保研面试经验
  7. 电脑我的世界java要什么版本_我的世界配置要求 电脑版要什么样的配置
  8. SlideToShutDown命令实现炫酷的下滑关机
  9. Java学习-类的隐藏机制(封装性)
  10. C++笔试题汇总【转载】