前一篇文章贴出的是基本的实验思路以及要求,接下来我们用代码具体实现整个进程管理过程。 由于本人比较喜欢用java开发,并且java写起来比c快多了,于是就写了一个java版的。思想都是一样的,语言不重要
系统目录:
整个系统主要是三个java代码文件:
![这里写图片描述](https://img-blog.csdn.net/20170514183939198?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ByaW5nY29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
代码分析
1.Main.java
public class Main {
private static Scanner scanner =new Scanner(System.in);
private static String command=null;
public static void main(String args[]){
command=scanner.nextLine();
command=command.trim();
while(command!=""){
TestShell.exeCommand(command);
command=scanner.nextLine();
command=command.trim();
}
}
}
主函数中没有什么,就是对控制面板输入的命令进行处理
2.PCB.java
PCB(process control block),进程控制块,是我们学习操作系统后遇到的第一个数据结构描述,它是对系统的进程进行管理的重要依据,和进程管理相关的操作无一不用到PCB中的内容。一般情况下,PCB中包含以下内容:
(1)进程标识符(内部,外部)
(2)处理机的信息(通用寄存器,指令计数器,PSW,用户的栈指针)。
(3)进程调度信息(进程状态,进程的优先级,进程调度所需的其它信息,事件)
(4)进程控制信息(程序的数据的地址,资源清单,进程同步和通信机制,链接指针)
由于这个试验中用不到这么多信息,所以我们的代码中也就没有写这么多。主要包括:进程名,进程ID,父进程,优先级,子进程等的一些简要信息
private int pid;//正在运行的process id
private int prioirty;
private String name;
private String childName=null;
private Map<String ,Integer> requestRes=new HashMap<>();
private int parentId;
private int childId;
private int state;
其中requestRes表示进程请求的资源,初始化的时候都是0,表示进程刚刚创建,还没有请求资源
此外我们在定义几个表示进程状态的常量:
public static final int STATE_RUNNING=0;
public static final int STATE_BLOCKED=1;
public static final int STATE_READY=2;
public static final int STATE_DESTORYED=3;
3.Log.java
由于需要输出一些文字,包括一些必要的进程信息,还有命令处理的出错信息,其实就是嫌弃System.out.println(“”)太长了,这里我们写一个工具类,便于开发
public class Log {
public