基于pcb的进程管理实验,操作系统实验,java
- 建立一个结点,即 PCB 块包括用户标识域、link 域。
- 建立三个队列(执行队列、就绪队列、等待队列)。
- 根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换
- 按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。
(少了个运行到就绪)
优先级调度的策略
代码
代码如下(示例):
package Caozuoxitong;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/**
* @Author huazige
* @Date 2022/11/11 17:04
* @Version 1.0
*/
class PCB{
int pid;//新进程的编号
int priority;//新进程的优先级
int cputime;//新进程的需要的运行时间
int state; //进程状态
};
public class test {
public static void main(String[] args) {
int index=-1;
boolean test=true;
while(test){
System.out.println("欢迎进入进程管理系统");
System.out.println("选择要进行的操作序号:");
System.out.println("1.创建新进程");
System.out.println("2.运行就绪程序并显示所有");
System.out.println("3.换出进程");
System.out.println("4.杀死进程");
System.out.println("5.等待转化为就绪");
System.out.println("6.退出");
System.out.println("请选择(1~6):");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNext()) {
index = scanner.nextInt();
}
if(index==1){
create();
}
else if (index==2){
run();
}
else if (index==3){
exchange();
}
else if (index==4){
kill();
}
else if (index==5){
jiuxu();
}
else if (index==6){
test=false;
}
}
}
static List<PCB> list= new LinkedList<>();
static int num=0,pid;
static int max=0;
static int number=0;
static void create(){
if(num>=20){
System.out.println("\n内存已满,请先结束或换出进程\n");
}
else{
System.out.println("请输入新进程的编号,优先级,运行时间 ,隔开 #结束");
Scanner scanner = new Scanner(System.in);
// int[] nums = new int[numstr.length];
int sum = 0;
int j=0;
while(scanner.hasNextLine()){
String str = scanner.next();
if(str.equals("#")) break;
list.add(new PCB());
num++;
String[] numstr = str.split(",");
list.get(num-1).pid=Integer.parseInt(numstr[0]);
list.get(num-1).priority=Integer.parseInt(numstr[1]);
list.get(num-1).cputime=Integer.parseInt(numstr[2]);
list.get(num-1).state=2;
}
System.out.println("创建进程成功");
}
}
static void run() {
if (num <= 0)//查看//判断是否存在进程
{
System.out.println("当前状态无进程,按任意键继续创建进程");
return;
}
int max = 0;
for (int i = 0; i < num; i++) {
if ((list.get(i).state == 2 && list.get(i).priority >= list.get(max).priority)) {
max = i; //找最大进程的一个index //这里判断优先级,优先级高的进程优先执行。
}
}
if (list.get(max).state == 2) {
list.get(max).state = 3; //让最大进程运行,状态为3
}
System.out.println("当前已有进程" + num + "个");
for (int i = 0; i < num; i++) {
System.out.println("进程编号" + i );
System.out.println("当前运行进程编号" + list.get(i).pid);
System.out.println("该进程的优先级" + list.get(i).priority);
System.out.println("该进程的需要运行时间" + list.get(i).cputime);
System.out.println("该进程的状态:(1为等待,2就绪,3为运行)" + list.get(i).state);
}
// }
}
//换出
static void exchange() {
if (num <= 0)//查看//判断是否存在进程
{
System.out.println("当前状态无进程,按任意键继续创建进程");
return;
} // 公共部分可以封装成check方法
System.out.println("当前已有进程"+num+"个");
for (int i = 0; i < num; i++){//当前所有的进程
System.out.println("序号"+i+"程序编号"+list.get(i).pid+"优先级"+list.get(i).priority+"运行时间"+list.get(i).cputime+"状态"+
list.get(i).state);
}
System.out.println("输入要换出程序的序号" );
// System.out.println("输入要kill的序号");
Scanner scanner = new Scanner(System.in);
int index = max + 1;
if (scanner.hasNext()) {
index = scanner.nextInt();
}
System.out.println(index);
if(index!=max + 1&&list.get(index).state==3)
{
list.get(index).state=1;
System.out.println("已被换出,进程名为"+list.get(index).pid+"状态为:"+list.get(index).state);
}
else{
System.out.println("无法换出,进程名为"+list.get(index).pid+"的进程"); //换出结果提示
}
}
//等待到就绪
static void jiuxu() {
if (num <= 0)//查看//判断是否存在进程
{
System.out.println("当前状态无进程,按任意键继续创建进程");
return;
} // 公共部分可以封装成check方法
System.out.println("当前已有进程"+num+"个");
for (int i = 0; i < num; i++){//当前所有的进程
System.out.println("序号"+i+"程序编号"+list.get(i).pid+"优先级"+list.get(i).priority+"运行时间"+list.get(i).cputime+"状态"+
list.get(i).state);
}
System.out.println("输入要等待转化为就绪的序号" );
// System.out.println("输入要kill的序号");
Scanner scanner = new Scanner(System.in);
int index = max + 1;
if (scanner.hasNext()) {
index = scanner.nextInt();
}
System.out.println(index);
if(index!=max + 1&&list.get(index).state==1)
{
list.get(index).state=4;
System.out.println("已转化为就绪,进程名为"+list.get(index).pid+"状态为:"+list.get(index).state);
}
else{
System.out.println("无法转化进程名为"+list.get(index).pid+"的进程"); //换出结果提示
}
}
static void kill() {
System.out.println("当前已有进程"+num+"个");
for (int i = 0; i < num; i++) {//当前所有的进程
System.out.println(i);
System.out.println("序号" + i + "程序编号" + list.get(i).pid + "优先级" + list.get(i).priority + "运行时间" + list.get(i).cputime + "状态" +
list.get(i).state);
}
System.out.println("输入要kill的序号");
Scanner scanner = new Scanner(System.in);
int index = max + 1;
if (scanner.hasNext()) {
index = scanner.nextInt();
}
list.remove(index);//因为remove了 所以后面的进程
num--;
}
}