用java解决N个进程共享的进程调度程序答题

设计一个有 N个进程共享的进程调度程序。

进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,

如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

代码:
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        
        main.createPCB();
        
        main.dispPCB();
        
        main.running();
    }

    void createPCB() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入进程的数量:");
        int num = sc.nextInt();
        
        for(int i=0; i<num; i++) {
            PCB pcb = new PCB();
            System.out.println("请输入进程名:");
            pcb.name = sc.next();
            System.out.println("请输入进程所需运行时间:");
            pcb.ntime = sc.nextInt();
            insertPCB(pcb);
        }
    }
    
    void running() {
        System.out.println("系统开始运行");
        while (!PCB.link.isEmpty()) {
            PCB pcbR = PCB.link.getFirst();
            PCB.link.remove();
            System.out.println("进程:" + pcbR.name + " 正在运行...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            pcbR.rtime++;
            pcbR.priority--;
            if (pcbR.rtime == pcbR.ntime) {
                deletePCB(pcbR);
            } else {
                insertPCB(pcbR);
            }
        }
        System.out.println("系统运行结束!!");

 


    }

    void insertPCB(PCB pcb) {
        int size = PCB.link.size();
        if (size == 0) {
            PCB.link.add(pcb);
            return;
        }
        for (int idx = 0; idx < size; idx++) {
            if (pcb.priority <= PCB.link.get(idx).priority)
                continue;
            else {
                PCB.link.add(idx, pcb);
                break;
            }
        }
        if (size == PCB.link.size()) PCB.link.add(pcb);
    }
    

import java.util.LinkedList;

public class PCB {
    public String name;
    public String state;
    public int priority;
    public int ntime;
    public int rtime;
    public static LinkedList<PCB> link = new LinkedList<>();
    
    public PCB() {
        this.priority = (int)(Math.random() * 5);
        this.rtime = 0;
    }
}
 

    void deletePCB(PCB pcb) {
        int size = PCB.link.size();
        for (int idx=0; idx<size; idx++) {
            if (pcb.name.equals(PCB.link.get(idx).name)) PCB.link.remove(idx);
        }
    }
    
    void dispPCB() {
        System.out.println("——————————————————————");
        System.out.println("系统中有:");
        for (PCB pcb : PCB.link) {
            System.out.println("进程:" + pcb.name + " 的优先级为:" + pcb.priority);
        }
        System.out.println("——————————————————————");
    }

}
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值