進程、容器與虛擬機的區別

進程、容器與虛擬機

參考:關于進程、容器與虛擬機的區別,你想知道的都在這!

進程、容器與虛擬機的結構圖

在這里插入圖片描述


進程 介紹

進程是一個正在運行的程序,它是一個個可執行文件的實例。當一個可執行文件從硬盤加載到內存中的時候,一個進程就被創建出來了。 所以說,一個進程包括一堆它占用的內存空間以及額外的數據結構,操作系統內核使用這些數據結構來存儲關于該程序的一些類似狀態的重要信息。

一個程序本質上是一堆指令和數據結構,而單個 CPU 同一時間只能執行一條指令,同時 CPU 的頻率非常快,一秒可以執行數億條指令, 因此為了充分榨取 CPU 資源,必須在多個運行的程序之間共享 CPU 執行時間,也就是每個程序每隔一定時間,都可以分配到一些 CPU 執行時間,用來執行該程序的指令,而由于 CPU 執行速度非常快,CPU 切換執行程序的間隔時間非常短,用戶是察覺不出來的。 而在 CPU 切換執行程序的時候,當前程序的執行狀態必須保存在某個地方,因為很快 CPU 會切換回來繼續在剛才的那條指令處接著執行。 進程就是存儲了正在運行的程序的運行狀態的抽象


操作系統對進程隔離了哪些資源?

默認情況下,操作系統對進程的限制非常少,基本上所有操作系統資源對進程都是可見的。少數的幾個限制比如:當將多個進程綁定在同一個端口上的時候, 只有第一個會成功,后續的都會失敗。對進程的隔離主要有兩個方面:

  1. 一個進程只能訪問自己的內存空間,它無法訪問到其他進程的內存空間。
  2. 一個進程只擁有受限的權限,這些權限取決于創建該進程的用戶。比如,/etc/shadow 文件僅 root 用戶可以看,當用 root 用戶執行一個程序的時候,該程序就可以讀寫 /etc/shadow 文件,而非 root 用戶訪問就會直接報錯。

容器技術 介紹

當容器技術在 2013 年興起的時候,很多人將容器視作一個輕量級虛擬機,這個觀點受到很多人的追捧, 因為容器就是為了替換虛擬機而被發明出來的。但從技術的角度看,一個容器更像一個進程,而非虛擬機。

容器的定義在網上有很多版本:

  • Wikipedia 的定義:容器是操作系統級別虛擬化的一個通用術語,業界有很多對容器的實現:Docker, lxc 和 rkt 等等。
  • Unix/Linux System Admin 一書中這樣描述容器:容器是隔離出來的一組進程,這些進程被限制在一個私有的的根文件系統和進程命名空間內。
  • Docker 官網 這樣介紹容器:容器是一個標準單元,它打包了應用程序的源代碼和這些代碼的所有依賴項,以便能夠讓應用程序在多個計算環境中快速部署。

個人對容器的理解是:容器是一組進程,操作系統內核提供了一些強大的功能,能夠讓這些進程假裝運行在一個單獨的機器上面。而在操作系統看來,這些進程跟系統上的其他進程沒有任何區別。以下就是讓這一切成為可能的內核功能:

  • Namespaces: Namespaces 技術能夠讓容器看起來像運行在一臺單獨的機器上那樣。

    Linux man 手冊對 namespace 有一個很棒的描述:Namespace 對全局系統資源進行了抽象,讓身處 namespace 中的進程認為它們獨立擁有這些全局資源。

    Linux 提供了七種不同類型的 namespaces,每種用來隔離不同的資源類型。七種 namespaces 分別對七種不同的全局系統資源進行了抽象、隔離:

    1. cgroups - 隔離根目錄
    2. IPC - 隔離進程間通信
    3. Network - 隔離網絡棧
    4. Mount - 隔離掛載點
    5. PID - 隔離進程 id
    6. User - 隔離用戶 id 和用戶組 id
    7. UTS - 隔離主機名
  • Cgroups:Cgroups 能夠限制一組進程能夠使用的硬件資源。Google 2006年開發了該技術,一開始被稱為進程容器。

  • Capabilities:一個權限點列表,用來控制進程的權限級別。


容器解決了什么問題?

容器能夠讓多個應用同時部署在一臺服務器上的多個隔離的環境中,但是這種隔離是偽隔離,容器假裝擁有自己獨立的操作系統,它可以運行多個進程, 從容器的角度來看,它處于一臺獨立的機器上。相比虛擬機,容器消耗更少的系統資源,這意味著相同的服務上,能夠部署更多的容器,更高的資源利用率。


容器總結

創建容器時,Namespaces 負責將容器中的進程隔離在一個單獨的環境中,Cgroups 負責限制容器能夠使用的硬件資源,例如:CPU, 內存等等。 這樣,容器就能像一臺單獨的虛擬機那樣運行,同時也不會濫用宿主機資源,影響其他進程或容器的運行。


