Linux:進程間通信---消息隊列信號量

文章目錄

      • 1.消息隊列
        • 1.1 消息隊列的原理
        • 1.2 消息隊列的系統接口
      • 2. 信號量
        • 2.1 信號量的系統調用接口
      • 3. 淺談進程間通信
        • 3.1 IPC在內核中數據結構設計
        • 3.2 共享內存的缺點
        • 3.3 理解信號量

  • 序:在上一章中,我們引出了命名管道和共享內存的概念,了解了他們的底層原理和系統接口的使用,知道了共享內存的特性等,而本章,我將繼續深入System V的剩下兩種進程間通信的方式:消息隊列和信號量!!!

1.消息隊列

System V IPC{
System V —消息隊列
System V —共享內存
System V —信號量
}
本章將圍繞著system V IPC中的消息隊列和信號量來講述

1.1 消息隊列的原理

消息隊列的原理圖:
在這里插入圖片描述
消息隊列的
1. 必須讓不同進程看到同一個隊列
2. 允許不同的進程,向內核中發送帶類型的數據塊

文件緩沖區----管道
內存塊----共享內存
隊列----消息隊列
這些都符合進程間通信的本質:必須讓不同進程看到同一份資源!!!

1.2 消息隊列的系統接口

要想使用消息隊列實現進程間通信,首先就要先將消息隊列創建出來。
在這里插入圖片描述
第一個參數是通過ftok()函數生成的key,第二個參數是位圖參數,和之前的共享內存一樣,這個函數可以創建一個新的消息隊列

想要修改消息隊列的屬性,就要調用相關的系統接口。
在這里插入圖片描述

向消息隊列中發送和得到數據:
在這里插入圖片描述
其中,msgsnd是發送數據的系統調用接口,msgrcv是獲取數據的系統調用接口

消息隊列的管理結構體:
在這里插入圖片描述

查看消息隊列

ipcs -q 能查看消息隊列信息(和ipcs -m查看共享內存一樣)

刪除消息隊列

ipcrm -q +[msgid] 能刪除消息隊列

2. 信號量

2.1 信號量的系統調用接口

要想使用信號量,和消息隊列,共享內存同理,也是要先去申請一個信號量。
在這里插入圖片描述

和消息隊列,共享內存同理,想要修改信號量的屬性,就要調用相關的系統接口。
在這里插入圖片描述

信號量的管理結構體:
在這里插入圖片描述

3. 淺談進程間通信

3.1 IPC在內核中數據結構設計

在操作系統中,所有IPC資源,都是整合進操作系統的IPC模塊中的!
在這里插入圖片描述

共享內存、消息隊列和信號量這三個的管理結構體內都有一個ipc_perm的結構體,系統通過一個數組對這樣的一個個結構體進行管理,從而對不同的IPC結構體進行管理!!!

通過在struct ipc_perm數組中存入對應IPC結構體中ipc_perm結構體的地址,我們就可以通過這個對這個ipc_perm進行處理為((struct semid_ds * )addr)(以信號量的IPC結構體為例),從而訪問到整個IPC結構體中的任意成員!!!(其中,ipc_perm中有一個類型標志位,所以操作系統能區分指針指向的對象的類型,也就知道了這是共享內存的IPC結構體還是消息隊列的IPC結構體,還是信號量的IPC結構體)

這種模式與c++中的多態有很大的相似度,對于ipc_perm結構體的復用,就像ipc_perm是基類,其他IPC結構體是子類,而實際上cpp就是基于Linux中的這些模式,而引入的多態的概念!!!

3.2 共享內存的缺點

在這里插入圖片描述
當我們的A正在寫入,且已經寫入了一部分,就被B拿走了,導致雙方發送和收到的數據不完整-----數據不一致問題,共享內存會有這樣的問題,而管道則沒有,因為,管道會有同步互斥的保護機制。

1. A、B看到同一份資源,共享內存,如果不加保護,就會導致數據不一致問題
2. 加鎖—互斥訪問—任何時刻,都只允許一個執行流訪問共享資源—互斥(例如:去ATM機取錢的時候,一臺ATM機一次只能有一個人取錢或存錢)
3. 共享的,任何時刻只允許一個執行流訪問的資源—臨界資源—(管道)一般是內存空間。
4. 訪問臨界資源的代碼—臨界區

問題一:多進程,多線程,并發打印,此時顯示器上的消息是錯亂的,甚至和命令行混在一起,這是為什么?

在多進程、多線程中,顯示器是一種共享資源,此時,多進程、多線程往顯示器打印內容就會導致數據不一致問題,要想不錯亂,就要將這個共享資源變成一種臨界資源。

3.3 理解信號量

信號量的本質是一把計數器,類似但不等于一個int cnt = n;是用來描述臨界資源中資源數量的多少
例子:當我們看電影時,我們還沒去看,但是要先買票(買票的本質就是對資源的預定機制),其中票數計數器,每賣一張票,計數器就要減一。此時放映廳的資源就少一個!!!當票數計數器到0后,資源已經被申請完了。

