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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个学编程的

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

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

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

打赏作者

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

抵扣说明:

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

余额充值