虛擬機(VM)介紹

虛擬機的最原始定義為:一個高效的,隔離出來的真實計算機的副本。

虛擬機代表的是一種計算機虛擬化技術,通常來說,包括兩個部分:

  1. hypervisor:一個運行虛擬機的軟件,它在計算機硬件和虛擬機(VM)之間建立一層抽象,以便帶來更高的靈活性和更高效的資源利用率。
  2. 虛擬機(VM):指的就是虛擬機本身

虛擬機解決了什么問題?

  • 虛擬機最主要的用途,就是在同一臺機器上安裝多個不同的操作系統。

    例如,國內政府部門的網站,銀行發的各種設備基本只能在 Windows 中使用,這個對與 Mac 用戶太不友好了。這時,最優的解決方案就是在 MacOS 上面安裝一個虛擬機軟件,然后安裝一個 Windows 的操作系統。

  • 虛擬機能夠在同一臺機器上同時運行多個應用,這些應用之間徹底隔離,互相不影響,非常的安全。同時能更充分地使用系統資源,避免浪費。

  • 宏觀來說,虛擬化技術最主要的作用在于將單體的硬件資源轉變為可供多個個體共享的資源使用模式,最終目的還是提高系統資源使用效率。

    在虛擬機出現以前,商業公司在每臺服務器上一般只運行一個應用,而當該應用不工作的時候,服務器資源就被白白浪費掉了。虛擬化技術使得一臺服務器上可以跑多個虛擬機,每個虛擬機可以被不同的用戶使用,這種方式大大降低了硬件資源的空置率。

    現在上云的時代,購買的云服務器基本上都是虛擬機。


虛擬機中的隔離

虛擬機是完全跟宿主機操作系統隔離開來的,它們共享硬件資源,也就是說,虛擬機的隔離發生在硬件層面。(現在也可以在宿主機操作系統中創建虛擬機) 這個層面的隔離相比進程和容器來看,更加的徹底和安全。因為進程和容器都依賴宿主機操作系統。

但是,這種徹底隔離的代價,就是會占用物理機器更多的資源,畢竟虛擬機內部有一個完整的操作系統需要運行。


進程、容器與虛擬機的異同

實際應用中,容器既類似虛擬機,也可以說完全不是一類東西,這取決于從哪些角度來看待它們。

從技術的實現原理,宿主機的隔離機制來看(微觀):

  • 進程在操作系統中只有很少的隔離,主要是獨立的內存空間和用戶權限。
  • 容器本質上就是一組進程,相比宿主機中的其他進程,容器中的進程運行在自己獨立的 namespace 中,也不能無限制的使用宿主機資源,但是相比虛擬機,在安全性方面有所欠缺。
  • 虛擬機在操作系統層面擁有完全的隔離,完全是一個獨立的環境,擁有一個構建于硬件之上的完整的操作系統。缺點是會占用較多的硬件資源。

從技術要解決的問題,技術的應用場景來看(宏觀):

  • 進程的出現,是因為 CPU 需要一個對象,用來存儲程序運行期間的狀態、執行上下文等信息。
  • 容器的發明,是為了在操作系統上創建隔離的環境,來同時運行多個應用程序。
  • 虛擬機的出現,讓我們能夠在同一臺機器上面運行多個完全不同的操作系統,或者是創建多個絕對隔離的環境用來運行應用程序。

總結:

  • **從技術的實現原理,宿主機的隔離機制來看:**容器更像進程,而非虛擬機。
  • **從技術要解決的問題,技術的應用場景來看:**容器跟虛擬機非常相似,它們解決的是同樣的問題,也就是在同一臺 機器上,創建隔離的環境運行多個應用程序,提高機器的資源使用率。
  • 通過上面的分析,可以了解到容器是一個非常強大的技術,它吸取了虛擬機的優點,但是輕量得等同于一組進程,同時也很好的控制了這層抽象帶來的資源消耗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用CHAT寫方案?

問CHAT:幫我寫一份航空無動力樂園的可執行方案 CHAT回復: 方案一:概念及地點篩選 航空無動力樂園是指以航空運動為主題,利用自然地形與風力進行滑翔、跳傘等無動力航空運動的戶外休閑娛樂樂園。鑒于此,首需要確定樂園…

Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中,可以通過實現SessionDAO接口來將會話信息保存到Redis中,并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此,要更新Redis中的超時登錄時間,可以按照以下步驟進行操作: 實現Se…

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好,我是DeBug,很高興你能來閱讀!作為一名熱愛編程的程序員,我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里,我將會結合實際項目經驗,分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一, 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) , 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式,分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存:線程之間共享程序的公共狀態,線程之間通過讀-寫內存中的公…

前端知識筆記(四十五)———前端開發與后端開發有什么區別

