操作系统及JVM线程模型对应
操作系统线程模型
在Linux中定义了三种的线程模型,分别是核心线程,LWP, 用户线程。
内核线程
内核线程是操作系统提供运行于内核态的线程,该线程的所有管理工作都是由操作系统来完成的。 当运行的线程阻塞时,操作系统可以立刻的调度其他线程运行。但是他也有响应的缺点:就是内核线程总是在内核进行调度管理的,但是用户进程是在用户态下的。因此使用内核线程会涉及到一个用户态和内核态间的切换
用户线程
用户线程的定义是,由进程内部自己创建管理,对操作系统不可见的线程,它存在的意义是可以进程自己创建销毁线程,成本相对的比较低。 但是其弊端就是对用户开发要求比较高,同时当用户线程遇到阻塞时其他的用户线程将没有办法启动(因为对操作系统来说,该进程对应的是一条系统线程,系统线程阻塞所以被挂起)
LWP
介于以上的两种线程模型的优点及弊端,所以有了LWP(light weight proccess)运行在用户空间的轻量级进程。每一个LWP对应一个的内核线程,所以LWP的调度等控制都有内核管理。同时提供了线程库供以用户进程使用。
在简单了解了以上的三种线程模型,尤其是LWP 之后,将讲讲hotSpot中的线程模型
JVM(HotSpot)线程原理
JVM其实本身也是一个进程而已,只是内部实现了部分操作系统的逻辑,比如对用户内存空间的管理,线程的映射维护等
HotSpot的线程模型
在HotSpot中的线程模型使用的是一个线程实例(java.lang.Thread)对应一个操作系统线程(这里的对应的是LWP)。当一个线程实例开始执行start()的时候的时候就会创建一个LWP进行对应,并且在线程任务结束后回收,其中线程的调度由操作系统负责。
JVM在线程创建并执行start()方法后的内部动作:
1、创建一个堆中的Thread对象(java.lang.Thread)
2、在JVM内部会创建一个JavaThread对象(JVM内部的,以下称VmThread),用以维护线程当前的状态。同时VmThread会持有java.lang.Thread 的引用及与操作系统对用的OSThread的引用
3、JVM内部会维护一个OSThread,包含操作系统信息,及与实际操作系统线程对应的handle。
网友评论