基于pcb的进程管理实验,操作系统,java

本文详细介绍了如何使用Java编程实现进程控制块(PCB)和操作系统中的进程管理,涉及创建、状态转换、优先级调度,以及时间片算法或手动调度的应用。通过实例展示了从创建新进程到运行结束的完整流程和优先级调度的原理。
摘要由CSDN通过智能技术生成

基于pcb的进程管理实验,操作系统实验,java

  1. 建立一个结点,即 PCB 块包括用户标识域、link 域。
  2. 建立三个队列(执行队列、就绪队列、等待队列)。
  3. 根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换
  4. 按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。

(少了个运行到就绪)


优先级调度的策略

代码

代码如下(示例):

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--;
    }


}

1.目的: 自行编制模拟程序,通过形象化的状态显示,深入理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。 2. 内容及要求: 1) 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2) 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3) 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 4) 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 5) 代码书写要规范,要适当地加入注释。 6) 认真进行预习,完成预习报告。 7) 实验完成后,要认真总结,完成实验报告。 3.使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。
进程管理操作系统中的一个重要组成部分,Java作为一种面向对象的编程语言,也可以用于实现进程管理。下面是一个简单的Java进程管理实验示例: ```java package os.test1; import java.util.*; public class Algorithm { private PCB min=null; //满足运行条件的进程 private int num=0; //一批进程周转时间和 private int start=0; //更新系统开始时间 private double nums=0; //一批带权周转时间 private int count=0; //统计一批进程进程个数 private static Create create=new Create(); //实例化,以方便创建和增加进程 // 进程调度算法 public void algorithm() { ArrayList<PCB> list=create.getList(); while(list.size()>0) { for(int i=0;i<list.size();i++) { PCB pcb=list.get(i); if(pcb.getArriveTime()<=start) { if(min==null) { min=pcb; }else { if(min.getPriority()>pcb.getPriority()) { min=pcb; } } } } if(min!=null) { min.setStartTime(start); start+=min.getNeedTime(); min.setFinishTime(start); min.setTurnaroundTime(min.getFinishTime()-min.getArriveTime()); min.setWeightTurnaroundTime(min.getTurnaroundTime()/min.getNeedTime()); num+=min.getTurnaroundTime(); nums+=min.getWeightTurnaroundTime(); count++; list.remove(min); min=null; }else { start++; } } } // 输出结果 public void printResult() { System.out.println("进程名\t到达时间\t需要时间\t优先级\t开始时间\t完成时间\t周转时间\t带权周转时间"); ArrayList<PCB> list=create.getList(); for(int i=0;i<list.size();i++) { PCB pcb=list.get(i); System.out.println(pcb.getName()+"\t"+pcb.getArriveTime()+"\t"+pcb.getNeedTime()+"\t"+pcb.getPriority()+"\t"+pcb.getStartTime()+"\t"+pcb.getFinishTime()+"\t"+pcb.getTurnaroundTime()+"\t"+pcb.getWeightTurnaroundTime()); } System.out.println("平均周转时间:"+num/count); System.out.println("平均带权周转时间:"+nums/count); } public static void main(String[] args) { Algorithm algorithm=new Algorithm(); algorithm.algorithm(); algorithm.printResult(); } } class Create { private ArrayList<PCB> list=new ArrayList<PCB>(); public Create() { PCB pcb1=new PCB("P1",0,5,3); PCB pcb2=new PCB("P2",1,3,2); PCB pcb3=new PCB("P3",2,4,1); PCB pcb4=new PCB("P4",3,2,4); PCB pcb5=new PCB("P5",4,4,5); list.add(pcb1); list.add(pcb2); list.add(pcb3); list.add(pcb4); list.add(pcb5); } public ArrayList<PCB> getList() { return list; } } class PCB { private String name; //进程名 private int arriveTime; //到达时间 private int needTime; //需要时间 private int priority; //优先级 private int startTime; //开始时间 private int finishTime; //完成时间 private int turnaroundTime; //周转时间 private double weightTurnaroundTime; //带权周转时间 public PCB(String name,int arriveTime,int needTime,int priority) { this.name=name; this.arriveTime=arriveTime; this.needTime=needTime; this.priority=priority; } public String getName() { return name; } public int getArriveTime() { return arriveTime; } public int getNeedTime() { return needTime; } public int getPriority() { return priority; } public int getStartTime() { return startTime; } public void setStartTime(int startTime) { this.startTime=startTime; } public int getFinishTime() { return finishTime; } public void setFinishTime(int finishTime) { this.finishTime=finishTime; } public int getTurnaroundTime() { return turnaroundTime; } public void setTurnaroundTime(int turnaroundTime) { this.turnaroundTime=turnaroundTime; } public double getWeightTurnaroundTime() { return weightTurnaroundTime; } public void setWeightTurnaroundTime(double weightTurnaroundTime) { this.weightTurnaroundTime=weightTurnaroundTime; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值