对于进程线程调度大家肯定都不陌生,都能够说上两句,比如什么进程是资源分配的基本单位,线程是调度的基本单位,进程有独立的地址空间,线程没有,线程与进程里面其他的线程共享资源,再有就是花样百出的调度策略。但是可能很多人对进程线程调度的内部情况还是不太清楚,只是说听得多了,基本的内容多少知晓一些,下面我们就来讲一讲线程深层次的东西—线程调度模型。
线程分配处理器使用权的过程,主要有两种:协同式线程调度(Cooperative Thread-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling)
Java使用的是抢占式线程调度,通过设置线程优先级“建议”系统给有些线程多分配时间,不同操作系统对于优先级的反应并不一定相同(比如Windows操作系统优先级7种,Java有10种,那么有些优先级映射到系统原生线程后就是一样的)
在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间很短(可能就几毫秒),然后调度其它的线程。它同时维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程是同步执行的。
在非抢占的调度模式下,每个线程可以需要CPU多少时间就占用CPU多少时间。在这种调度方式下,可能一个执行时间很长的线程使得其它所有需要CPU的线程”饿死”。在处理机空闲,即该进程没有使用CPU时,系统可以允许其他的进程暂时使用CPU。占用CPU的线程拥有对CPU的控制权,只有它自己主动释放CPU时,其他的线程才可以使用CPU。
不难看出,我们多次提到了CPU,CPU在线程中有很重要的作用,也是很多未曾接触过Java就知道的计算机基础知识,但还要很多涉及CPU的复杂知识,需要我们深入学习,拓展课本之外的知识,比如动力节点在线的专题视频课程,能够拓展我们的知识面,提升我们的学习竞争力。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54