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

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

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

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

下面对它们逐一解答。

内核线程和用户线程对比

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

上篇

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

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

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

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

用户线程的上下文切换

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

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

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

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

程序(program)和进程的关系

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

接下来会从JVM角度分析其线程管理的机制,敬请关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180910G0ACYT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券