進程間的6種通信

来源:https://www.cnblogs.com/markseven/archive/2023/03/10/17204391.html
-Advertisement-
Play Games

LVGL是嵌入式設備中常用的圖形顯示庫, 這篇基於 256K Flash 的 AIR32F103CCT6 和 SPI介面的 ST7735 128x160 LCD屏, 介紹 LVGL 在無系統環境和FreeRTO環境, 帶DMA和不帶DMA方式的集成步驟 ...


進程間為什麼需要數據通信?

  • 數據傳輸:一個進程需要將它的數據傳送給另外一個進程。
  • 資源共用:多個進程之間共用相同的資源。
  • 通知事件:一個進程需要向另外一組進程發送消息,通知它們發生了某種事件。
  • 進程式控制制:有些進程需要完全控制另一個進程的執行,該控制進程希望能夠攔截另外一個進程的所有操作,並且能夠及時知道它的狀態改變。

主要有管道、消息隊列、共用記憶體、信號量、信號、Socket等六種方式。

管道

管道的本質是內核中的一個緩存,當記憶體創建一個管道後,Linux會返回兩個文件描述符號,一個是寫入端的描述符,一個是輸出端的描述符,可以通過這兩個描述符往管道里寫入或者讀取數據。如果想要實現兩個進程通過管道來通信,則需要讓創建管道的進程fork子進程,這樣子進程就擁有了父進程的文件描述符,這樣子進程之間可以對同一管道的操作。管道這種進程通信方式雖然使用簡單,但是效率比較低,不適合進程間頻繁地交換數據,並且管道只能傳輸無格式的位元組流

消息隊列

消息隊列的本質就是存放在記憶體中的消息鏈表,而消息本質上是用戶自定義的數據結構。如果進程在消息隊列種讀取了某個消息,這個消息就會被從消息隊列種刪除。

  • 消息隊列允許一個或者多個進程向他寫入或者讀取數據。
  • 消息隊列可以不遵循FIFO,進行消息隨機查詢。
  • 消息隊列的生命周期與內核相同。
  • 消息隊列對於交換較少數量的數據很有用,因為無需避免衝突。因為用戶進程往消息隊列種讀寫數據,需要進行系統調用。如果數據量大會造成頻繁的系統調用,因此需要更多的時間以便於內核介入。

共用記憶體

共用記憶體就是允許不相干的進程將同一段物理記憶體連接到它們各自的地址空間中,使得這些記憶體可以訪問同一個物理空間,這個物理記憶體就成為共用記憶體。

  • 兩個不同進程的邏輯地址通過頁表映射到物理空間的同一區域,它們所共同指向的這塊區域就是共用記憶體
  • 消息隊列無需避免衝突,而共用記憶體機制可能會發生衝突。

信號量

在多道批處理系統中,多個進程是可以併發執行的,但由於系統的資源有限,進程的執行不是一貫到底的, 而是走走停停,以不可預知的速度向前推進(非同步性)。但有時候我們又希望多個進程能密切合作,按照某個特定的順序依次執行,以實現一個共同的任務。

為瞭解決上述這兩個問題,保證共用記憶體在任何時刻只有一個進程在訪問(互斥),並且使得進程們能夠按照某個特定順序訪問共用記憶體(同步),我們就可以使用進程的同步與互斥機制,常見的比如信號量與 PV 操作。進程的同步與互斥其實是一種對進程通信的保護機制,並不是用來傳輸進程之間真正通信的內容的,但是由於它們會傳輸信號量,所以也被納入進程通信的範疇,稱為低級通信

  • 信號量:信號量其實就是一個變數 ,我們可以用一個信號量來表示系統中某種資源的數量。例如系統連接的印表機資源的數量,可以設置一個初值為1的信號量。
  • 原語:操作系統提供的一對原語來對信號量進行操作。
    • P操作:信號量--,表示申請占用一個資源。如果申請結果小於0,則無資源可用,P操作的進程被阻塞。
    • V操作:信號量++,表示釋放一個資源。如果信號量+1<0,表明有進程處於阻塞中等待資源,因此可以喚醒一個等待中的進程,使其運行下去。
    • 可以這麼理解,當信號量的值為 2 的時候,表示有 2 個資源可以使用,當信號量的值為 -2 的時候,表示有兩個進程正在等待使用這個資源。

