最近在啃《深入理解JVM》 看到垃圾收集器那一节关于CMS的并发清理线程时,下定决心要把线程和CPU的关系理清楚。
首先,先解释并发和并行的区别。如果不对请麻烦评论纠正一下。
1.我理解的并发是指执行多个任务。并且这些任务可能是同时进行的,也可能不是同时进行的。比如说单核CPU上的多线程通过抢占CPU资源获得时间片(CPU分配给线程的执行时间),执行自己线程的任务。因为时间片时间非常短,可能只有十几毫秒。使得用户觉得CPU可以同时执行多个任务。比如说在一个游戏软件中,线程A负责计算子弹的弹道并且改变子弹的位移矢量,而线程B负责控制玩家的行走,线程A在控制子弹运动,此时线程B来抢占CPU资源,将线程A踢出CPU,并且控制玩家移动了一下,最终玩家躲开了子弹爆头的致命一击,只是掉了点血。这个过程看起来像是子弹打出去,玩家也在运动,最终躲掉了子弹一样,其实是玩家走一点点,子弹再移动一点点,如此反复,最终子弹和玩家碰撞盒相遇造成伤害。这种可以执行多个任务的行为称为并发。
另外一种并发的情况是并行,下面来解释并行。
2.并行强调"同时"的概念,相像一下,许多线程平“行”,一“并”执行各自的任务。他们之间是平行关系,当然是同一时间进行的。在多核CPU上,如果每条线程都可以得到一个CPU资源来执行自己的任务,那这些线程都是同时间点执行自己的任务。如果线程比较多,而无法为每条线程都分配一个CPU核,那么可能发生两个或以上的线程抢占一个CPU核的情况。
当程序属于IO密集型或者其他非CPU使用密集型时,线程会频繁访问IO等非CPU资源。如果不支持并发,那么当许多线程都在访问IO或者其他非CPU资源,那CPU就会处于空闲状态,这时就无法让CPU的利用率达到最大。如果支持并发,那么当一个线程在访问CPU转而访问IO等资源时,其他线程就可以继续利用CPU进行运算,使得CPU利用率达到最大。
如果有错误还请改正。