刷單類網(wǎng)站開發(fā)競價(jià)推廣托管多少錢
進(jìn)程、容器與虛擬機(jī)
參考:關(guān)于進(jìn)程、容器與虛擬機(jī)的區(qū)別,你想知道的都在這!
進(jìn)程、容器與虛擬機(jī)的結(jié)構(gòu)圖
進(jìn)程 介紹
進(jìn)程是一個(gè)正在運(yùn)行的程序,它是一個(gè)個(gè)可執(zhí)行文件的實(shí)例。當(dāng)一個(gè)可執(zhí)行文件從硬盤加載到內(nèi)存中的時(shí)候,一個(gè)進(jìn)程就被創(chuàng)建出來了。 所以說,一個(gè)進(jìn)程包括一堆它占用的內(nèi)存空間以及額外的數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)內(nèi)核使用這些數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)關(guān)于該程序的一些類似狀態(tài)的重要信息。
一個(gè)程序本質(zhì)上是一堆指令和數(shù)據(jù)結(jié)構(gòu),而單個(gè) CPU 同一時(shí)間只能執(zhí)行一條指令,同時(shí) CPU 的頻率非???#xff0c;一秒可以執(zhí)行數(shù)億條指令, 因此為了充分榨取 CPU 資源,必須在多個(gè)運(yùn)行的程序之間共享 CPU 執(zhí)行時(shí)間,也就是每個(gè)程序每隔一定時(shí)間,都可以分配到一些 CPU 執(zhí)行時(shí)間,用來執(zhí)行該程序的指令,而由于 CPU 執(zhí)行速度非???#xff0c;CPU 切換執(zhí)行程序的間隔時(shí)間非常短,用戶是察覺不出來的。 而在 CPU 切換執(zhí)行程序的時(shí)候,當(dāng)前程序的執(zhí)行狀態(tài)必須保存在某個(gè)地方,因?yàn)楹芸?CPU 會(huì)切換回來繼續(xù)在剛才的那條指令處接著執(zhí)行。 進(jìn)程就是存儲(chǔ)了正在運(yùn)行的程序的運(yùn)行狀態(tài)的抽象。
操作系統(tǒng)對(duì)進(jìn)程隔離了哪些資源?
默認(rèn)情況下,操作系統(tǒng)對(duì)進(jìn)程的限制非常少,基本上所有操作系統(tǒng)資源對(duì)進(jìn)程都是可見的。少數(shù)的幾個(gè)限制比如:當(dāng)將多個(gè)進(jìn)程綁定在同一個(gè)端口上的時(shí)候, 只有第一個(gè)會(huì)成功,后續(xù)的都會(huì)失敗。對(duì)進(jìn)程的隔離主要有兩個(gè)方面:
- 一個(gè)進(jìn)程只能訪問自己的內(nèi)存空間,它無法訪問到其他進(jìn)程的內(nèi)存空間。
- 一個(gè)進(jìn)程只擁有受限的權(quán)限,這些權(quán)限取決于創(chuàng)建該進(jìn)程的用戶。比如,
/etc/shadow
文件僅 root 用戶可以看,當(dāng)用 root 用戶執(zhí)行一個(gè)程序的時(shí)候,該程序就可以讀寫/etc/shadow
文件,而非 root 用戶訪問就會(huì)直接報(bào)錯(cuò)。
容器技術(shù) 介紹
當(dāng)容器技術(shù)在 2013 年興起的時(shí)候,很多人將容器視作一個(gè)輕量級(jí)虛擬機(jī),這個(gè)觀點(diǎn)受到很多人的追捧, 因?yàn)槿萜骶褪菫榱颂鎿Q虛擬機(jī)而被發(fā)明出來的。但從技術(shù)的角度看,一個(gè)容器更像一個(gè)進(jìn)程,而非虛擬機(jī)。
容器的定義在網(wǎng)上有很多版本:
Wikipedia
的定義:容器是操作系統(tǒng)級(jí)別虛擬化的一個(gè)通用術(shù)語,業(yè)界有很多對(duì)容器的實(shí)現(xiàn):Docker, lxc 和 rkt 等等。Unix/Linux System Admin
一書中這樣描述容器:容器是隔離出來的一組進(jìn)程,這些進(jìn)程被限制在一個(gè)私有的的根文件系統(tǒng)和進(jìn)程命名空間內(nèi)。Docker 官網(wǎng)
這樣介紹容器:容器是一個(gè)標(biāo)準(zhǔn)單元,它打包了應(yīng)用程序的源代碼和這些代碼的所有依賴項(xiàng),以便能夠讓應(yīng)用程序在多個(gè)計(jì)算環(huán)境中快速部署。
個(gè)人對(duì)容器的理解是:容器是一組進(jìn)程,操作系統(tǒng)內(nèi)核提供了一些強(qiáng)大的功能,能夠讓這些進(jìn)程假裝運(yùn)行在一個(gè)單獨(dú)的機(jī)器上面。而在操作系統(tǒng)看來,這些進(jìn)程跟系統(tǒng)上的其他進(jìn)程沒有任何區(qū)別。以下就是讓這一切成為可能的內(nèi)核功能:
-
Namespaces: Namespaces 技術(shù)能夠讓容器看起來像運(yùn)行在一臺(tái)單獨(dú)的機(jī)器上那樣。
Linux
man
手冊對(duì) namespace 有一個(gè)很棒的描述:Namespace 對(duì)全局系統(tǒng)資源進(jìn)行了抽象,讓身處 namespace 中的進(jìn)程認(rèn)為它們獨(dú)立擁有這些全局資源。Linux 提供了七種不同類型的 namespaces,每種用來隔離不同的資源類型。七種 namespaces 分別對(duì)七種不同的全局系統(tǒng)資源進(jìn)行了抽象、隔離:
- cgroups - 隔離根目錄
- IPC - 隔離進(jìn)程間通信
- Network - 隔離網(wǎng)絡(luò)棧
- Mount - 隔離掛載點(diǎn)
- PID - 隔離進(jìn)程 id
- User - 隔離用戶 id 和用戶組 id
- UTS - 隔離主機(jī)名
-
Cgroups:Cgroups 能夠限制一組進(jìn)程能夠使用的硬件資源。Google 2006年開發(fā)了該技術(shù),一開始被稱為進(jìn)程容器。
-
Capabilities:一個(gè)權(quán)限點(diǎn)列表,用來控制進(jìn)程的權(quán)限級(jí)別。
容器解決了什么問題?
容器能夠讓多個(gè)應(yīng)用同時(shí)部署在一臺(tái)服務(wù)器上的多個(gè)隔離的環(huán)境中,但是這種隔離是偽隔離,容器假裝擁有自己獨(dú)立的操作系統(tǒng),它可以運(yùn)行多個(gè)進(jìn)程, 從容器的角度來看,它處于一臺(tái)獨(dú)立的機(jī)器上。相比虛擬機(jī),容器消耗更少的系統(tǒng)資源,這意味著相同的服務(wù)上,能夠部署更多的容器,更高的資源利用率。
容器總結(jié)
創(chuàng)建容器時(shí),Namespaces 負(fù)責(zé)將容器中的進(jìn)程隔離在一個(gè)單獨(dú)的環(huán)境中,Cgroups 負(fù)責(zé)限制容器能夠使用的硬件資源,例如:CPU, 內(nèi)存等等。 這樣,容器就能像一臺(tái)單獨(dú)的虛擬機(jī)那樣運(yùn)行,同時(shí)也不會(huì)濫用宿主機(jī)資源,影響其他進(jìn)程或容器的運(yùn)行。
虛擬機(jī)(VM)介紹
虛擬機(jī)的最原始定義為:一個(gè)高效的,隔離出來的真實(shí)計(jì)算機(jī)的副本。
虛擬機(jī)代表的是一種計(jì)算機(jī)虛擬化技術(shù),通常來說,包括兩個(gè)部分:
- hypervisor:一個(gè)運(yùn)行虛擬機(jī)的軟件,它在計(jì)算機(jī)硬件和虛擬機(jī)(VM)之間建立一層抽象,以便帶來更高的靈活性和更高效的資源利用率。
- 虛擬機(jī)(VM):指的就是虛擬機(jī)本身
虛擬機(jī)解決了什么問題?
-
虛擬機(jī)最主要的用途,就是在同一臺(tái)機(jī)器上安裝多個(gè)不同的操作系統(tǒng)。
例如,國內(nèi)政府部門的網(wǎng)站,銀行發(fā)的各種設(shè)備基本只能在 Windows 中使用,這個(gè)對(duì)與 Mac 用戶太不友好了。這時(shí),最優(yōu)的解決方案就是在 MacOS 上面安裝一個(gè)虛擬機(jī)軟件,然后安裝一個(gè) Windows 的操作系統(tǒng)。
-
虛擬機(jī)能夠在同一臺(tái)機(jī)器上同時(shí)運(yùn)行多個(gè)應(yīng)用,這些應(yīng)用之間徹底隔離,互相不影響,非常的安全。同時(shí)能更充分地使用系統(tǒng)資源,避免浪費(fèi)。
-
宏觀來說,虛擬化技術(shù)最主要的作用在于將單體的硬件資源轉(zhuǎn)變?yōu)榭晒┒鄠€(gè)個(gè)體共享的資源使用模式,最終目的還是提高系統(tǒng)資源使用效率。
在虛擬機(jī)出現(xiàn)以前,商業(yè)公司在每臺(tái)服務(wù)器上一般只運(yùn)行一個(gè)應(yīng)用,而當(dāng)該應(yīng)用不工作的時(shí)候,服務(wù)器資源就被白白浪費(fèi)掉了。虛擬化技術(shù)使得一臺(tái)服務(wù)器上可以跑多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)可以被不同的用戶使用,這種方式大大降低了硬件資源的空置率。
現(xiàn)在上云的時(shí)代,購買的云服務(wù)器基本上都是虛擬機(jī)。
虛擬機(jī)中的隔離
虛擬機(jī)是完全跟宿主機(jī)操作系統(tǒng)隔離開來的,它們共享硬件資源,也就是說,虛擬機(jī)的隔離發(fā)生在硬件層面。(現(xiàn)在也可以在宿主機(jī)操作系統(tǒng)中創(chuàng)建虛擬機(jī)) 這個(gè)層面的隔離相比進(jìn)程和容器來看,更加的徹底和安全。因?yàn)檫M(jìn)程和容器都依賴宿主機(jī)操作系統(tǒng)。
但是,這種徹底隔離的代價(jià),就是會(huì)占用物理機(jī)器更多的資源,畢竟虛擬機(jī)內(nèi)部有一個(gè)完整的操作系統(tǒng)需要運(yùn)行。
進(jìn)程、容器與虛擬機(jī)的異同
實(shí)際應(yīng)用中,容器既類似虛擬機(jī),也可以說完全不是一類東西,這取決于從哪些角度來看待它們。
從技術(shù)的實(shí)現(xiàn)原理,宿主機(jī)的隔離機(jī)制來看(微觀):
- 進(jìn)程在操作系統(tǒng)中只有很少的隔離,主要是獨(dú)立的內(nèi)存空間和用戶權(quán)限。
- 容器本質(zhì)上就是一組進(jìn)程,相比宿主機(jī)中的其他進(jìn)程,容器中的進(jìn)程運(yùn)行在自己獨(dú)立的 namespace 中,也不能無限制的使用宿主機(jī)資源,但是相比虛擬機(jī),在安全性方面有所欠缺。
- 虛擬機(jī)在操作系統(tǒng)層面擁有完全的隔離,完全是一個(gè)獨(dú)立的環(huán)境,擁有一個(gè)構(gòu)建于硬件之上的完整的操作系統(tǒng)。缺點(diǎn)是會(huì)占用較多的硬件資源。
從技術(shù)要解決的問題,技術(shù)的應(yīng)用場景來看(宏觀):
- 進(jìn)程的出現(xiàn),是因?yàn)?CPU 需要一個(gè)對(duì)象,用來存儲(chǔ)程序運(yùn)行期間的狀態(tài)、執(zhí)行上下文等信息。
- 容器的發(fā)明,是為了在操作系統(tǒng)上創(chuàng)建隔離的環(huán)境,來同時(shí)運(yùn)行多個(gè)應(yīng)用程序。
- 虛擬機(jī)的出現(xiàn),讓我們能夠在同一臺(tái)機(jī)器上面運(yùn)行多個(gè)完全不同的操作系統(tǒng),或者是創(chuàng)建多個(gè)絕對(duì)隔離的環(huán)境用來運(yùn)行應(yīng)用程序。
總結(jié):
- **從技術(shù)的實(shí)現(xiàn)原理,宿主機(jī)的隔離機(jī)制來看:**容器更像進(jìn)程,而非虛擬機(jī)。
- **從技術(shù)要解決的問題,技術(shù)的應(yīng)用場景來看:**容器跟虛擬機(jī)非常相似,它們解決的是同樣的問題,也就是在同一臺(tái) 機(jī)器上,創(chuàng)建隔離的環(huán)境運(yùn)行多個(gè)應(yīng)用程序,提高機(jī)器的資源使用率。
- 通過上面的分析,可以了解到容器是一個(gè)非常強(qiáng)大的技術(shù),它吸取了虛擬機(jī)的優(yōu)點(diǎn),但是輕量得等同于一組進(jìn)程,同時(shí)也很好的控制了這層抽象帶來的資源消耗。