一、linux下進程間通信的幾種主要手段簡介:
-
管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
-
信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標准的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數);
-
報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺點。
-
共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
-
信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
-
套接口(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
一般來說,linux下的進程包含以下幾個關鍵要素:
-
有一段可執行程序;
-
有專用的系統堆棧空間;
-
內核中有它的控制塊(進程控制塊),描述進程所占用的資源,這樣,進程才能接受內核的調度;
-
具有獨立的存儲空間
另外附上一個很好的博文——進程間的五種通信方式介紹 - wh_sjc的博客 - CSDN博客 https://blog.csdn.net/wh_sjc/article/details/70283843
線程間的通信、同步方式與進程間通信方式 - 星仔的“韻” - CSDN博客
https://blog.csdn.net/liu5320102/article/details/50764645
線程間的通信目的主要是用於線程同步,所以線程沒有像進程通信中的用於數據交換的通信機制。
二、Linux系統中的線程間通信方式主要以下幾種:
互斥鎖確保同一時間只能有一個線程訪問共享資源。當鎖被占用時試圖對其加鎖的線程都進入阻塞狀態(釋放CPU資源使其由運行狀態進入等待狀態)。當鎖釋放時哪個等待線程能獲得該鎖取決於內核的調度。
讀寫鎖當以寫模式加鎖而處於寫狀態時任何試圖加鎖的線程(不論是讀或寫)都阻塞,當以讀狀態模式加鎖而處於讀狀態時“讀”線程不阻塞,“寫”線程阻塞。讀模式共享,寫模式互斥。
條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
自旋鎖上鎖受阻時線程不阻塞而是在循環中輪詢查看能否獲得該鎖,沒有線程的切換因而沒有切換開銷,不過對CPU的霸占會導致CPU資源的浪費。 所以自旋鎖適用於並行結構(多個處理器)或者適用於鎖被持有時間短而不希望在線程切換產生開銷的情況。
* 信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
* 信號機制(Signal):類似進程間的信號處理
linux基礎——linux線程間通信及同步機制總結 - 千里之行,始於足下 - CSDN博客 https://blog.csdn.net/a987073381/article/details/52029070