线程调度及进程调度

1、Java线程调度算法

  1.抢占式调度:指的是每条线程执行的时间、线程的切换都由系统控制。系统控制指的是在系统某种运行机制下,可能每条线程都分一样的执行时间片,也多是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会致使整个进程堵塞。多线程

  2.协同式调度:指某一线程执行完后主动通知系统切换到另外一线程上执行。线程的执行时间由线程自己控制,线程切换能够预知,不存在多线程同步问题,但它有一个致命缺点:若是一个线程编写有问题,运行到一半就一直阻塞,那么可能致使整个系统崩溃。dom

  3.JVM的线程调度的实现(抢占式调度):Java使用的线程调度使用抢占式调度,Java中线程会按优先级分配CPU时间片运行,且优先级越高越优先执行,但优先级高并不表明能独自占用执行时间片,多是优先级高获得越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。性能

  4.线程让出CPU的状况:spa

    1)当前运行线程主动放弃CPU,JVM暂时放弃CPU操做(基于时间片轮转调度的JVM操做系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield方法。操作系统

    2)当前运行线程由于某些缘由进入阻塞状态,例如阻塞在IO上。线程

    3)当前运行线程结束,即运行完run方法里面的任务。code

实例:blog

 1 public class TestScheduledThreadPool {  2     public static void main(String[] args) throws Exception {  3         ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);  4         for (int i = 0; i < 5; i++) {  5             Future<Integer> result = pool.schedule(new Callable<Integer>(){  6                 public Integer call() throws Exception {  7                     int num = new Random().nextInt(100);//生成随机数
 8                     System.out.println(Thread.currentThread().getName() + " : " + num);  9                     return num; 10  } 11             }, 1, TimeUnit.SECONDS); 12  System.out.println(result.get()); 13  } 14  pool.shutdown(); 15  } 16 }

 

2、进程调度算法队列

1.优先调度算法

  1)先来先服务调度算法(FCFS):当在做业调度中采用该算法时,每次调度都是从后备做业队列中选择一个或多个最早进入该队列的做业,将它们调入内存,为它们分配资源、建立进程,而后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最早进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机,特色是:算法比较简单,能够实现基本上的公平。

  2)短做业(进程)优先调度算法(SJF):是从后备队列中选择一个或若干个估计运行时间最短的做业,将它们调入内存运行。而短做业优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它当即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再从新调度。该算法未照顾紧迫型做业。

2.高优先权优先调度算法

  为了照顾紧迫型做业,使之在进入系统后便得到优先处理,引入了最高优先权(FPF)优先调度算法。当把该算法用于做业调度时,系统将从后备队列中选择若干个优先权最高的做业装入内存。当用于进程调度时,该算法时把处理机分配给就绪队列中优先权最高的进程。

  1)非抢占式优先权算法:在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时。这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。

  2)抢占式优先权调度算法:在这种方式下,系统一样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另外一个其优先权更高的进程,进程调度就当即中止当前进程(原优先权最高的进程)的执行,从新将处理机分配给新到的优先权最高的进程。显然,这种抢占式的优先权调度算法能更好地知足紧迫做业的要求,故而经常使用于比较严格的实时系统中,以及对性能要求较高的批处理系统和分时系统中。

  3)高响应比优先调度算法:在批处理系统中,短做业优先算法是一种比较好的算法,其主要的不足之处是长做业的运行得不到保证。若是咱们能为每一个做业引入前面所述的动态优先权,并使做业的优先级随着等待时间的增长而以速率a提升,则长做业在等待必定时间后,必然有机会分配处处理机。该优先权的变化规律可描述为:

    

    a. 若是做业地等待时间相同,则要求服务的时间愈短,其优先权愈高,于是该算法有利于短做业。

    b. 当要求服务的时间相同时,做业的优先权决定与其等待时间,等待时间越长,其优先权越高,于是它实现的是先来先服务。

    c. 对于长做业,做业的优先级能够随等待时间的增长而增长,当其等待时间足够长时,其优先级即可升到很高,从而也可得到处理机。该算法既照顾了短做业,又考虑了做业到达的前后次序,不会使长做业长期得不到服务。所以,该算法实现了一种较好的折中。固然,在利用该算法时,每要进行调度以前按,都须先作响应比的计算,这会增长系统开销。

3.基于时间片的轮转调度算法

  1)时间片轮转法:在早期的时间片轮转法中,系统将全部的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来中止该进程的执行,并将它送往就绪队列的末尾;而后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就能够保证就绪队列中的全部进程在一给定的时间内均得到一时间片的处理机执行时间。

  2)多级反馈队列调度算法

    a. 应设置多个就绪队列,并为各个队列赋予不一样的优先级。第一个队列的优先级最高,第二个队列次之,其他各队列的优先权逐个下降。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权越高的队列中,为每一个进程所规定的执行时间片就越小。例如,第二队列的时间片要比第一个队列的时间片长一倍,......,第i+1个队列的时间片要比i个队列的时间片长一倍。

    b. 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,若是它能在该时间片内完成,即可准备撤离系统;若是它在一个时间片结束时还没有完成,调度程序便将该进程转入第二队列的末尾。再一样地按FCFS原则等待调度执行;若是它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,......,如此下去,当一个长做业从第一队列依次降到第n队列后,在第n队列便采起按时间片轮转的方式运行。

    c. 仅当第一队列空闲时,调度程序下才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。若是处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。再多级反馈队列调度算法中,若是规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便可以较好的知足各类类型用户的须要。

相关文章
相关标签/搜索