os的进程调度算法(抄袭的)
package me.letterwish.test; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.DecimalFormat;
import java.util.Scanner; //先来先服务FCFS和短作业优先SJF进程调度算法
public class FJFS_SJF {
// 允许的最大进程数
public static int MaxNum = 100;
// 真正的进程数
public static int realNum;
// 当前时间
public static int NowTime;
// 各进程的达到时间
public static int ArrivalTime[] = new int[MaxNum];
// 各进程的服务时间
public static int ServiceTime[] = new int[MaxNum];
// 各进程的服务时间(用于SJF中的临时数组)
public static int ServiceTime_SJF[] = new int[MaxNum];
// 各进程的完成时间
public static int FinishTime[] = new int[MaxNum];
// 各进程的周转时间
public static int WholeTime[] = new int[MaxNum];
// 各进程的带权周转时间
public static double WeightWholeTime[] = new double[MaxNum];
// FCFS和SJF的平均周转时间
public static double AverageWT_FCFS, AverageWT_SJF;
// FCFS和SJF的平均带权周转时间
public static double AverageWWT_FCFS, AverageWWT_SJF;
// FCFS中的周转时间总和
public static int SumWT_FCFS = 0;
// FCFS中的带权周转时间总和
public static double SumWWT_FCFS = 0;
// SJF中的周转时间总和
public static int SumWT_SJF = 0;
// SJF中的带权周转时间总和
public static double SumWWT_SJF = 0;
public static Scanner input; public static void main(String args[]) throws FileNotFoundException {
System.out.println("算法选择:FCFS-“1”,SJF-“2”");
input = new Scanner(System.in);
int choice = input.nextInt(); // 算法选择:FCFS-“1”,选SJF-“2”
// 从文件中输入数据 自己新建文件放到项目的根目录下
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
"test.txt"));
System.setIn(in);
input = new Scanner(System.in); realNum = input.nextInt(); // 真实进程数
for (int i = 0; i < realNum; i++) { // 各进程的到达时间
ArrivalTime[i] = input.nextInt();
}
for (int j = 0; j < realNum; j++) { // 各进程的服务时间
ServiceTime[j] = input.nextInt();
ServiceTime_SJF[j] = ServiceTime[j];
}
// 关闭文件流
input.close(); // 算法选择:1-FCFS,2-SJF;
if (choice == 1) {
FCFS();
System.exit(0);
} else if (choice == 2) {
SJF();
System.exit(0);
} else {
System.out.println("算法选择错误");
System.exit(0);
}
} // 先来先服务FCFS进程调度算法
public static void FCFS() {
// 到达时间的冒泡排序,完成时间随之变动(使先到者排在前面,后到者排在后面)
bubbleSort();
// 计算每个进程的完成时间、周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间
FinishTime[0] = ArrivalTime[0] + ServiceTime[0];
WholeTime[0] = ServiceTime[0]; // 周转时间 = 完成时间 - 到达时间
WeightWholeTime[0] = (double) WholeTime[0] / ServiceTime[0];
// 带权周转时间 = 周转时间 / 服务时间
AverageWT_FCFS = AverageWWT_FCFS = 0; AverageWT_FCFS += WholeTime[0];
AverageWWT_FCFS += WeightWholeTime[0]; for (int j = 1; j < realNum; j++) { // 从第二个进程开始计算完成时间、周转时间、带权周转时间
if (ArrivalTime[j] > FinishTime[j - 1]) { // 该进程不用等待前一个进程就能直接执行
FinishTime[j] = ArrivalTime[j] + ServiceTime[j];
WholeTime[j] = ServiceTime[j];
} else { // 该进程需要等待前一个进程完成才能执行
FinishTime[j] = FinishTime[j - 1] + ServiceTime[j];
WholeTime[j] = FinishTime[j - 1] - ArrivalTime[j]
+ ServiceTime[j];
}
WeightWholeTime[j] = (double) WholeTime[j] / ServiceTime[j];
// 带权周转时间 = 周转时间 / 服务时间
}
for (int i = 0; i < realNum; i++) { // 计算总周转时间、总带权周转时间
SumWT_FCFS = SumWT_FCFS + WholeTime[i];
SumWWT_FCFS = SumWWT_FCFS + WeightWholeTime[i];
}
AverageWT_FCFS = (double) SumWT_FCFS / realNum; // 平均周转时间 = 周转总时间 / 作业个数
AverageWWT_FCFS = (double) SumWWT_FCFS / realNum; // 平均带权周转时间 = 带权周转总时间
// / 作业个数
// 输出每个进程的完成时间、周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间
outPUT(1);
} // 短作业优先SJF进程调度算法
public static void SJF() {
// 到达时间的冒泡排序,完成时间随之变动(使先到者排在前面,后到者排在后面)
bubbleSort(); int min = 0;
NowTime = ArrivalTime[0] + ServiceTime[0];// 计算第一次的NowTIme
FinishTime[0] = ServiceTime[0];// 计算第一个进程的完成时间
ServiceTime_SJF[0] = 1000;// 赋初值
int allin = 0, j, k;
for (int i = 1; i < realNum; i++)// 进入循环,从第二个到达的进程开始
{
if (allin == 0)// 找到已经到达的进程个数
{
for (j = 0; ArrivalTime[j] <= NowTime && j < realNum; j++) {
if (j >= realNum)
allin = 1;
}
} else {
j = realNum;
} j = j - 1;// j是已经到达的进程数(减去已经计算过的第一个进程) min = 0;
k = 1;
while (k <= j)// 从已经到达的进程里找到服务时间最短的进程
{
if (ServiceTime_SJF[k] == 0)// 进程的服务时间如果等于0,则跳过该进程
k++;
else {
if (ServiceTime_SJF[min] > ServiceTime_SJF[k])// 比较,找到服务时间最短的进程
min = k;
k++;
}
}
ServiceTime_SJF[min] = 0;// 找完后置零,便于下一次循环时跳过
NowTime += ServiceTime[min];// 累加当前时间
FinishTime[min] = NowTime;// 完成时间
} for (int i = 0; i < realNum; i++)// 计算周转时间,带权周转时间,总的周转时间和总的带权周转时间
{
WholeTime[i] = FinishTime[i] - ArrivalTime[i];// 周转时间 = 完成时间 - 到达时间
WeightWholeTime[i] = (double) WholeTime[i] / ServiceTime[i];// 带权周转时间
// =
// 周转时间
// /
// 服务时间
SumWT_SJF += WholeTime[i];
SumWWT_SJF += WeightWholeTime[i];
}
AverageWT_SJF = (double) SumWT_SJF / realNum;// 平均周转时间 = 周转总时间 / 作业个数
AverageWWT_SJF = (double) SumWWT_SJF / realNum;// 平均带权周转时间 = 带权周转总时间 /
// 作业个数 // 输出每个进程的完成时间、周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间
outPUT(2);
} // 到达时间的冒泡排序,完成时间随之变动(使先到者排在前面,后到者排在后面)
public static void bubbleSort() {
int temp1 = 0;
int temp2 = 0;
for (int i = 0; i < realNum - 1; i++) {
for (int j = 0; j < realNum - 1; j++) {
if (ArrivalTime[j] > ArrivalTime[j + 1]) {
temp1 = ArrivalTime[j];
temp2 = ServiceTime[j];
ArrivalTime[j] = ArrivalTime[j + 1];
ServiceTime[j] = ServiceTime[j + 1];
ArrivalTime[j + 1] = temp1;
ServiceTime[j + 1] = temp2;
}
}
}
} // 输出每个进程的完成时间、周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间
// a=1:输出FCFS结果 a=2:输出SJF结果
public static void outPUT(int a) {
int k;
DecimalFormat format = new DecimalFormat("#.00");
System.out.print("到达时间 :");
for (k = 0; k < realNum; k++) {
System.out.print(ArrivalTime[k] + " ");
}
System.out.println("");
System.out.print("服务时间 :");
for (k = 0; k < realNum; k++) {
System.out.print(ServiceTime[k] + " ");
}
System.out.println("");
System.out.print("完成时间 :");
for (k = 0; k < realNum; k++) {
System.out.print(FinishTime[k] + " ");
}
System.out.println("");
System.out.print("周转时间 :");
for (k = 0; k < realNum; k++) {
System.out.print(WholeTime[k] + " ");
}
System.out.println("");
System.out.print("带权周转时间:");
for (k = 0; k < realNum; k++) {
System.out.print(format.format(WeightWholeTime[k]) + " ");
}
System.out.println(""); if (a == 1) {
System.out.println("平均周转时间:" + format.format(AverageWT_FCFS));
System.out.println("平均带权周时间:" + format.format(AverageWWT_FCFS));
} else {
System.out.println("平均周转时间 :" + format.format(AverageWT_SJF));
System.out.println("平均带权周转时间:" + format.format(AverageWWT_SJF));
} // 模拟整个调度过程,输出每个时刻的进程运行状态
System.out.println("时刻" + ArrivalTime[0] + ":进程" + 1 + "开始运行");
for (int i = 1; i < realNum; i++)
System.out.println("时刻" + FinishTime[i - 1] + ":进程" + (i + 1)
+ "开始运行");
}
}
test.txt的文件格式
第一行 进程个数
第二行 到达时间
第三行 服务时间

