java 进程先来先服务代码,java操作系统进程调度模拟-------先来先服务

通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。

github下载地址:https://github.com/musuixin/Operating-system-process-simulation

流程图:

9a1cfc5fee82525aa75706cb0d5892b4.png

/**

* 功能描述:PCB的父类,包含PCB的主要信息,以及方法。

* @date 2018.11.5

* @version 2.0

*/

class PCB {

int id;

String pname;

int daodatime;

int fuwutime;

int runtime=0;

String state="w";

int priority=0;

int startblock;

int blocktime;

PCB(){

}

/**

* 功能描述:用于非优先权进程调度的PCB构造函数,不包含优先权的构造,默认其为0

*/

PCB(int id,String pname, int daodatime, int fuwutime,int startblock,int blocktime) {

this.id=id;

this.pname = pname;

this.daodatime = daodatime;

this.fuwutime = fuwutime;

this.startblock=startblock;

this.blocktime=blocktime;

}

/**

* 功能描述:用于优先权调度的构造函数。

*/

PCB(int id,String pname, int daodatime, int fuwutime,int priority,int startblock,int blocktime) {

this.id=id;

this.pname = pname;

this.daodatime = daodatime;

this.startblock=startblock;

this.blocktime=blocktime;

this.fuwutime = fuwutime;

this.priority = priority;

}

/**

* @return PCB原始信息

*/

String information(){

return id+"\t\t\t"+pname+"\t\t\t"+daodatime+"\t\t\t"+priority+"\t\t\t"+fuwutime+"\t\t\t\t"+startblock+"\t\t\t\t\t"+blocktime;

}

/**

* @return PCB当前信息

*/

String messages(){

return id+"\t\t\t"+pname+"\t\t\t"+runtime+"\t\t\t"+priority+"\t\t\t"+state;

}

}

import java.util.LinkedList;

import java.util.Scanner;

/***

* 功能描述:继承父类PCB,实现接口Comparable,先来先服务PCB

* @date 2018.11.05

* @version 2.0

*/

class FcFcPCB extends PCB implements Comparable{

FcFcPCB(int id,String pname, int daodatime, int fuwutime,int startblock,int blocktime) {

super(id,pname,daodatime,fuwutime,startblock,blocktime);

this.id=id;

this.pname = pname;

this.daodatime = daodatime;

this.fuwutime = fuwutime;

}

/**

* 功能描述 : 按到达时间进行排序

* @date 2018.11.05

*/

@Override

public int compareTo(Object o) {

FcFcPCB st=(FcFcPCB)o;

return this.daodatime-st.daodatime;

}

}