問題一:我們最怕什么情況?

1. 多個執行流訪問同一個資源
2. n個執行流訪問n-1個資源

為了解決這種問題,我們就要引入一個計數器!!!
int cnt = 15;
int number = cnt–;申請資源
cnt <= 0;資源就被申請完了,再有執行流申請也不會給了!!!

1. 申請計數器資源成功,就表示我具有了訪問資源的權限了。
2. 申請了計數器資源,我當前訪問我要的資源了嗎?沒有!申請了計數器資源是對資源的預定機制。
3. 計數器可以有效保證進入共享資源的執行流的數量
4. 每一個執行流,想訪問共享資源的時候,不是直接訪問,而是先申請計數器資源,就像是看電影先買電影票

程序員把這樣一個計數器叫做信號量!!!

所以,當該票只有一個人能搶到,只有一個人能去看電影時。看電影期間只有一個執行流在訪問臨界資源—互斥!!!

我們把值只能為1,0兩態的計數器叫做二元信號量—本質就是一個鎖。
當計數器為1.本質問題:其實就是將臨界資源不要分成很多塊了,而是當做一個整體,整體申請,整體釋放!!!

問題二:要訪問臨界資源,先要申請信號量計數器資源,但是信號量計數器的本質不也是共享資源嗎???所以這個計數器也是不安全的

信號量:
a. 申請信號量,本質是對計數器減減------p操作
b. 釋放資源,釋放信號量,本質是對計數器進行加加操作------v操作

其中信號量的申請和釋放—pv操作–是原子的(一個事,要么不做,要做就做完!)
其中要強調的是,多個信號量和信號量是不同的概念

問題二:信號量憑什么是進程間通信的一種?他也沒傳送數據啊,不是說他的本質就是個計數器嗎?

1. 通信不僅僅是通信數據,互相協同也是
2. 要協同,本質也是通信,信號量首先要被所有的通信進程看到。

總結:

本章節帶領大家從原理和系統接口的視角了解了什么是消息隊列和信號量,而后對進程間通信的內核數據結構進行了探討,了解了其中的底層邏輯,最后再次深入了解什么是信號量,希望對大家能有幫助!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82430.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電子電器架構 --- 車載網關的設計

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

華為云Git使用與GitCode操作指南

案例介紹 本文檔帶領開發者學習如何在云主機上基于GitCode來使用Git來管理自己的項目代碼,并使用一些常用的Git命令來進行Git環境的設置。 案例內容 1 概述 1.1 背景介紹 Git 是一個快速、可擴展的分布式版本控制系統,它擁有異常豐富的命令集,可以提供高級操作和對內部…

ESP32開發入門(七):HTTP開發實踐

一、HTTP協議基礎 1.1 什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最為廣泛的一種網絡協議&#xff0c;用于從服務器傳輸超文本到本地瀏覽器。它是一種無狀態的請求/響應協議&#xff0c;工作…

Python 對象引用、可變性和垃圾 回收(變量不是盒子)

變量不是盒子 1997 年夏天&#xff0c;我在 MIT 學了一門 Java 課程。Lynn Andrea Stein 教授 &#xff08;一位獲獎的計算機科學教育工作者&#xff0c;目前在歐林工程學院教書&#xff09;指 出&#xff0c;人們經常使用“變量是盒子”這樣的比喻&#xff0c;但是這有礙于理…

局域網常用的測速工具,Iperf3使用教程

目錄 下載方式 Windows Linux 使用方法&#xff1a;測試局域網帶寬 步驟一&#xff1a;服務端準備 步驟二&#xff1a;客戶端發起連接 步驟三&#xff1a;查看結果 參數說明 1. Iperf常用參數&#xff08;測試夠用&#xff09; 2. 通用參數&#xff08;Server端和Cli…

《深入理解分布式系統》之認識分布式系統

本文是閱讀深入理解分布式系統第一章認識分布式系統時的筆記。 分布式系統的特點 多進程不共享操作系統不共享時鐘 分布式系統 由多個可獨立運行的子系統組成。每個子系統可以獨立選擇運行平臺。不同的運行平臺存在差異&#xff0c;比如操作系統&#xff0c;硬件規格等。由…

UE5 PCG學習筆記

https://www.bilibili.com/video/BV1onUdY2Ei3/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 一、安裝PCG 插件里選擇以下進行安裝 移動目錄后&#xff0c;可以使用 Update Redirector References&#xff0c;更新下&#xff0…

工業現場ModbusTCP轉EtherNETIP網關引領生物現場領新浪潮

生物質發生器是一種能夠產生、培養生物的設備。客戶現場需要將生物發生器連接到羅克韋爾系統&#xff0c;但是二者協議無法直接通訊&#xff0c;需要通過ModbusTCP轉Ethernet/IP網關將兩者進行通訊連接&#xff0c;生物質發生器以其獨特的工作原理和優勢&#xff0c;使得生物的…

寶藍德中間件部署war包時,配置的絕對路徑讀取錯誤。

