進程間的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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...