java实进程调度

进程调度方式:非抢占式、抢占式

非抢占式:一旦处理机分配给某进程后,不管它运行多久让他一直运行下去,不会因为时钟中断等原因而抢占正在运行的处理机。直到该进程完成,自愿放弃处理机,或阻塞时
非抢占式算法有:先来先服务(FCFS)、短作业优先调度算法(SJ( P )F)、高优先权优先调度算法

抢占式:允许调度程序根据某种原则去暂停某个正在执行的进程。抢占调度方式有一定原则,主要有以下几条:

  1. 优先权原则
  2. 短作业优先原则
  3. 时间片原则
    抢占式算法有:时间片轮转算法、多级反馈队列调度算法

先来先服务算法(FCFS):先来先服务算法是一种最简单的算法,可用于进程调度,也可用于作业调度。如名,进程调度采用FCFS算法时,每次调度都是从就绪队列中选取一个最先进入队列的进程,分配处理及,该进程一直运行到完成或者发生事件而阻塞才放弃处理机。
该算法比较利于长作业(进程),不利于短作业;原因:短作业等待时间过长
该算法有利于CPU繁忙型(指需要大量cpu时间)的作业,不利于I/O繁忙型

PCB temppcb1,temppcb2,temppcb3;  
        int count1=queue.size();  
        int count2=queue.size()-1;  
        LinkedList<PCB> queueQ=new LinkedList<PCB>();  
        while(count1>0){  
            temppcb3=temppcb1=queue.poll();  
            count1--;  
            while(count2>0){  
                temppcb2=queue.poll();  
                count2--;  
                if(temppcb2.pri>=temppcb1.pri)//优先权  
                {  
                    queue.offer(temppcb2);  
                }  
                else  
                {  
                    queue.offer(temppcb1);  
                    temppcb1=new PCB();  
                    temppcb1=temppcb2;  
                }  
            }  
            queue.offer(temppcb1);  
            count2=queue.size()-1;  
        }  

短作业优先调度算法(SJ( P )F):短作业优先调度算法是指对短作业或短进程优先调度的算法,从就绪队列中找到预计最短运行时间的进程,让处理机调度它
优点:可以有效降低作业的平均等待时间,提高系统吞吐量。
缺点:对长作业不利,周转时间与带权周转时间提升。未考虑作业的紧迫程度。时间长短是估计的,所以不一定会达到真正的短作业调度

if(rpcb!=null)  
        {  
            if(rpcb.allt==0)  
            {  
                rpcb.state="OVER";  
                overqueue.offer(rpcb);  
                rpcb=readyqueue.poll();  
                rpcb.state="EXECUTE";  
                rpcb.allt--;  
                rpcb.cput++;  
                rpcb.pri=rpcb.pri-3;  
            }  
            else  
            {  
                if(judgePri(readyqueue))  
                {  
                    rpcb.state="BLOCK";  
                    blockqueue.offer(rpcb);  
                    rpcb=readyqueue.poll();  
                    rpcb.state="EXECUTE";  
                      
                }  
                rpcb.allt--;  
                rpcb.cput++;  
                rpcb.pri=rpcb.pri-3;  
            }  
            readyqueueUpdate(readyqueue);  
            blockqueueUpdate(blockqueue);  
        }  
        else  
        {  
            rpcb=readyqueue.poll();  
            rpcb.allt--;  
            rpcb.cput++;  
            rpcb.pri=rpcb.pri-3;  
            rpcb.state="EXECUTE";  
              
            readyqueueUpdate(readyqueue);  
            blockqueueUpdate(blockqueue);  
        }  

高优先权优先调度算法:类同于短作业优先调度算法

int count=queue.size();  
        PCB tempPcb;  
        while(count>0)  
        {  
            count--;  
            tempPcb=queue.poll();  
            tempPcb.endblock--;  
            if(tempPcb.endblock==0)  
            {  
                tempPcb.endblock=3;  
                tempPcb.state="READY";  
                readyqueue.offer(tempPcb);  
                readyqueueSort(readyqueue);//使得刚转移过来的进程参与优先权竞选  
            }  
            else{  
                queue.offer(tempPcb);  
            }  
              
        }  
        blockqueueSort(blockqueue); 

时间片轮转算法:利用FCFS再令其执行一个时间片,时间片用完时,发生中断,将其送入就绪队列尾部

public void tsc(List<PCB> pcbs){
		while(!isFinish(pcbs)){
			//获取所有进程数
			Long count = pcbs.stream().filter((e)->e.getStatus().equals(Status.W)).collect(Collectors.counting());
			for(int i = 0;i<count;i++){
				//获取应调度的进程
				Optional<PCB> op = pcbs.stream()
						   .filter((e)->e.getStatus().equals(Status.W))
						   .skip(i)
						   .findFirst();
				op.get().setStatus(Status.R);
				op.get().run(10);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				System.out.println("CPU运行时间:"+PCB.run_time);
				show(Status.F);
				show(Status.R);
				show(Status.W);
				show(Status.H);
				System.out.println();
				//时间片完后把执行状态转换为就绪状态
				if(op.get().getStatus().equals(Status.R)){
					op.get().setStatus(Status.W);
				}else{
					count --;
				}
			}
		}
	}

多级反馈队列调度算法:既能使高优先级的作业得到响应又能使短作业(进程)迅速完成

