Java、JVM、shell和操作系統之間的關係

一、JVM代碼調用流程
在這裏插入圖片描述
操作系統(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同級的另一種應用
在這裏插入圖片描述
其實這個理念跟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和操作系統之間的關係,寫給新人,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章