在前两篇文章中,咱们已经了解了关于线程的建立与经常使用方法等相关知识。接下来就来了解下,当你运行线程时,线程是如何调度的。关注个人公众号「Java面典」了解更多 Java 相关知识点。html
多任务系统每每须要同时执行多道做业。做业数每每大于机器的 CPU 数,然而一颗 CPU 同时只能执行一项任务,如何让用户感受这些任务正在同时进行呢? 操做系统的设计者 巧妙地利用了时间片轮转的方式。算法
对于单核 CPU 来讲(对于多核 CPU,此处就理解为一个核),CPU 在一个时刻只能运行一个线程,当在运行一个线程的过程当中转去运行另一个线程,这个叫作线程上下文切换(对于进程也是相似)。多线程
操做系统中线程调度主要有两种方式抢占式调度与协同式调度。并发
抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制。系统控制指的是在系统某种运行机制下,可能每条线程都分一样的执行时间片,也多是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会致使整个进程堵塞。jvm
协同式调度指某一线程执行完后主动通知系统切换到另外一线程上执行。线程的执行时间由线程自己控制,线程切换能够预知,不存在多线程同步问题,但它有一个致命弱点:若是一个线程编写有问题,运行到一半就一直堵塞,那么可能致使整个系统崩溃。性能
Java 使用的线程调度使用抢占式调度,Java 中线程会按优先级分配 CPU 时间片运行,且优先级越高越优先执行,但优先级高并不表明能独自占用执行时间片,多是优先级高获得越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。操作系统
操做系统中经常使用的进程调度算法,主要有三种优先调度算法、高优先权先调度算法和基于时间片的轮转调度算法。线程
每次调度都是从后备做业队列中选择一个或多个最早进入该队列的做业,将它们调入内存运行,分配执行资源。设计
每次都是从后备队列中选择一个或若干个估计运行时间最短的做业,将它们调入内存运行,分配执行资源。code
采起优先调度算法时,线程一旦得到 CPU 执行权限,将一直执行到完成,或发生某事件而被阻塞放弃处理机时再从新调度。优先调度算法的缺点是:未照顾到紧迫型做业。
为了照顾紧迫型做业,使之在进入系统后便得到优先处理,引入了最高优先权优先(FPF)调度算法。当把该算法用于做业调度时,系统将从后备队列中选择若干个优先权最高的做业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程。
特色:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时。
适用系统:这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。
特色:当在系统执行期间,只要又出现了另外一个其优先权更高的进程,进程调度程序就当即中止当前进程(原优先权最高的进程)的执行,从新将处理机分配给新到的优先权最高的进程。
适用系统:显然,这种抢占式的优先权调度算法能更好地知足紧迫做业的要求,故而经常使用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
原理:在短做业优先算法的基础上,为每一个做业引入优先权,并使做业的优先级随着等待时间的增长而以速率 a 提升,则长做业在等待必定的时间后,必然有机会分配处处理机。
特色:
优势:该算法既照顾了短做业,又考虑了做业到达的前后次序,不会使长做业长期得不到服务。
缺点:在利用该算法时,每要进行调度以前,都须先作响应比的计算,这会增长系统开销。
实现:
这样就能够保证就绪队列中的全部进程在一给定的时间内均能得到一时间片的处理机执行时间。
实现:
在多级反馈队列调度算法中,若是规定第一个队列的时间片略大于多数人机交互所需之处理时间时,便可以较好的知足各类类型用户的须要。