用java实现操作系统进程调度问题pcb.java main.java readyqueue,java blocked.java
package Process;
/*
进程就绪队列:fifo,实现进程调度,处理器从就绪队列选择进程,
是进程从就绪态转为运行态,
数据结构:队列,(用链式存储实现)
只允许在头部删除,在尾部插入
队列:另一种被限制的线性表
数据结构-逻辑结构:线性结构
物理结构:顺序,链式
队列:使用固定的一端插入元素,固定的一段删除元素
只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作
队尾:进行插入操作的一段
队售:进行删除操作的一端
空队列:队列中没有任何的数据元素
*/
public class readyQueue {
private class Node{
//节点n内部类,用于表示链式存储队列中的每个节点
private T data;//节点的数据
private Node next;//保存指向下一个节点的引用
public Node(){}//构造函数,初始化
public Node(T data,Node next){
this.data=data;
this.next=next;
//构造函数,初始化
}
}
/*
就绪队列的属性
*/
private Node front;//保存就绪队列的头节点,即下一个会被处理机调度的进程,
private Node rear;//保存就绪队列的伪结点,即就绪队列中新进来的进程都在这里插入
private int size;//保存目前进程就绪队列中的进程数目
/*
就绪队列的方法
*/
//1创建一个空的进程就绪队列,没有任何进程处于就绪状态
public readyQueue(){
//构造函数,初始化
front=null;
rear=null;
size=0;
}
//2创建一个非空的就绪队列,以一个指定的进程来创建进程就绪队列
public readyQueue(T element){
front=new Node(element,null);
rear=front;
size=1;
}
//3返回目前进程就绪队列中进程的个数,,处于就绪状态进程的个数
public int getSize(){
return size;
}
//4返回进程就绪队列中的最后一个进程,即处于尾部的进程的数据
public T getData(){
return rear.data;
}
//5判断进程就绪队列是否为空
public boolean isEmpty(){
return size==0;
}
//6清空进程就绪队列
public void clear(){
front=null;
rear=null;
size=0;
}
//7将进程就绪队列中的所有进程的信息打印处理
public String toString(){
if(isEmpty())
return "[]";
else{
StringBuilder sb=new StringBuilder("[");
Node current=front;
for(int i=0;i
package Process;
/*
2018/05/23:pcb进程控制块类,操作系统利用进程控制块,实现对进程的调度
*/
public class pcb {
private int id;//进程标识符
private int status;//进程状态(1表示运行态,2表示就绪态,3表示阻塞态)
//保护进程现场信息
private int ax,bx,cx,dx;//通用寄存器ax,bx,cx,dx的内容
private int pc;//程序计数器内容
private int psw;//程序状态字内容
private int next;//下一个pcb的位置
private int execute_time;//进程执行总共需要用的时间
private int arrival_time;//进程目前已经占用处理器的时间
public int getExecute_time() {
return execute_time;
}
public void setExecute_time(int execute_time) {
this.execute_time = execute_time;
}
public int getArrival_time() {
return arrival_time;
}
public void setArrival_time(int arrival_time) {
this.arrival_time = arrival_time;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getAx() {
return ax;
}
public void setAx(int ax) {
this.ax = ax;
}
public int getBx() {
return bx;
}
public void setBx(int bx) {
this.bx = bx;
}
public int getCx() {
return cx;
}
public void setCx(int cx) {
this.cx = cx;
}
public int getDx() {
return dx;
}
public void setDx(int dx) {
this.dx = dx;
}
public int getPc() {
return pc;
}
public void setPc(int pc) {
this.pc = pc;
}
public int getPsw() {
return psw;
}
public void setPsw(int psw) {
this.psw = psw;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
public String toString(){
return "进程信息"+"id:"+id+" status:"+status+" ax:"+ax+" bx:"+bx+" cx:"+cx+" dx:"+dx+" pc:"+pc+" psw:"+psw+" next:"+next+" execute_time:"+execute_time+" arrival_time:"+arrival_time;
}
}
package Process;
import java.util.Scanner;
/*
主函数,实现实验功能
*/
public class Main {
//定义系统参数
public static final int pronum=3;//系统中进程总数,,进程总数不固定,任意,就绪队列阻塞队列用链表实现,依次无所谓
public static final int time=50;//时间片大小
//进程创建函数
public boolean create(){
return true;
}
//进程调度函数
public boolean scheduling(){
return true;
}
//主进程,系统初始化
public static void main(String[] args){
//创建进程就绪对列
readyQueue rq=new readyQueue();
//创建进程阻塞队列
blockedQueue bq=new blockedQueue();
/*
执行流程
1录入进程,为进程保存pcb信息
*/
Scanner sc=new Scanner(System.in);
System.out.println("进程标识信息:请输入进程编号(进程标识符),最多可以创建10个进程");
for(int i=0;i=p0.getArrival_time()){
p0.setStatus(2);
rq.addAtRear(p0);
}
System.out.println("查看就绪队列中现有进程"+rq.toString());
}
System.out.println("就绪队列中进程执行完毕");
System.out.println("查看阻塞队列中现有进程"+bq.toString());
System.out.println("将进程从阻塞队列中移除,转入相应的就绪队列中");
pcb p0=bq.removeFromFront();
System.out.println("查看阻塞队列中现有进程"+bq.toString());
p0.setStatus(2);
rq.addAtRear(p0);
System.out.println("查看就绪队列中现有进程"+rq.toString());
while(!rq.isEmpty()){
pcb px=rq.removeFromFront();
px.setArrival_time(px.getArrival_time()+time);
px.setStatus(1);
if(px.getExecute_time()>=px.getArrival_time()){
px.setStatus(2);
rq.addAtRear(px);
}
System.out.println("查看就绪队列中现有进程"+rq.toString());
}
System.out.println("查看就绪队列中现有进程"+rq.toString());
System.out.println("所有进程执行完毕");
}
}
package Process;
/*
进程就绪队列:fifo,实现进程调度,处理器从就绪队列选择进程,
是进程从就绪态转为运行态,
数据结构:队列,(用链式存储实现)
只允许在头部删除,在尾部插入
队列:另一种被限制的线性表
数据结构-逻辑结构:线性结构
物理结构:顺序,链式
队列:使用固定的一端插入元素,固定的一段删除元素
只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作
队尾:进行插入操作的一段
队售:进行删除操作的一端
空队列:队列中没有任何的数据元素
*/
public class blockedQueue {
private class Node{
//节点n内部类,用于表示链式存储队列中的每个节点
private T data;//节点的数据
private Node next;//保存指向下一个节点的引用
public Node(){}//构造函数,初始化
public Node(T data,Node next){
this.data=data;
this.next=next;
//构造函数,初始化
}
}
/*
就绪队列的属性
*/
private Node front;//保存就绪队列的头节点,即下一个会被处理机调度的进程,
private Node rear;//保存就绪队列的伪结点,即就绪队列中新进来的进程都在这里插入
private int size;//保存目前进程就绪队列中的进程数目
/*
就绪队列的方法
*/
//1创建一个空的进程就绪队列,没有任何进程处于就绪状态
public blockedQueue(){
//构造函数,初始化
front=null;
rear=null;
size=0;
}
//2创建一个非空的就绪队列,以一个指定的进程来创建进程就绪队列
public blockedQueue(T element){
front=new Node(element,null);
rear=front;
size=1;
}
//3返回目前进程就绪队列中进程的个数,,处于就绪状态进程的个数
public int getSize(){
return size;
}
//4返回进程就绪队列中的最后一个进程,即处于尾部的进程的数据
public T getData(){
return rear.data;
}
//5判断进程就绪队列是否为空
public boolean isEmpty(){
return size==0;
}
//6清空进程就绪队列
public void clear(){
front=null;
rear=null;
size=0;
}
//7将进程就绪队列中的所有进程的信息打印处理
public String toString(){
if(isEmpty())
return "[]";
else{
StringBuilder sb=new StringBuilder("[");
Node current=front;
for(int i=0;i