文章目錄 問題場景解決辦法寶藍德是什么&#xff1f;&#xff1f;一、基礎環境與依賴配置二、自動化部署工具鏈三、高可用性與集群配置四、安全與合規性措施五、產品線差異化部署六、典型部署流程示例七、運維與優化 原因1. 明確“當前工作目錄”與“絕對路徑”的關系2. 問題根…

Java、Python、NodeJS等開發環境安裝及配置鏡像加速到國內源

文章目錄 Java1.Windows1.1 scoop方式安裝JDK 2.Linux2.1 apt方式安裝JDK2.1.1 切換JDK2.1.2 驗證版本2.1.3 原理 Python1.Windows1.1 scoop方式安裝Python1.2 uv方式安裝Python&#xff08;推薦&#xff09; 2.Linux2.1 apt方式安裝Python2.1.1 配置版本切換2.1.2 切換Python2…

Linux系統管理與編程16:PXE自動化安裝部署centos7.9操作系統

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 0.準備 1&#xff09;防火墻和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

MCP(Model Context Protocol)是專為LLM(大語言模型)應用設計的標準化協議

核心定義 MCP&#xff08;Model Context Protocol&#xff09;是專為LLM&#xff08;大語言模型&#xff09;應用設計的標準化協議&#xff0c;通過安全可控的方式向AI應用暴露數據和功能。主要提供以下能力&#xff1a; 標準化的上下文管理安全的功能調用接口跨平臺的數據交…

Fiori學習專題三十四:Responsiveness

在這一步中&#xff0c;我們提高了應用程序的響應能力。SAPUI5應用程序可以在手機、平板電腦和臺式機設備上運行&#xff0c;我們可以配置應用程序以充分利用每種場景的屏幕狀態。幸運的是&#xff0c;像sap.m.Table這樣的SAPUI5控件已經提供了許多我們可以使用的功能。 1.修改…

解決 TimeoutError: [WinError 10060] 在 FramePack項目中連接 Hugging Face 超時的問題

#工作記錄 以下是針對 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;適用于 FramePack項目中。 &#xff08;一般該錯誤的發生原因請重點排查Hugging Face模型倉庫受限需要登錄的情形&#xff09; FramePack項目參考資料 FramePack部署&#xff08;從PyCharm解…

obj = null; 賦值null之前沒有其他引用指向obj對象,那么,當obj=null時,會被垃圾回收機制立即回收嗎?

不會立即回收。 具體原因是&#xff1a; 賦值 obj null; 后&#xff0c;對象變成“不可達”&#xff0c;符合垃圾回收條件&#xff0c;但垃圾回收器并不會立刻回收它。垃圾回收是CLR自動控制的非確定性過程&#xff0c;什么時候執行回收取決于系統內存壓力、GC策略、分代情況…

【Ubuntu 安裝Docker CE-Jenkins】

安裝Docker CE(Ubuntu) Install | Docker Docs官網 使用apt倉庫安裝 DNS配置(可選) #手動替換 sudo vim /etc/systemd/resolved.conf #典型配置如下 [Resolve] DNS8.8.8.8 DNS114.114.114.114 FallbackDNS1.1.1.1 # 備用 DNS#sed替換 sudo sed -i /^#DNS/ {s/#DNS/DNS8.8.8…

5、開放式PLC梯形圖編程組件 - /自動化與控制組件/open-plc-programming

76個工業組件庫示例匯總 開放式PLC編程環境 這是一個開放式PLC編程環境的自定義組件&#xff0c;提供了一個面向智能倉儲堆垛機控制的開放式PLC編程環境。該組件采用蘋果科技風格設計&#xff0c;支持多廠商PLC硬件&#xff0c;具有直觀的界面和豐富的功能。 功能特點 多語…

內網和外網怎么互通?外網訪問內網的幾種簡單方式

在企業或家庭網絡中&#xff0c;經常會遇到不同內網環境下網絡互通問題。例如&#xff0c;當公司本地局域網內有個辦公OA網站&#xff0c;在辦公室內電腦上網可以登錄使用&#xff0c;但在家帶寬下就無法直接通信訪問到。這就需要我們采取一些實用的內外網互通技巧來解決這個問…

使用大語言模型進行機器人規劃(Robot planning with LLMs)

李升偉 編譯 長期規劃在機器人學領域可以從經典控制方法與大型語言模型在現實世界知識能力的結合中獲益。 在20世紀80年代&#xff0c;機器人學和人工智能&#xff08;AI&#xff09;領域的專家提出了莫雷奇悖論&#xff0c;觀察到人類看似簡單的涉及移動和感知的任務&#x…

【計算機視覺】OpenCV實戰項目: opencv-text-deskew:實時文本圖像校正

opencv-text-deskew&#xff1a;基于OpenCV的實時文本圖像校正 一、項目概述與技術背景1.1 核心功能與創新點1.2 技術指標對比1.3 技術演進路線 二、環境配置與算法原理2.1 硬件要求2.2 軟件部署2.3 核心算法流程 三、核心算法解析3.1 文本區域定位3.2 角度檢測優化3.3 仿射變換…