信號

通過發送指定信號來通知某個非同步事件的發送,以迫使進程進行信號處理程式。信號處理完畢後,被中斷的進程將恢復執行。

  • 信號和信號量是完全不同的概念。
  • 信號是進程通信機制中唯一的非同步通信機制,它可以在任何時候發送信號給某個進程。
  • 信號事件的來源主要有硬體來源和軟體來源。
    • 硬體來源,例如組合鍵Ctrl+C 產生 SIGINT 信號,表示終止該進程。
    • 軟體來源,通過 kill 系列的命令給進程發送信號,比如 kill -9 1111,給PID 1111進程發送SIGKILL信號。

Socket

通過Socket相關協議,一臺電腦可以接收其他電腦的數據,也可以向其他電腦發送數據,當然也能完成同主機上的進程通信。

  • Socket本質上是一個API,是應用層與TCP/IP協議的中間軟體抽象層,對TCP/IP進行了封裝。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 函數 1.1函數的介紹 1.1.1 函數的概述 函數是c語言的功能單位。實現一個功能可以封裝一個函數來實現。 定義函數的時候一切以功能為目的,根據功能去定函數的參數和返回值需要傳哪些數據給函數?(實參)、函數的功能代碼(函數體)如何實現?函數需要返回什麼類型的數據?考慮(傳入參數、函數體、返回值 ...
  • C#參數修飾 ref修飾符: 使用ref修飾符可以使參數成為一個引用類型,從而允許我們在函數中修改該參數的值。如果我們將一個變數傳遞給一個使用ref修飾符的參數,那麼任何對該參數的修改都將影響到原始變數的值。例如: void MyFunction(ref int myParam) { myParam ...
  • 本次使用 SqlConnection 來連接資料庫,使用 DataGridView 來顯示查詢的結果。最終效果如下: 一、連接資料庫 1.獲取連接資料庫所需的字元串,包括伺服器名稱,資料庫名稱,用戶名以及密碼,可在配置文件中配置,或直接在代碼里寫死 在配置文件 App.config 中配置的代碼: ...
  • 前言 ASP.NET Core Web API 介面限流、限制介面併發數量,我也不知道自己寫的有沒有問題,拋磚引玉、歡迎來噴! 需求 寫了一個介面,參數可以傳多個人員,也可以傳單個人員,時間範圍限制最長一個月。簡單來說,當傳單個人員時,介面耗時很短,當傳多個人員時,一般人員會較多,介面耗時較長,一般 ...
  • 在 C# 使用 Solr 搜索 sitecore 的配置信息文件可直接丟進 <Instance>\App_Config 下,sitecore 會自動檢測配置文件更新並載入到記憶體中。 通常情況下,配置信息文件是放在 <Instance>\App_Config\Include\<Project> 下,< ...
  • 1. EF Core簡介Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數據訪問技術。 EF Core 可用作對象關係映射程式 (O/RM),這可以實現以下兩點: 使 .NET 開發人員能夠使用 .NET 對象處理資料庫 ...
  • 如果熟悉 GIthub 我們經常可以在一些開源項目的 PR 上看到會配置測試的驗證以及覆蓋率的報告,並且可以強制覆蓋率不低於設定的值才可以進行 Merge PR。 1.測試 創建一個 xUnit 單元測試項目。 Class /// <summary> /// Represents a class w ...
  • 在合宙上買了一片1.54寸的墨水屏一直在吃灰, 這次趁點亮的機會把AIR32F103上的驅動示例給做了. 將微雪的墨水屏驅動移植到 AIR32F103 上, 代碼已經提交到 GitHub 倉庫, 如果需要驅動其它型號的墨水屏, 編輯 EPD_Config.h 將 #define EPD_1IN54 ... ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...