public void hrr(List<PCB> pcbs){
		while(!isFinish(pcbs)){
			//获取当前相对优先级最高的进程
			Optional<PCB> op = pcbs.stream()
								   .filter((e)->e.getStatus().equals(Status.W))
								   .max((e1,e2)->Double.compare(e1.hrr_priority(), e2.hrr_priority()));
			op.get().setStatus(Status.R);
			op.get().run(10);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			System.out.println("CPU运行时间:"+PCB.run_time);
			show(Status.F);
			show(Status.R);
			show(Status.W);
			show(Status.H);
			System.out.println();
			if(op.get().getStatus().equals(Status.R)){
				op.get().setStatus(Status.W);
			}
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 进程调度是操作系统中的重要概念之一,Java作为一种面向对象的编程语言,可以通过多线程来进程调度。 在Java中,可以通过使用Thread类和Runnable接口来进程调度。可以创建多个线程对象,并使用线程调度器对这些线程进行管理和调度。线程调度器可以根据不同的调度算法来选择哪个线程执行。 下面是一个简单的Java程序,现了进程调度: ``` public class ProcessScheduler { public static void main(String[] args) { // 创建多个线程对象 Thread t1 = new Thread(new MyRunnable("Process 1")); Thread t2 = new Thread(new MyRunnable("Process 2")); Thread t3 = new Thread(new MyRunnable("Process 3")); // 启动线程 t1.start(); t2.start(); t3.start(); } static class MyRunnable implements Runnable { private String name; public MyRunnable(String name) { this.name = name; } @Override public void run() { System.out.println("Running " + name); try { // 模拟进程执行 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Finished " + name); } } } ``` 在这个程序中,我们创建了三个线程对象,并使用Runnable接口现了进程执行的逻辑。在main函数中,我们启动了这三个线程,线程调度器会根据不同的算法来选择哪个线程执行。当线程执行完毕后,会输出相应的提示信息。 ### 回答2: 进程调度是操作系统中的一个重要功能,用于决定哪个进程将获得CPU的使用权。在Java中,可以使用多线程来进程调度。 首先,创建一个进程调度器类,里面包含一个进程队列,用于存储所有需要调度的进程。可以使用ArrayList来现进程队列。 接着,创建一个进程类,包含进程的ID、优先级和执行时间等属性。可以使用一个线程来代表一个进程。 在进程调度器类中,可以设置一些调度算法,如先来先服务(FCFS)、最短作业优先(SJF)、优先级调度等等。根据不同的算法,可以对进程队列进行排序,使得优先级高的进程获得CPU的使用权。 在主程序中,可以创建一定数量的进程,并将它们添加到进程队列中。根据进程调度算法的不同,可以选择不同的调度策略来决定下一个执行的进程。可以使用一个死循环来模拟进程的执行和调度过程,直到所有进程都执行完毕。 在执行过程中,需要考虑进程的状态转换,如就绪状态、运行状态和完成状态等。可以使用线程的start()方法来启动每一个进程的执行,使用join()方法来等待进程执行完毕。 进程调度现还需要考虑同步和互斥问题。可以使用锁、信号量或者条件变量等机制来保证进程的正确执行。 总之,使用Java进程调度需要创建进程调度器类和进程类,并设置合适的调度算法。通过多线程来模拟进程的执行和调度过程,同时考虑同步和互斥机制,确保进程正常执行。 ### 回答3: 进程调度是操作系统的重要功能之一,它负责决定进程的执行顺序和分配系统资源。通过使用Java编写程序,我们可以现一个简单的进程调度模拟器。 首先,我们需要定义一个进程类,包含进程的ID、优先级和执行时间等属性。我们可以使用Java的类来表示进程,如下所示: ```java class Process { private int id; private int priority; private int executionTime; public Process(int id, int priority, int executionTime) { this.id = id; this.priority = priority; this.executionTime = executionTime; } // getter and setter methods // ... } ``` 然后,我们可以创建一个进程调度器类,用于现进程的调度逻辑。进程调度器在每个时间片中根据一定的调度算法选择下一个要执行的进程。 一个简单的进程调度器例子如下: ```java class ProcessScheduler { private List<Process> processList; public ProcessScheduler() { processList = new ArrayList<>(); } public void addProcess(Process process) { processList.add(process); } public void schedule() { while (!processList.isEmpty()) { // 根据一定的调度算法,选择下一个要执行的进程 Process nextProcess = selectNextProcess(); // 执行进程 System.out.println("Process " + nextProcess.getId() + " is running."); nextProcess.execute(); // 将执行完的进程从进程列表中移除 processList.remove(nextProcess); } } private Process selectNextProcess() { // 根据一定的调度算法,选择下一个要执行的进程 // 这里可以根据进程的优先级或其他指标进行选择 // 这里仅作为示例,假设选择第一个进程执行 return processList.get(0); } } ``` 最后,我们可以编写测试代码来模拟进程的创建和调度过程: ```java public class Main { public static void main(String[] args) { // 创建进程调度器 ProcessScheduler scheduler = new ProcessScheduler(); // 创建进程 Process process1 = new Process(1, 2, 10); Process process2 = new Process(2, 1, 5); Process process3 = new Process(3, 3, 8); // 将进程添加到进程调度器中 scheduler.addProcess(process1); scheduler.addProcess(process2); scheduler.addProcess(process3); // 调度进程 scheduler.schedule(); } } ``` 上述代码创建了一个进程调度器,并创建了三个进程,并将它们添加到调度器中。然后调度器会根据调度算法选择下一个要执行的进程,并将执行完的进程从进程列表中移除。 这个简单的进程调度器只是一个示例,际情况中我们可能需要更复杂的调度算法和更多的进程属性来现一个真可用的进程调度器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个学编程的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值