os的进程调度算法(抄袭的)的更多相关文章
- Linux常见的进程调度算法
进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...
- Python::OS 模块 -- 进程参数
os模块的简介请参看 Python::OS 模块 -- 简介 os模块的文件和目录操作 Python::OS 模块 -- 文件和目录操作 os模块的进程管理 Python::OS 模块 -- 进程管理 ...
- Python::OS 模块 -- 进程管理
os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...
- 进程调度算法Linux进程调度算法
这次介绍一下操作系统的进程调度算法 操作系统的调度分为三种:1.远程调度(创建新进程):2.中程调度(交换功能的一部分):3.短程调度(下次执行哪个进程) 这次讲述的就是短程调度,可以简单的看作咱们平 ...
- Linux 常见的进程调度算法
1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以 ...
- 《操作系统_时间片轮转RR进程调度算法》
转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250 时间片轮转RR进程调度算法 一.概念介绍和案例解析时间片轮转法 - 基 ...
- OS之进程管理---进程调度和多线程调度
进程调度基本概念 多道程序的目标就是始终允许某个进程运行以最大化CPU利用率,多个进程通时存在于内存中,操作系统通过进程调度程序按特定的调度算法来调度就绪队列中的进程到CPU,从而最大限度的利用CPU ...
- Linux内核初探 之 进程(三) —— 进程调度算法
一.基本概念 抢占 Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起 非抢占的系统需要进程自己让步(yielding) 进程类型 IO消耗型 经常处于可运行态,等待IO操作过程会阻塞 ...
- x01.os.9: 进程切换
进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStac ...
随机推荐
- trycatch中return语句如何执行
测试代码如下: package reviewTest; /** * @ClassName: ReturnTest * @Description: 测试return在trycatch中的执行 * @au ...
- HTML5本地存储——Web SQL Database与indexedDB
虽然在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数 ...
- 【codeforces 508B】Anton and currency you all know
[题目链接]:http://codeforces.com/contest/508/problem/B [题意] 给你一个奇数; 让你交换一次数字; 使得这个数字变成偶数; 要求偶数要最大; [题解] ...
- 【codeforces 509A】Maximum in Table
[题目链接]:http://codeforces.com/contest/509/problem/A [题意] 给你一个递推式f[i][j] = f[i-1][j]+f[i][j-1]; 让你求f[i ...
- 【BestCoder Round #93 1001】MG loves gold
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6019 [题意] 每次选择一段连续的段,使得这一段里面没有重复的元素; 问你最少选多少次; [题解] ...
- 重庆OI2017 小 Q 的棋盘
小 Q 的棋盘 时间限制: 1 Sec 内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移 ...
- PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数
PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...
- HyperLedger项目以及社区
本文不涉及任何技术开发的内容,仅供你跟同学.同事吹牛B之用.就像很多牛人总爱讲历史典故一样. 一.诞生与现状 HyperLedger 诞生于2015年12月17日,HyperLedger 追寻Apac ...
- SRPING MVC基本配置
作下记录,WEB.XML的配置及DispatcherServlet-context.xml的配置. 而后者的配置,有不同的形式,不要被迷惑. WEB.XML <servlet> <s ...
- [jdoj1258]野生动物园(change by panxf)_权值线段树_组合数
人品计算 题目大意:n个数的a序列,m组询问.每次询问给出T,A,B,K.求在a序列的[A,B]的位置之内的K小值P,的$C_{T}^{P \% T} \% 10111$. 注释:每组询问保证区间只相 ...