Linux 處理序間通訊

來源:互聯網
上載者:User

標籤:ges   sele   同步   inux   通用   標準   分布式   first   soc   

處理序間通訊的目的
  1. 資料交換
  2. 狀態同步
  3. 事件通知
  4. 資源共用
  5. 進程式控制制

一般來將進程之間的通訊根據內容可以劃分為兩種,一種是傳輸控制資訊,另一種是傳輸大量的資料。一般控制資訊只有一個或幾個位元組,用來達到進程式控制制操作的高速執行(比如利用訊號量實現進程同步);大量資料的傳輸一般用於進程之間資訊的交換(CS架構中,用戶端和伺服器之間大量資料的互動)[4]。

發展過程

Linux中處理序間通訊(IPC)是從Unix中衍生過來的,最初的Unix具備管道、FIFO、訊號,後來經過貝爾實驗室和BSD(加州大學伯克利分校的伯克利軟體發布中心)的拓展形成了現在的進程通訊基礎。

貝爾實驗室對早期的Unix進程通訊方式進行了拓展,形成了“System V IPC”, 通訊局限於單個電腦內;BSD打破了該限制,形成了基於通訊端的處理序間通訊機制。而Linux將兩者間的特色都繼承了下來,同時它還相容POSIX IPC標準(目前POSIX標準更加通用一些)。

通訊方式
  • 管道
  • 訊號
  • 訊息佇列
  • 訊號量
  • 共用記憶體
  • 通訊端
管道(Pipe)

管道是Unix對作業系統的貢獻之一,它是一個環形緩衝區,允許兩個進程之間以生產者/消費者的模式進行通訊,是一個先進先出的隊列[2]。

管道是一種半雙工的通訊方式(訊息只能單向傳輸)。資料轉送方式似於串流,不提供隨機訪問,進程之間要約定一套資料協議來解析傳輸的資料[5]。資料由作業系統緩衝,直到接收方從中讀取[1],它可以像檔案描述符一樣去通過select,poll和epoll函數去監聽。

管道在建立過程中需要雙方進行協同操作(有些API中開啟管道過程中會阻塞,直到雙方都執行了開啟操作),不能獨立於進程而存在。

管道分為匿名管道和具名管道(Named Pipe):匿名管道只有親緣關係的進程(父進程與子進程之間,或子進程與子進程之間)可以共用;沒有親緣關係的進程之間只能通過具名管道通訊。

FIFO(first-in first-out special file, named pipe)在Linux中屬於一種具名管道。通過繫結檔案系統中指定檔案來代替標準的輸入輸出[1],允許多個進程訪問。

Unix中對管道自動採取互斥保護措施,每次只有一個進程能訪問管道[2]。

訊號(signal)

訊號是用於向一個進程通知某種事件的發生。除了處理序間通訊外還可以發送給進程本身。因為無法利用訊號傳輸資料,所以訊號主要用於進程管理上。

Unix中核心平等的對待所有的訊號,對於同時發生的訊號,一次只給進程一個訊號,而沒有特定的順序。進程間可以互相發送訊號,核心在內部也可能發送訊號[2]。

我們經常使用的 Ctrl+C 就是發送一個退出的訊號給某一進程。

訊息(Message)隊列

訊息佇列的功能類似於信箱,它也可以在沒有親緣關係的進程之間去使用,在雙方沒有直接連接的情況下進行通訊[1]。訊息佇列是直接面對訊息的,訊息的寄件者指定發送的訊息的類型和大小,訊息的接收者指定訊息接收的方式(先進先出的規則或指定的訊息類型)。

克服了訊號承載資訊量少和管道只能承載無格式位元組流的缺點,可以實現進程之間多對一的通訊(C/S模式)。即使是接收者沒有開啟訊息佇列,寄件者仍然可以開啟隊列發送訊息而不阻塞,不需要額外的同步操作,可以避免管道中的開啟和讀寫阻塞問題。

訊息佇列中儲存的訊息數量是有上限的,同時每一條訊息的大小也是有上限的。

共用記憶體

多個進程將同一個共用的記憶體段映射到自己的進程資源中,向同一段記憶體中讀寫資料來進行資料互動,是進程之間通訊速度最快的一種方式,經常與其他通訊機制(訊號量)混合使用來達到處理序間通訊的目的[5]。

Pipe和FIFO以及訊息佇列在互動資訊的時候都需要通過核心拷貝的方式--將資料從發送方拷貝到核心緩衝,再從核心緩衝中拷貝到接收方[6],一次通訊要COPY兩次。而共用記憶體則不需要通過核心拷貝,所以速度上要比Pipe、FIFO和訊息佇列快一些。

共用記憶體通常會在即時性要求比較高的業務情況下使用,比如金融系統中,但涉及到分布式的服務,經常需要跨主機的情況共用記憶體不太適合。

通訊端(Socket)

常用於跨主機的進程通訊,由BSD最早提供,後來被linux所吸收。它有通過網路連接埠跨主機通訊的TCP/IP socket(面向流資料)和UDP socket(面向訊息),也有UNIX domain socket這種只能在本地使用的類型。

Unix domain socket 類似於TCP/IP互連網通訊端,但所有通訊都在核心中進行,使用檔案系統作為其地址空間。進程做為inode來使用一個Unix domain socket,並且多個進程可以與同一個通訊端進行通訊(docker服務監聽本地請求就是通過Unix domain socket)[1]。

進程之間可以使用socket進行雙向通訊。

訊號量

用於不同進程之間,或者同一進程中不同線程之間同步的通訊機制。採用PV原語來實現。

參考連結
  • [1] https://en.wikipedia.org/w/index.php?title=Inter-process_communication&oldid=833805357

  • [2] 《作業系統與精髓》 6.7 Unix的並發機制

  • [3] https://www.ibm.com/developerworks/cn/linux/l-ipc/index.html

  • [4] 《電腦作業系統教程》 清華版 第3版 張堯學 3.7 處理序間通訊

  • [5] https://www.ibm.com/developerworks/cn/aix/library/au-spunix_sharedmemory/

  • [6] http://www.kohala.com/start/unpv22e/unpv22e.chap12.pdf

Linux 處理序間通訊

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.