前端開發和后端開發是Web開發中的兩個關鍵領域,它們負責不同的任務和功能。下面是前端開發和后端開發之間的主要區別: 前端開發: 用戶界面:前端開發主要關注用戶界面的開發,包括網頁的布局、樣式、交互等方面。前端技…

Android集成科大訊飛語音識別與語音喚醒簡易封裝

目錄 一、語音喚醒部分 1、首先在科大訊飛官網注冊開發者賬號 2、配置喚醒詞然后下載sdk 3、選擇對應功能下載 4、語音喚醒lib包全部復制到工程目錄下 5、把語音喚醒詞文件復制到工程的assets目錄 6、復制對應權限到AndroidManifest.xml中 7、喚醒工具類封裝 二、語音識…

Linux學習第46天:Linux音頻驅動試驗:能不能?不行也得行。

Linux版本號4.1.15 芯片I.MX6ULL 大叔學Linux 品人間百味 思文短情長 CAN 是目前應用非常廣泛的現場總線之一,主要應用于汽車電子和工業領域,尤其是汽車 領域,汽車上大量的傳感器與模塊都是通過 C…

十二、MapReduce概述

1、MapReduce (1)采用框架 MapReduce是“分散——>匯總”模式的分布式計算框架,可供開發人員進行相應計算 (2)編程接口: ~Map ~Reduce 其中,Map功能接口提供了“分散”的功能&#xff…

【Java期末復習資料】(1)知識點總結

本文章主要是知識點,后續會出模擬卷 以下是選擇、填空可能考的知識點,多看幾遍,混個眼熟 面向對象程序設計的基本特征是:抽象、封裝、繼承、多態(后三個是三大特性)Java源文件的擴綴名是.java編譯Java App…

知識筆記(五十三)———MySQL 刪除數據表

MySQL中刪除數據表是非常容易操作的,但是你在進行刪除表操作時要非常小心,因為執行刪除命令后所有數據都會消失。 語法 以下為刪除 MySQL 數據表的通用語法: DROP TABLE table_name ; -- 直接刪除表,不檢查是否存在 或 DROP…

neuq-acm預備隊訓練week 8 P8794 [藍橋杯 2022 國 A] 環境治理

題目描述 輸入格式 輸出格式 輸出一行包含一個整數表示答案。 輸入輸出樣例 解題思路 最短路二分 AC代碼 #include<bits/stdc.h> using namespace std; long long temp,n, Q; long long f[105][105],min_f[105][105],cut[105],dis[105][105];//cut為減少多少&#x…

寶塔面板部署Apache服務器搭建本地站點發布到公網可訪問【內網穿透】

文章目錄 前言1. 環境安裝2. 安裝cpolar內網穿透3. 內網穿透4. 固定http地址5. 配置二級子域名6. 創建一個測試頁面 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家…

最短循環節問題 和 最短回文串(kmp , HASH )

給定一個字符串 s&#xff0c;你可以通過在字符串前面添加字符將其轉換為回文串。找到并返回可以用這種方式轉換的最短回文串。 示例 1&#xff1a; 輸入&#xff1a;s "aacecaaa" 輸出&#xff1a;"aaacecaaa"示例 2&#xff1a; 輸入&#xff1a;s &…

Java智慧校園-中小學校園管理系統源碼

智慧校園系統是通過信息化手段&#xff0c;實現對校園內各類資源的有效集成 整合和優化&#xff0c;實現資源的有效配置和充分利用&#xff0c;將校務管理過程的優化協調。為校園提供數字化教學、數字化學習、數字化科研和數字化管理。 致力于為家長和教師提供一個全方位、多層…

scripty妙用

在monorepo項目中&#xff0c;隨著子模塊增多&#xff0c; 每個子項目都需要配置各自的package.json,并且大同小異&#xff0c;為了進一步提高配置效率&#xff0c;引入了scripty&#xff0c;自己寫腳本&#xff0c;直接就可以用哦 1、安裝 npm install scripty --save-dev 2…

ARMday6作業

串口發送指令控制硬件工作 uart1.h #ifndef __UART1_H__ #define __UART1_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" void all_led_init(); void led1_on(); void led2_on(); void led3_o…

代碼隨想錄二刷 | 二叉樹 | 110.平衡二叉樹

代碼隨想錄二刷 &#xff5c; 二叉樹 &#xff5c; 110.平衡二叉樹 題目描述解題思路遞歸迭代 代碼實現遞歸法迭代法 題目描述 110.平衡二叉樹 給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a; 一個二叉…

EMNLP 2023 獲獎論文公布,大模型、NLP等領域火爆

EMNLP是計算語言學和自然語言處理領域頂級國際會議之一&#xff0c;屬于CCF B類&#xff0c;是由 ACL 下屬的SIGDAT小組主辦的NLP領域頂級國際會議&#xff0c;一年舉辦一次。相較于ACL&#xff0c;EMNLP更偏向于NLP在各個領域解決方案的學術探討。 今年的EMNLP 2023 已于2023…