我知道线程的内核态和用户态,线程的内存态是什么?就是线程在内存的形态,它在CPU和内存上是如何表达的,这一点可以帮助理解线程的同步机制,本文的目的也是这一点。本文基于java环境,基于JVM内存管理模型,从计算机体系自上往下行文,只写概览忽略细节,计算机体系结构可参考上篇的文章图例。
面向对象的高级开发语言的思维和编程模式,解放了有限的精力,让计算机软件的世界变得色彩斑斓,掌握编程能力甚至被内卷到了儿童编程阶段。我们知道高级语言编写的程序无法在计算机上直接执行,计算机只认识0和1,也就是机器语言,所以高级语言编写的代码或者说程序需要编译成计算机可识别的机器语言。从高级语言到机器语言,这一步是编译器完成的,比如编译,链接等过程,常见的编译器有gcc,javac等.
一段java代码
Object globalVar = new Object;
public static void main(String[] args) {
(new Thread()).start()
System.out.println("Hello world");
}
被编译后的代码
-----
编译后的是一堆数字,它存储在磁盘上,这数字怎么会跟线程有关系呢?一步步来。
首先是载入内存,咋载入的?过。
载入过后他在内存中是如何分布式的呢?这个时候就要抬出来JVM内存模型了。
image.png
new Object(); 对象是分配在堆上的,而globalVar是存放在栈上的,它指向 new Object();对象。
image.png
在jvm中,堆是线程共享的。
共享区域如棕色图所示。
image.png
这一步完成后,我们来进一步看看线程在内存中是如何存储的。严格来说这时候还没有线程呢,连进程也没有,仅仅是一堆代码片段。我们一般看内存是一片连续的区域,或者说是一个二维数组。
image.png
虽然事实上它是这个样子的。
image.png
进程内存分布
image.png
线程在哪儿呢?代码被编译后,放在只读代码段,所有,线程也在只读代码段区。在linux系统中,只有进程,没有线程,所谓线程,其实是轻量级进程存在的,本质上仍然是进程,受操作系统调度。
线程与进程的关系。
image.png
image.png