Java编程思想之多线程(二)

268 阅读2分钟

上一篇回顾了多线程的一些理论知识,并遗留了几个问题:

  • Q1:内核线程和用户线程都有哪些关系?

  • Q2:用户线程如何映射到内核线程?

  • Q3:程序(program)和进程的关系又是怎样的?

下面对它们逐一解答。


  • 内核线程和用户线程对比

用户线程

内核线程

由用户实现

由OS实现

对OS透明

OS负责管理内核线程,对之了如指掌

通过语言包的SDK实现线程很容易

内核线程实现负责

线程上下文切换需要很少的时间

内核线程切换需要很长的时间

线程的切换不依赖硬件

线程的切换需要硬件支持

如果一个线程阻塞,整个进程将阻塞(

这里专指进程中的所有线程映射为一个内核线程
)

一个kernel线程阻塞,不影响其他线程继续执行

例如: Java thread, POSIX threads.

例如:Unix,windows


  • 用户线程与内核线程的映射关系

上篇中的图四。用户线程会把依赖OS完成的工作交由内核线程代理完成,这种代理或者映射关系有以下三种:

  1. 一对一关系:即一个进程只有一个内核线程,没有用户线程。

  2. 多对一关系:即多个用户线程对应一个内核线程,这种关系会产生一个用户线程阻塞,整个进程将阻塞的问题。

  3. 多对多的关系:即多个用户线程对应多个内核线程。


  • 用户线程的上下文切换

用户线程的上下文切换包括两步:

  1. 首先是线程从用户态切换至内核态。

  2. 其次是内核态的线程之间的切换。

因此,一个用户线程实际上对应了user-mode statck和kernel-mode stack。


  • 程序(program)和进程的关系

一个program可以启动多个process,例如:打开多个word窗口,每个窗口对应一个process,但只有一个word程序;再如运行Nginx通常是一个master进程管理着n个(通常为cpu个数)worker进程。从这个意义上来说,说某种语言是否支持多进程没什么意义,只能说某种语言相比其他语言是否内置多进程的支持,如果是,那么用这种语言编写多进程的程序将是其一大优势。

接下来会从JVM角度分析其线程管理的机制,敬请关注"码农走向艺术"微信公众号,获取最新原创文章。