慧眼看世界 - 一个值得收藏的网站
简单的谈一下JVM的诞生和操作系统之间的关系。
1.操作系统
大家都知道操作系统(Windows/Linux)是软件,它用来管理硬件,让硬件能够正常、合理的运行,当然各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件,操作系统还像程序员提供了一层接口,叫做系统呼叫层,程序员可以面向这一层的接口编程,来实现对计算机的控制,而不同的操作系统(或者说不同的CPU架构)所提供的接口都是不一样的,Windows和Linux提供给的那肯定是完全不一样的,虽然站在最终的角度来看都能实现某一功能。所以同样一个程序是不能在不同的系统上运行的,甚至可能在同一个系统的不同版本都不一定能完美运行,比如C/C++程序。
2.JVM
JVM虚拟机相当于在操作系统之上建立的一个虚拟的计算机。其中内存结构可以看出来,jvm中pc寄存器,栈,堆,元空间和常量池对应计算机的处理器和内存。jvm+java解决跨平台的问题,鉴于不同的操作系统java程序如何做到一次编写,到处运行,想实现跨平台,于是JVM就诞生了,JVM向下关联所有操作系统,他能操作所有操作系统,向上提供统一接口,也就是JavaAPI,开发者只需要面向JVM(JavaAPI)编程,至于JVM是如何各种不同的操作系统打交道开发者完全不用管。上图很好的解释了,java虚拟机先将java代码编译成jvm自己的字节码,jvm执行的过程中会将字节码解释机器处理的二进制码,jvm通过调用操作系统的指令集,cup去实现相关的指令操作,完成内存调用。
3.壳
大家都知道shell,Linux操作系统管理硬件,Linux向上提供统一接口,shell命令就是操作这些指令的,可以看出Linux的shell编程就等于上面的JVM编译之后的jvm指令。而Shell命令调用中间层,中间呼叫层会将输入的命令解释给操作系统接口来管理和调用各种硬件,我们形象的称之为“壳”,说白了跟设计模式里面的门面模式一个道理,让用户能控制的都是安全稳定的,有风险的操作都在门面之后,保证了操作系统的相对安全。
4.操作系统和CPU,指令集关系
CUP是属于硬件部分,操作系统是软件,操作系统发出指令。首先操作系统还是普通的应用程序最终都得转化到二进制代码才能够被cpu所处理。而用高级语言编写的普通应用程序都必须经过编译器编译后成为二进制代码(指令)才能运行。而不同的cpu所实现的指令集不同,所以不同的指令集对应的编译器也不尽相同,编译器不同,相同的高级语言程序经过编译后所得到的二进制代码也不同。这就引出了“移植”和“跨平台”两个概念,jvm在这方便做的还是比较出色的。
5.内存操作
我们对于计算机的操作,事实上都是对内存模型(或者说内存的数据结构)在操作,内存首先是建立操作系统的内存模型,然后其他内存模型都建立在操作系统的内存模型之上或者跟操作系统内存模型有关。比如JVM的内存模型,当我们操作数据的时候,JVM内存模型发生变化,从而控制操作系统,操作系统跟CPU之间完成非常复杂的沟通,然后得出结果,从IO送出信号。而这一切的一切在计算机内部都是所谓的二进制在运行,再向下一点,就是无数个高低电平的变化。而我们的代码其实就是这些内存模型的另一种表示方法,这种表示方法可以让人很容易看懂和改变。
本文链接:https://www.sxlog.com/post/711.html
商务合作 - Email:admin@sxlog.com