浅谈 java线程 和 linux进程

因为最近在看jvm和linux kenel的一些书籍。看到一些相似的东西总喜欢拿来对比一下。想想背后设计的思想,感觉这样收货很多。最近一直在看一些英文的书籍,spring in action ,akka in action ,java 8 in action 等等。in action 系列的这些书籍,让我又看到一片新的天地。国内的很多书籍和他们没法比。想想实习也将近四个月了,自己也在规划着自己的未来,自己还有很多要提升的。好吧,扯着扯着就扯远了。下面进入正题。

我们先想一想linux操作系统下程序是如何执行的,首先程序启动后会有进程与之对应,然而进程是操作系统的资源,进程也就是活跃的程序,进程的每时每刻对应着程序的每一个状态的快照。程序只是一段代码放在磁盘上的某个角落,而进程中的执行包含了很多资源的集合,比如打开的文件,进程的状态,数据段,代码段,以及堆栈,程序计数器和寄存器。

java内存模型把内存分为线程间共享,和线程私有的内存区域。

其中线程共享的有 堆区,和方法区,其中运行时常量池是在方法区中的。

线程私有的有:程序计数器,java虚拟机栈和本地方法栈。

linux 程序执行的时候 程序计数器存放的是当前进程的下一条指令的地址。

java线程中的程序计数器中存放的是当前线程所执行的字节码指令的行号地址。


其中在linux中cpu的计算都是在寄存器中来做的,而在java内存模型中是通过在操作数栈上做的。

在java虚拟机栈中有很多栈帧,每个线程都有很多栈帧,每个栈帧对应着一个方法,当前执行的栈帧对应着当前的方法。栈帧里面有操作数栈和局部变量表,动态链接,方法出后的信息等等。

方法的参数和方法内的局部变量都存在局部变量表中,执行的操作通过把局部变量表中的信息压栈,计算,出栈等等来进行的。虽然说linux里面也有堆栈,函数调用堆栈。但是linux的执行时通过寄存器来做的。

其中一个jvm对应着一组线程,对应着一个或者若干个linux进程。jvm执行的是字节码,其实jvm并不能执行,所有的执行还是需要放在cpu,寄存器,算逻运算单元上去,只是java提供了一层封装,这就是java的内存模型,也是java跨平台的关键。

你可能感兴趣的:(java,java线程和linux进程)