线程的抢占式和协作式详解

来源:互联网 发布:centos boot repair 编辑:程序博客网 时间:2024/05/22 15:34

线程的调度有抢占式或者非抢占 (转)

在一个进程里,线程的调度有抢占式或者非抢占的模式。

在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间有2毫秒,然后调度其他的线程。它同时他维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程是同步执行的。

调度是什么意思?调度意味着处理器存储着将要执行完CPU时间的进程的状态和将来某个时间装载这个进程的状态而恢复其运行。然而这种方式也有不足之处,一个线程可以在任何给定的时间中断另外一个线程的执行。假设一个线程正在向一个文件做写操作,而另外一个线程中断其运行,也向同一个文件做写操作。 Windows 95/NT, UNIX使用的就是这种线程调度方式。

在非抢占的调度模式下,每个线程可以需要CPU多少时间就占用CPU多少时间。在这种调度方式下,可能一个执行时间很长的线程使得其他所有需要CPU的线程”饿死”。在处理机空闲,即该进程没有使用CPU时,系统可以允许其他的进程暂时使用CPU。占用CPU的线程拥有对CPU的控制权,只有它自己主动释放CPU时,其他的线程才可以使用CPU。一些I/O和Windows 3。x就是使用这种调度策略。

在有些操作系统里面,这两种调度策略都会用到。非抢占的调度策略在线程运行优先级一般时用到,而对于高优先级的线程调度则多采用抢占式的调度策略。如果你不确定系统采用的是那种调度策略,假设抢占的调度策略不可用是比较安全的。在设计应用程序的时候,我们认为那些占用CPU时间比较多的线程在一定的间隔是会释放CPU的控制权的,这时候系统会查看那些在等待队列里面的与当前运行的线程同一优先级或者更高的优先级的线程,而让这些线程得以使用CPU。如果系统找到一个这样的线程,就立即暂停当前执行的线程和激活满足条件的线程。如果没有找到同一优先级或更高级的线程,当前线程还继续占有CPU。当正在执行的线程想释放CPU的控制权给一个低优先级的线程,当前线程就转入睡眠状态而让低优先级的线程占有CPU。



所有java虚拟机都有一个线程调度器,用来确定哪个时刻运行哪个线程。

  它主要包含2种调度器:抢占式(preemptive)和协作式(cooperative).

          (1)抢占式(重点):

  抢占式调度器确定一个线程正常轮到这个线程的cpu时间用完时,会暂停这个线程,将cpu控制权交给轮到时间的另外一个线程。目前大多数虚拟机都使   用这种方式的线程调度器。

          (2)协作式:

 协作式线程调度器在将cpu控制权交给其他线程钱,会等待正在运行的线程自己去暂停,然后才可以交给另外一个线程。一些早期或者特殊用途的虚拟机   可能会使用这种方式。

           两者区别:

与使用抢占式线程调度的虚拟机相比,使用协作式线程调度器的虚拟机更容易使线程陷入“”饥饿“”,因为一个该优先级的非协作线程会独占整个    CPU。

           结论:所有java虚拟机都确保在不同的优先级之间使用抢占式线程调度,也就是说,当一个优先级低的线程正在裕兴,而一个高优先级线程准备运行时,虚拟             机或早或晚暂停这个优先级低的线程,让高优先级来运行。这样高优先级线程就抢占了低优先级线程。


好文要顶 关注我 收藏该文  
原创粉丝点击