Java、JVM、shell和操作系统之间的关系

一、JVM代码调用流程
Java、JVM、shell和操作系统之间的关系_第1张图片
操作系统(Windows/Linux)管理硬件,让硬件能够正常、合理的运行,当然各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件,操作系统还像程序员提供了一层接口,叫做系统呼叫层,程序员可以面向这一层的接口编程,来实现对计算机的控制,而不同的操作系统(或者说不同的CPU架构)所提供的接口都是不一样的,Windows和Linux提供给的那肯定是完全不一样的,虽然站在最终的角度来看都能实现某一功能。

所以同样一个程序是不能在不同的系统上运行的,甚至可能在同一个系统的不同版本都不一定能完美运行,这就是所谓的平台相关的程序,比如C/C++程序,然而计算机和互联网的飞速发展,计算机种类和型号千千万,操作系统也有很多种类,Window、Linux、iOS等,同样一款软件不能不做改变就在不同的操作系统上面运行,这对开发者来说不是很友好。Java语言就能解决这个问题(说成是Java平台更准确,JVM+JavaAPI),鉴于不同的操作系统所需要的程序是不一样的,那么就可以寻找一个方法来解决这个问题,于是JVM就诞生了,又JVM来向下关联所有操作系统,他能操作所有操作系统,向上提供统一接口,也就是JavaAPI,开发者只需要面向JVM(JavaAPI)编程,至于JVM是如何各种不同的操作系统打交道开发者完全不用管,管他是怎么沟通交流的,于是只要面向JVM+JavaAPI编程,一个程序可以在任意操作系统平台上面运行,这就是所谓的跨平台,Java代码和平台是无关的,没有任何关系。这就是Java的跨平台性质。

特别指出:也并不是只能面向JavaAPI编程,其实也可以掉本地接口,只不过不推荐这样做,这样就跟平台相关了,除非万不得已,否则就只使用JavaAPI。

二、Linux中的shell其实就是与JVM同级的另一种应用
Java、JVM、shell和操作系统之间的关系_第2张图片
其实这个理念跟Linux的shell是一样的,Linux操作系统管理硬件,Linux向上提供统一接口,而Shell(就等于是上面的JVM)作为命令输入这和操作系统接口的中间人,中间人会将输入的命令解释给操作系统接口来管理和调用各种硬件,只不过shell没有JVM做得那么彻底,这也就是为什么对于那么多不同的shell来说,输入的命令都基本上是一样的的道理。我们形象的称之为“壳”,说白了跟设计模式里面的门面模式一个道理,让用户能控制的都是安全稳定的,有风险的或者不希望用户触摸得到的就隐藏在门面后面。同时“壳”也能调用其他应用,像什么ls -l,vi,fdisk -l,df -h这种。

由于增加了中间转接层,这也就是为什么Java比C/C++慢的原因,虚拟机需要解释执行。虽然速度慢,但是换来的是跨平台的自由,而且虚拟机性能和各种Java技术的发展,这个解释执行的过程越来越快,以后说不定就追上C/C++了,当然现在的JVM不仅仅是逐行解释执行,还有部分JIT技术和其他很多各方面的提升。

操作系统的核心是不能够让用户随便操作的,于是就有了各种应用来操作操作系统核心,比如java应用,各种桌面英勇,所有应用其实都应该叫做shell,只不过一般的应用都有一个很好听的名字,而Linux就是各种shell,什么bshell、cshell,shell也是一个应用,只不过很特别,通过指令来控制操作系统核心而不是GUI来控制,就跟Windows环境下的DOS模式差不多。

三、代码与内存及硬件的思考

我们对于计算机的操作,事实上都是对内存模型(或者说内存的数据结构)在操作,CPU和内存的通信会触发计算机相关的硬件控制,内存变化的时候他会给CPU发送信号,然后CPU执行相关的操作显示到显示器上面。

内存首先是建立操作系统的内存模型,然后其他内存模型都建立在操作系统的内存模型之上或者跟操作系统内存模型有关。就包括JVM的内存模型,当我们操作数据的时候,JVM内存模型发生变化,从而控制操作系统,操作系统跟CPU之间完成非常复杂的沟通,然后得出结果,从IO送出信号。而这一切的一切在计算机内部都是所谓的二进制在运行,再向下一点,就是无数个高低电平的变化。

而我们的代码其实就是这些内存模型的另一种表示方法,这种表示方法可以让人很容易看懂和改变。我们平常所谓的内存,硬盘这些数据和控制都是逻辑性的,这让人才容易懂,而转换到底层就是物理性的。举个例子:我们平常的String str = “123”,我们人看懂,字符串str赋值123,那么当我们在eclipse中输入String str = "123"点点击Ctrl + S保存,其实CPU和内存之间已经经过了无数次沟通,首先会把"123"转换成二进制,从而保存在硬盘上面的,当我们的JVM开始运行之后,从硬盘把"123"加载内存,当我们调用str这个引用的时候,内存会把"123"在内存中的的数据结构通过高低电平传给cpu,cpu做出运算,控制之后会通过IO,把信号送到屏幕,当然,还需要经过显卡,然后屏幕通过送过来的信号拉扯液晶,从而屏幕上面显示"123"字样。总之一句话,计算机软件其实就是无数次的改变内存模型,我们操作的其实都是内存。

参考:Java、JVM和操作系统之间的关系,写给新人,

你可能感兴趣的:(编程语言)