Linux中的管道是什麼?管道與共享記憶體的區別有哪些?

老男孩IT教育機構發表於2023-01-05

  管道是什麼?簡單來說就是,一個命令的結果作為另外一個命令(結果)的輸入,管道是linux提供的一種常見的程式通訊工具,也是很多shell命令能夠靈活組合產生強大用途的一個重要工具。

  管道是Linux由Unix那裡繼承過來的程式間的通訊機制,它是Unix早期的一個重要通訊機制。其思想是,在記憶體中建立一個共享檔案,從而使通訊雙方利用這個共享檔案來傳遞資訊。由於這種方式具有單向傳遞資料的特點,所以這個作為傳遞訊息的共享檔案就叫做“管道”。

  在管道的具體實現中,根據通訊所使用的的檔案是否具有名稱,有“匿名管道”和“命名管道”。

  管道與共享記憶體的區別

  乍一看,感覺管道和共享記憶體並不是區別很大,這裡介紹一下兩者之間的區別:

  管道需要在核心和使用者空間進行四次的資料複製:由使用者空間的buf中將資料複製到核心中 -> 核心將資料複製到記憶體中 -> 記憶體到核心 -> 核心到使用者空間的buf。而共享記憶體則只複製兩次資料:使用者空間到記憶體 -> 記憶體到使用者空間。

  管道用迴圈佇列實現,連續傳送資料可以不限大小。共享記憶體每次傳遞資料大小是固定的;

  共享記憶體可以隨機訪問被對映檔案的任意位置,管道只能順序讀寫;

  管道可以獨立完成資料的傳遞和通知機制,共享記憶體需要藉助其他通訊方式進行訊息傳遞。

  也就是說,兩者之間最大的區別就是:

  管道是Linux由Unix那裡繼承過來的程式間的通訊機制,它是Unix早期的一個重要通訊機制。其思想是,在記憶體中建立一個共享檔案,從而使通訊雙方利用這個共享檔案來傳遞資訊。由於這種方式具有單向傳遞資料的特點,所以這個作為傳遞訊息的共享檔案就叫做“管道”。

  在管道的具體實現中,根據通訊所使用的的檔案是否具有名稱,有“匿名管道”和“命名管道”。

  管道與共享記憶體的區別

  乍一看,感覺管道和共享記憶體並不是區別很大,這裡介紹一下兩者之間的區別:

  管道需要在核心和使用者空間進行四次的資料複製:由使用者空間的buf中將資料複製到核心中 -> 核心將資料複製到記憶體中 -> 記憶體到核心 -> 核心到使用者空間的buf。而共享記憶體則只複製兩次資料:使用者空間到記憶體 -> 記憶體到使用者空間。

  管道用迴圈佇列實現,連續傳送資料可以不限大小。共享記憶體每次傳遞資料大小是固定的;

  共享記憶體可以隨機訪問被對映檔案的任意位置,管道只能順序讀寫;

  管道可以獨立完成資料的傳遞和通知機制,共享記憶體需要藉助其他通訊方式進行訊息傳遞。

  也就是說,兩者之間最大的區別就是: 共享記憶體區是最快的可用IPC形式,一旦這樣的記憶體區對映到共享它的程式的地址空間,這些程式間資料的傳遞,就不再透過執行任何進入核心的系統呼叫來傳遞彼此的資料,節省了時間。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2930905/,如需轉載,請註明出處,否則將追究法律責任。

相關文章