JVM内部机制(四)Java中的线程
POSIX.equals(“Portable Operating System Interface”)
OS中进程和线程
线程基础
进程是对资源的抽象,包括CPU、内存、IO操作、文件描述符等,是系统资源分配的最小单元。
线程是对调度和执行的抽象,是调度的最小单元。
线程是在进程内部运行的执行分支,每个线程对应一个独立的执行分支。
从执行角度看,线程是为了共享资源(共享地址空间),进程是为了资源独占(私有地址空间)。
按照代码执行的位置区分,可以把线程分为3种:
-
用户空间线程
-
内核(kernel)空间线程
-
Fibers(常被翻译为纤程)
以上3种资源调度方式如果独立使用,弊大于利。
比如,内核对纯用户空间的线程无感知。 当线程执行到IO时,产生系统调用,从而在内核空间被block。 整个进程内的所有线程都要一起等到IO完成后才可以继续执行。
如果把用户线程和内核线程混合使用,可以取长补短。这样就产生了线程调度模型。
线程调度模型
线程的调度方式目前的实现主要有两种:
- 抢占式(preemptive)
抢占式线程有内核主动调度并负责上下文切换。
- 协作式(cooperative)
协作式线程最大的特点是调度权有线程自己决定,所以不存在并发和同步引起的问题。
缺点是协作线程无法把握下一次被执行的时间。
轻量级进程-LWP
Lightweight Progress
在linux的实现中,用户线程和lwp之间是1:1的关系。lwp为用户空间内的线程陷入内核的系统调用提供了一个管道。
使用ps -eLf 命令可以查看系统内的LWP列表:
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 Oct18 ? 00:00:36 /sbin/init splash
root 2 0 2 0 1 Oct18 ? 00:00:00 [kthreadd]
root 4 2 4 0 1 Oct18 ? 00:00:00 [kworker/0:0H]
root 6 2 6 0 1 Oct18 ? 00:00:00 [mm_percpu_wq]s
lwp在内核内体现为一个task_struct链。
task_struct结构体类似Jvm中的instance_oop对象,是一个多层次链,用来存储运行时需要的所有资源引用。
用户线程
用户线程指的是完全建立在用户空间的线程库,它的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。所以,这种线程的操作是极其快速的且低消耗的。
Jvm中的执行结构
线程
在linux平台上,jvm内的线程模型也是1对1的关系
参考文献