Q1:内核线程和用户线程都有哪些关系?
Q2:用户线程如何映射到内核线程?
Q3:程序(program)和进程的关系又是怎样的?
下面对它们逐一解答。
内核线程和用户线程对比
用户线程与内核线程的映射关系
见
上篇
中的图四。用户线程会把依赖OS完成的工作交由内核线程代理完成,这种代理或者映射关系有以下三种:
一对一关系:即一个进程只有一个内核线程,没有用户线程。
多对一关系:即多个用户线程对应一个内核线程,这种关系会产生一个用户线程阻塞,整个进程将阻塞的问题。
多对多的关系:即多个用户线程对应多个内核线程。
用户线程的上下文切换
用户线程的上下文切换包括两步:
首先是线程从用户态切换至内核态。
其次是内核态的线程之间的切换。
因此,一个用户线程实际上对应了user-mode statck和kernel-mode stack。
程序(program)和进程的关系
一个program可以启动多个process,例如:打开多个word窗口,每个窗口对应一个process,但只有一个word程序;再如运行Nginx通常是一个master进程管理着n个(通常为cpu个数)worker进程。从这个意义上来说,说某种语言是否支持多进程没什么意义,只能说某种语言相比其他语言是否内置多进程的支持,如果是,那么用这种语言编写多进程的程序将是其一大优势。
接下来会从JVM角度分析其线程管理的机制,敬请关注。
领取专属 10元无门槛券
私享最新 技术干货