public class FcFs {

public static void main(String[] args){

System.out.println("+++++++++++++++++++++++++++++++++++++++++++++先来先服务+++++++++++++++++++++++++++++++++++++++++++");

Scanner input = new Scanner(System.in);

LinkedList fcFcPCBS= new LinkedList<>();

//用于存放录入的进程

LinkedList block=new LinkedList<>();

//堵塞队列

LinkedList beReadyPCB = new LinkedList<>();

//就绪队列

LinkedList strings=new LinkedList<>();

//结束队列

while (true) {

//循环录入进程信息

System.out.println("请依次输入进程ID,进程名,到达时间,服务时间,运行n时间后进入堵塞队列的时间,堵塞时间");

try {

int id = input.nextInt();

String pname = input.next();

int dadatime = input.nextInt();

int fuwutime = input.nextInt();

int startblock=input.nextInt();

int blocktime=input.nextInt();

fcFcPCBS.add(new FcFcPCB(id,pname, dadatime, fuwutime,startblock,blocktime));

System.out.println("是否继续?(1继续,0结束)");

int i = input.nextInt();

if (i == 0) {

fcFcPCBS.sort(FcFcPCB::compareTo);

break;

}

}

catch (Exception e){

System.out.println("输入有误!程序非正常运行!请程序运行程序");

break;

}

}

//显示进程运行之前的信息

System.out.println("*******************************************进程运行初信息************************************************");

System.out.println("*\t\t进程ID\t进程名\t\t到达时间\t\t优先权\t\t服务时间\t\tnS进行后堵塞\t\t堵塞时间\t*");

for(int i=0;i

System.out.println("*\t\t"+fcFcPCBS.get(i).information()+"\t\t\t*");

}

System.out.println("*********************************************************************************************************");

int runslice=0;

//定义时间片

/**

* 每次进入循环之前进行检测

* 符合3个条件:

* 1.存放队列不为空

* 2.就绪队列不为空

* 3.堵塞队列不为空

* 若3个队列都为空,则说明进程完全运行完毕,结束循环

* @date 2018.11.8

*/

while (!fcFcPCBS.isEmpty()||!beReadyPCB.isEmpty()||!block.isEmpty()){

//退出循环的条件为:进程队列与循环队列都为空

runslice++;

System.out.println("*******************时间切片为:" + runslice+"*************************");

while (!fcFcPCBS.isEmpty()&&fcFcPCBS.get(0).daodatime<=runslice){

beReadyPCB.add(fcFcPCBS.get(0));

fcFcPCBS.remove(0);

}

/**

* @date 2018.11.8

* 堵塞队列不为空进入

* 首先把堵塞时间结束的进程转为就绪,继续运行

* 输出 堵塞队列中的进程

*/

if(!block.isEmpty()){

for(int i=0;i

if(block.get(i).blocktime<=0){

System.out.print("时间初从堵塞队列转入就绪队列的进程有:");

System.out.print(block.get(i).pname);

beReadyPCB.add(block.get(i));

block.remove(i);

}

}

System.out.println();

if(!block.isEmpty()){

System.out.print("进入堵塞队列的进程有:");

for(int i=0;i

System.out.print(block.get(i).pname+" ");

}

}

System.out.println();

for(int i=0;i

block.get(i).blocktime--;

}

}

if(beReadyPCB.isEmpty()){

System.out.println("当前没有程序运行");

}

if(!beReadyPCB.isEmpty()){

//就绪队列不为空,有程序运行 ,对首进程将为正在运行的进程

beReadyPCB.sort(FcFcPCB::compareTo);

System.out.println("当前正在进行的进程为:");

System.out.println("进程ID\t进程名\t\t运行时间\t\t优先权\t\t状态");

beReadyPCB.get(0).runtime++;

beReadyPCB.get(0).startblock--;

beReadyPCB.get(0).state = "r";

System.out.println(beReadyPCB.get(0).messages());

if(beReadyPCB.size()!=1) {

//显示非队首进程信息

System.out.println("进入就绪队列的进程为:");

System.out.println("进程ID\t进程名\t\t运行时间\t\t优先权\t\t状态");

for (int i = 1; i < beReadyPCB.size(); i++) {

beReadyPCB.get(i).state="w";

System.out.println(beReadyPCB.get(i).messages());

}

}

if (beReadyPCB.get(0).runtime == beReadyPCB.get(0).fuwutime||beReadyPCB.get(0).startblock==0) {

//若进程结束或者进程将进行堵塞,则进行处理

if(beReadyPCB.get(0).runtime == beReadyPCB.get(0).fuwutime) {

//进程结束,存入结束队列,删除在就绪队列中的信息

strings.add(beReadyPCB.get(0).pname);

beReadyPCB.remove(0);

}

if(!beReadyPCB.isEmpty()&&beReadyPCB.get(0).startblock==0&&beReadyPCB.get(0).blocktime!=0){

//进程堵塞,存入堵塞队列,删除在就绪队列中的信息

block.add(beReadyPCB.get(0));

beReadyPCB.remove(0);

}

}

}

if (strings.size()!=0){

//显示已经结束的进程信息

System.out.print("时间末结束的进程有:");

for(String s:strings){

System.out.print(s.toString()+" ");

}

System.out.println();

}

}

}

}

结果,显示各个时间片的运行情况:

5e4fb94c974186494d5302d728ad9f1f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值