官术网_书友最值得收藏!

1.5 資源的可見性

在良好的UNIX傳統中,Linux擁有默認的全局資源視圖。這就引出了一個問題:什么是全局視圖(相對于什么?),什么是所謂的資源?

為什么我們首先要討論資源可見性呢?主要原因是提高你對這個主題的認識,并使你對現代Linux環境中的一個重要主題—容器—有正確的認識。如果你現在沒有了解所有的細節,那么也不要擔心,我們將在本書中詳細討論這個主題,特別是在第6章,我們將更詳細地討論容器及其構建塊。

你可能聽說過這樣一種說法:在UNIX(擴展為Linux)中,所有東西都是一個文件。在本書中,我們認為資源是任何可以用來幫助軟件執行的東西,包括硬件及其抽象(如CPU和RAM、文件)、文件系統、硬盤驅動器、固態硬盤(SSD)、進程、與網絡相關的東西(如設備或路由表)以及代表用戶的憑證。

Linux中并非所有資源都是文件或通過文件接口表示。然而,也有一些系統,比如Plan 9(https://oreil.ly/5DkY8),在這方面做得更進一步。

讓我們看一下一些Linux資源的具體示例。首先,我們想要查詢一個全局屬性(Linux版本),然后查詢關于正在使用的CPU的特定硬件信息(輸出已被編輯以適應本書版面):

?輸出Linux版本。

?輸出CPU相關信息,過濾模型。

通過前面的命令,我們了解到這個系統有四個Intel i7核可供使用。當使用不同的用戶登錄時,你希望看到相同數量的CPU嗎?

讓我們考慮一種不同類型的資源:文件。例如,如果用戶troy在/tmp/myfile下創建了一個有權限的文件(見4.3節),那么另一個用戶worf會看到這個文件,甚至能夠對它進行寫操作嗎?

或者,以進程為例,也就是說,內存中的程序具有運行所需的所有資源,如CPU和內存。Linux使用進程ID(簡稱PID,見2.3.1節)來標識進程:

?輸出進程狀態(即當前進程的詳細信息)并限制輸出,只顯示前六行。

什么是$$

你可能已經注意到$$,并想知道這是什么意思。這是一個特殊的變量,指的是當前進程(詳見3.1.2節)。注意,在shell上下文中,$$是你在其中鍵入命令的shell(例如bash)的進程ID。

Linux中可以有多個具有相同PID的進程嗎?這個聽起來很傻很沒用的問題其實是容器的基礎(參見6.6節)。答案是肯定的,可以有多個具有相同PID的進程,在不同的上下文中稱為命名空間(參見6.6.1節)。這可能發生在容器化的設置中,比如當你在Docker或Kubernetes中運行應用程序時。

每個單獨的進程都可能認為它是特殊的,具有PID 1,在更傳統的設置中,PID 1是為用戶空間進程樹的根保留的(更多細節請參閱6.2節)。

從這些觀測中我們可以了解到,給定資源上可以有一個全局視圖(兩個用戶在完全相同的位置看到一個文件),也可以有一個本地或虛擬化視圖,例如進程示例。這就提出了一個問題:Linux中的所有東西都是默認全局的嗎?劇透一下:不是的。讓我們仔細看看。

讓多個用戶或進程并行運行的部分錯覺是對資源的(受限的)可見性。在Linux中提供本地視圖(某些受支持的)的方法是通過命名空間(參見6.6.1節)。

第二個獨立的方面是隔離。當我在這里使用術語“隔離”時,我并不一定要限定它—也就是說,我沒有假設事物隔離得有多好。例如,考慮進程隔離的一種方法是限制內存消耗,以便一個進程不能占用其他進程的內存。例如,我給你的應用程序使用1GB的RAM,如果它使用了更多,它就會因內存不足(https://oreil.ly/kvk1u)而停止響應。這提供了一定程度的保護。在Linux中,我們使用一個叫作cgroups的內核特性來提供這種隔離,在6.6.2節中,你將了解到更多關于它的知識。

另外,完全隔離的環境會讓應用程序看起來完全獨立。例如,虛擬機(VM,請參見9.2節)可以用來為你提供完全隔離。

主站蜘蛛池模板: 宣化县| 灵台县| 巫山县| 沧源| 瓦房店市| 平乡县| 库伦旗| 隆化县| 北票市| 嘉鱼县| 长沙市| 随州市| 准格尔旗| 宁安市| 清河县| 大关县| 荣成市| 陵川县| 永平县| 宜昌市| 农安县| 稻城县| 商丘市| 外汇| 夹江县| 乾安县| 丰顺县| 图片| 新沂市| 镇远县| 无为县| 防城港市| 水富县| 鄂州市| 清远市| 林芝县| 顺平县| 林甸县| 凤阳县| 通辽市| 乐都县|