JVM内部机制(四)Java中的线程

分类: JVM 发布于:

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对象,是一个多层次链,用来存储运行时需要的所有资源引用。

task_struct

用户线程

用户线程指的是完全建立在用户空间的线程库,它的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。所以,这种线程的操作是极其快速的且低消耗的。

Jvm中的执行结构

线程

在linux平台上,jvm内的线程模型也是1对1的关系

jvm thread model

参考文献

G22.2250 Operating Systems

Multithreaded Programming Guide

Operating systems