进程调度

本文介绍了一个简单的进程调度算法实现过程,包括进程初始化、进程状态管理、优先级调度及时间片轮转等关键步骤。通过用户交互输入进程参数,并根据优先级和到达时间进行调度。
package com.pcb.dao;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import com.pcb.dao.SortByPriNumber;
import com.pcb.entity.PCB;

/*******************************************************************************
 * 
 * @author Administrator
 * @description 进程调度
 */
public class ProcessScheduling {

	private static List<PCB> pcbList = new LinkedList<PCB>();// 创建进程列表

	// private static List<PCB> pcbQueue=new ArrayList<PCB>();//定义进程队列
	public static void main(String[] args) {
		initPCB();// 初始化进程控制块
		doWithPCB();// 进程处理
	}

	/**
	 * 进程初始化:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等
	 */
	@SuppressWarnings("unchecked")
	public static void initPCB() {

		Scanner io = new Scanner(System.in);

		System.out.println("请输入进程的相关信息:");
		System.out.println("进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态");
		String oper = "n";// 是否继续输入进程
		do {
			PCB pcb = new PCB();// 创建进程实例
			System.out.print("进程名:");
			pcb.setPcbName(io.next());
			System.out.print("优先数:");
			pcb.setPriNumber(io.nextInt());
			// System.out.println("到达时间");
			pcb.setArrivalTime(pcbList.size() + 1);
			System.out.println("需要时间:");
			pcb.setNeedTime(io.nextInt());
			pcb.setUsedTime(0);
			// pcb.setPcbState(1);
			pcb.setPcbState("Wait");
			pcbList.add(pcb);// 把进程实例添加到进程列表中
			System.out.print("是否继续输入进程(y|n)");
			oper = io.next();
		} while (oper.equals("y"));

		System.out.println("进程数:" + pcbList.size() + "个");
		Collections.sort(pcbList, new SortByPriNumber());// 根据优先数排列
		// showPCBList(pcbList);// 显示进程列表信息

	}

	@SuppressWarnings("unchecked")
	public static void doWithPCB() {

		/*
		 * int count = 0;// 就绪状态的进程个数; for (int i = 0; i < pcbList.size(); i++)
		 * { if (pcbList.get(i).getPcbState().equals("Wait")) { count++; } }
		 * 
		 * // 如果就绪队列为空结束进程 if (count == 0) { return; }
		 */
		while (pcbList.size() > 0) {

			Collections.sort(pcbList, new SortByPriNumber());// 根据优先数排序
			List<PCB> priNumPcbs = new LinkedList<PCB>();// 优先数相同的进程列表
			showPCBList(pcbList);
			PCB pcb = new PCB();// 创建进程实例
			pcb = pcbList.get(pcbList.size() - 1);// 取出优先数最高的进程
			int priorityNum=pcb.getUsedTime();//优先数
            int arrivalTime=pcb.getArrivalTime();//到达时间
			for (int i = 0; i < pcbList.size() - 1; i++) {
				PCB commonPriPcb = new PCB();// 相同优先数的进程
				commonPriPcb = pcbList.get(i);
				if (priorityNum==commonPriPcb.getPriNumber()) {
					priNumPcbs.add(commonPriPcb);
					Collections.sort(priNumPcbs, new SortByArrivalTime());// 根据到达时间排序(先来先服务)

				}
			}
			if (priNumPcbs.size() != 0) {
				pcb = priNumPcbs.get(0);// 获得优先数相同的到达时间最早的进程
				System.out.println("最早到达的" + pcb.getArrivalTime());
			}

			System.out.println("就绪队列" + pcb.getPcbName() + "进程投入运行");

			pcbList.remove(pcb);// 把进程就绪队列中调入运行
			pcb.setPcbState("Run");// 状态为运行状态
			pcb.setPriNumber(pcb.getPriNumber() - 1);// 优先级减一
			pcb.setUsedTime(pcb.getUsedTime() + 1);// 已用时间增加一个时间片刻
			System.out.println("进程名:" + pcb.getPcbName() + "\t优先数:"
					+ pcb.getPriNumber() + "\t到达时间:" + pcb.getArrivalTime()
					+ "\t需要时间" + pcb.getNeedTime() + "\t状态:"
					+ pcb.getPcbState());
			if (pcb.getUsedTime() != pcb.getNeedTime()) {// 如果运行进程已占用时间达到需要时间,不撤销该进程
				pcb.setPcbState("Wait");
				pcb.setArrivalTime(pcbList.size() + 1);// 到达时间
				pcbList.add(pcb);// 把该进程重新调入就绪队列

			}

		}

	}

	/**
	 * 显示进程列表信息
	 * 
	 * @param pcbList
	 */
	public static void showPCBList(List<PCB> pcbList) {
		System.out
				.println("--------------------------------------------------------------------------------");
		System.out.println("进程名\t\t优先数\t\t到达时间\t\t需要时间\t\t状态");
		/*
		 * 循环访问进程列表
		 */
		for (PCB p : pcbList) {
			System.out.println(p.getPcbName() + "\t\t" + p.getPriNumber()
					+ "\t\t" + p.getArrivalTime() + "\t\t" + p.getNeedTime()
					+ "\t\t" + p.getPcbState());
		}
		System.out.println();
	}
}

package com.pcb.dao;

import java.util.Comparator;

import com.pcb.entity.PCB;

public class Sort implements Comparator<Object> {
	public int compare(Object ob1, Object ob2) {
		PCB pcb1 = (PCB) ob1;
		PCB pcb2 = (PCB) ob2;
		if (pcb1.getPriNumber() > pcb2.getPriNumber()) {
			return 1;
		} else if (pcb1.getPriNumber() == pcb2.getPriNumber()) {
			if (pcb1.getArrivalTime() > pcb2.getArrivalTime()) {
				return 1;
			} else {
				return 0;
			}

		} else {
			return 0;
		}
	}

}

package com.pcb.entity;
import java.io.Serializable;

/***
 * 
 * @version 1.0
 * @author YYH
 * @description 进程控制块类    Process scheduling
 * 进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
 */
public class PCB implements Serializable {

	
	private static final long serialVersionUID = -4551627274875247089L;
	
	/**
	 * 进程名
	 */
	private String pcbName;
	public String getPcbName() {
		return pcbName;
	}
	public void setPcbName(String pcbName) {
		this.pcbName = pcbName;
	}
	
	/***
	 * priorityNumber优先数
	 */
	private int priNumber;
	public int getPriNumber() {
		return priNumber;
	}
	public void setPriNumber(int priNumber) {
		this.priNumber = priNumber;
	}
	
	/**
	 * 到达时间
	 */
	private int arrivalTime;
	public int getArrivalTime() {
		return arrivalTime;
	}
	public void setArrivalTime(int arrivalTime) {
		this.arrivalTime = arrivalTime;
	}
	
	/**
	 * 需要运行时间
	 */
	private int needTime;
	public int getNeedTime() {
		return needTime;
	}
	public void setNeedTime(int needTime) {
		this.needTime = needTime;
	}
	
	/**
	 * 已用时间
	 */
	private int usedTime;
	public int getUsedTime() {
		return usedTime;
	}
	public void setUsedTime(int usedTime) {
		this.usedTime = usedTime;
	}
	
	/**
	 * 进程状态 1:表示就绪状态  2:表示运行状态    3:表示完成状态
	 
	private int pcbState;
	public int getPcbState() {
		return pcbState;
	}
	public void setPcbState(int pcbState) {
		this.pcbState = pcbState;
	}
	*/
	/*
	 * 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
	 */
	private String pcbState;
	public String getPcbState() {
		return pcbState;
	}
	public void setPcbState(String pcbState) {
		this.pcbState = pcbState;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值