【Linux庖丁解牛】— 信號量ipc管理!

1. 并發編程概念鋪墊

> 多個執行流【進程】看到同一份資源:共享資源

> 被保護起來的資源叫做臨界資源

> 在進程中,涉及臨界資源的程序段叫做臨界區。【說人話就是程序中訪問共享資源的代碼】

> 什么是互斥:任何時刻,只允許一個執行流訪問資源叫叫作互斥。【比如,一個進程在訪問臨界資源的時候,另一個進程無法訪問,直到前者訪問結束解鎖,將鎖交給后者,后者才能訪問臨界區!】

> 什么是同步:多個執行流,訪問臨界資源的時候,具有一定的順序性,叫做同步。

> 所謂對共享資源的保護,本質上是對共享資源代碼的保護【即對臨界區的保護】。

2. 認識并理解信號量

什么是信號量呢?信號量本質就是計數器,用來描述臨界資源中資源的多少。

我們的進程在訪問臨界資源時,并不是說,你想訪問就訪問。其實,臨界資源也是分一塊一塊的,每個進程如果成功訪問臨界資源,那么這塊臨界資源就勢必會被占用。一旦臨界資源被占滿了,后來的進程就無法再訪問臨界資源了。系統又是如何做到這一點的呢?所有進程在訪問臨界資源之前,都必須要先申請信號量【我們現在可以簡單把它理解為一個整形變量的計數器,用來描述臨界資源的多少】,一旦申請成功,計數器減減。至此,該進程就可以隨時訪問系統為其分配的臨界資源。但是,如果資源不夠,那么該進程就會被阻塞掛起。所以,信號量的本質是對資源的預定機制

細節一:信號量需要被所有進程訪問,那么信號量本身就是共享資源。信號量需要被保護起來,那么對于信號量的操作必須是要原子性的。我們把申請信號量,計數器++叫做p操作,進程結束訪問臨界資源,計數器--叫做v操作。所以,信號量通過PV操作來完成資源的預定機制。【而這兩個操作都必須是要原子性的,至于如何保證原子性后面再說】

細節二:只有1和0兩態的信號量叫做二元信號量【也就是互斥】

細節三:信號量和通信有什么關系呢?為什么信號量會被歸為進程間通信的范疇呢

首先,進程對資源的訪問,都必須要先申請信號量,所以進程看到了同一份資源。其次,不只是傳遞數據才是進程間通信,同步互斥通知也是進程間通信。比如:在進程a申請信號量時,計數器為0,那么進程a申請信號量失敗,進程a則阻塞掛起到等待隊列中。有朝一日,進程b訪問臨界資源結束,釋放資源,計數器++,進程a看到后被喚醒申請臨界資源。在上面這個例子中,進程b通過信號量完成了對進程a的控制

3. 系統如何管理組織ipc

我們前面一直說,系統內部有描述共享內存|消息隊列|信號量的結構體對象,我們也可以理解。但是,系統內部是如何管理組織這些結構體對象呢???

不急,我們先來看看一些有關消息隊列和信號量的接口:

信號量創建接口:

信號量控制接口:

消息隊列創建接口:

?消息隊列控制接口:

通過觀察以上的接口,我們發現描述這些ipc的結構體對象都有一個共性:就是它們都命名為struct xxxid_ds,并且第一個成員類型都是struct ipc_perm,而且ipc_perm中的第一個成員都是key

因此,我們可以得出一個結論:在Linux內核中,共享內存,消息隊列,信號量都用key來唯一區分!并且它們被系統當做了同一種資源。?

事實上,在Linux內核中,有一種全局的數據結構來管理組織ipc,就是struct ipc_ids。其中,entries指針指向ipc_id_ary,ipc_id_ary中有一個結構叫柔性數組

?而該柔性數組中則管理了內核中的所有ipc,無論是共享內存,消息隊列還是信號量。但是,系統又是如何區分不同的結構體呢【畢竟柔性數組若是沒有相應的類型,我們就這能獲得它指向元素的第一個成員】??我們可以這樣理解,在創建控制不同類型的ipc時,我們使用的系統調用是不同的,內核中對柔性數組可以因此來區分不同類型的結構體,到時用得到的類型進行強轉即可。至此,我們也終于明白了,xxxid為什么在不斷的增長,因為他就是柔性數組的下標,我們也不用擔心數組下標越界。當下標到達最大值時,管理柔性數組的結構體會對其下標進行回繞。

下面是部分內核圖幫我們理解:

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

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

相關文章

Spring Boot全局異常處理詳解

原代碼:package com.weiyu.exception;import com.weiyu.pojo.Result; import com.weiyu.utils.ErrorFileResponseUtils; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import …

FHE技術將徹底改變在線隱私保護方式

1. 在線隱私的簡史 互聯網剛剛誕生時,所有的內容都是未加密的。人們通過一個特定的地址訪問網站,這個地址以“HTTP”開頭。當時,這并不是什么大問題,因為人們在線訪問的都是內容,而這些內容本身已經是公開的。但隨著電…

Cursor配置Java環境、創建Spring Boot項目

一:配置JDK和Maven cursor默認會讀取環境變量JAVA_HOME和MAVEN_HOME,如果沒有配置去找默認路徑~/.m2/settings.xml也可以手動指定:Ctrl Shift P 輸入"Preferences:Open User Settings(JSON)"打開settings.json文件,然…

win11添加無線顯示器(兩個筆記本實現雙屏)

前置條件: 兩個筆記本要要支持無線顯示器,支持藍牙; 1、自己重裝的win11系統,首先根據網上說明進去的時候,紅色顯示無無線投屏; 2、安裝網上操作,查看自己電腦是否支持無線投屏(是支…

【MAC技巧】Bash/Zsh切換失敗的故障排除

【MAC技巧】Bash/Zsh切換失敗的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac電腦中,終端(Terminal)是常用的命令行工具,對開發和運維至關重要。 依照蘋果電腦的系統軟件迭代,終端中存有B…

卷積神經網絡-卷積的分類

卷積的定義卷積是圖像處理中最核心的操作之一,其本質是通過卷積核(濾波器)與圖像進行滑動窗口計算(像素值乘積之和),實現對圖像特征的提取、增強或抑制。一、二維卷積--針對二維矩陣進行處理1.1單通道見得最…

全網首發:使用GIT下載時崩潰退出,是因為機械硬盤

前面有幾篇文章,說是GIT下載會退出。開始以為是虛擬機問題。把家里的虛擬機復制到公司,照樣崩潰。后來認為是內存不足。昨天在家里下載代碼,也崩潰退出。心里覺得奇怪,試了一次,還是退出。差別在哪里?之前是…

YAML 自動化用例中 GET vs POST 請求的參數寫法差異

GET 請求:用 params 傳參(附加在 URL 上) config:name: "GET 查詢用戶信息"base_url: "https://api.example.com"teststeps:- name: "根據 userId 查詢用戶信息"request:method: GETurl: /api/user/detailpara…

使用 SeaTunnel 建立從 MySQL 到 Databend 的數據同步管道

SeaTunnel 是一個非常易用、超高性能的分布式數據集成平臺,支持實時海量數據同步。 每天可穩定高效地同步數百億數據,已被近百家企業應用于生產,在國內較為普及。 Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實時分…

linux服務器換ip后客戶端無法從服務器下載數據到本地問題處理

服務器換ip后客戶端無法從服務器下載數據到本地,根據上圖提示,讓用戶清理下~/.ssh/known_hosts文件,下載恢復正常。

從0到1實現Shell!Linux進程程序替換詳解

目錄從0到1實現Shell!Linux進程程序替換詳解 🚀引言:為什么進程需要"變身術"?一、程序替換:進程的"換衣服"魔法 🔄1.1 什么是程序替換?1.2 程序替換的原理:內存…

暑期算法訓練.2

目錄 6.力扣 11.盛水最多的容器 6.1 題目解析: 6.2 算法思路: 6.2.1 暴力解法: 6.2.2 優化算法: 6.3 代碼演示: ?編輯 6.4 總結反思: 7.力扣 611.有效的三角形個數 7.1 題目解析: 7.2…

華為OD 消消樂游戲

1. 題意 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度。 輸入 輸入原始…

小白學HTML,操作HTML文件篇(2)

目錄 一、添加多媒體 1.添加網頁圖片 2.添加網頁音頻 3.添加網頁視頻 二、創建容器 1. 標簽 2.布局 三、創建表格 1.表格標簽 2.添加表格表頭 3.添加表格標題 一、添加多媒體 在 HTML 網頁中可以輕松地使用標簽來添加圖片、音頻、視頻等多媒體,而這些多媒體并…

微服務架構中實現跨服務的字段級權限統一控制

結合集中式權限管理、分布式上下文傳遞、動態策略執行等技術 ??一、核心架構設計?? ??1. 分層控制模型?? ??網關層??:統一校驗用戶身份與基礎權限,攔截非法請求。 ??服務層??:基于用戶權限動態過濾數據字段,實現業務級控制。 ??策略中心??:集中管理權…

【實現100個unity特效之27】使用unity的ShaderGraph實現一個帶裁剪邊緣光的裁剪效果(2d3d通用)

文章目錄普通裁剪效果1、創建一個Lit Shader Graph2、ShaderGraph前置配置3、添加節點4、效果5、修改裁剪方向帶邊緣色的裁剪1、在裁剪的基礎上添加裁剪邊緣光2、邊緣的亮度3、修改裁剪方向4、效果5、我們可以代碼控制它的變化,如下2D3D游戲通用專欄推薦完結普通裁剪…

Android Scoped Storage適配完全指南

Android Scoped Storage適配完全指南關鍵詞:Android、Scoped Storage、適配、存儲權限、文件訪問摘要:本文將全面介紹Android Scoped Storage的相關知識,從背景出發,詳細解釋核心概念,闡述其原理和架構,給出…

Typecho集成PHPMailer實現郵件訂閱功能完整指南

文章目錄 Typecho使用PHPMailer實現文章推送訂閱功能詳解 1. 背景與需求分析 1.1 為什么選擇PHPMailer 1.2 功能需求 2. 環境準備與配置 2.1 安裝PHPMailer 2.2 數據庫設計 3. 核心功能實現 3.1 郵件服務封裝類 3.2 訂閱功能實現 3.2.1 訂閱表單處理 3.2.2 確認訂閱處理 3.3 文…

無線-二層組網-直接轉發

文章目錄無線二層組網直接轉發🏡作者主頁:點擊! 🤖Datacom專欄:點擊! ??創作時間:2025年07月16日08點00分 無線二層組網 直接轉發 本地轉發中所有的沿途都需要配置對應VLAN的通過&#xff…

gin go-kratos go-zero框架對比

Gin、Go-Kratos 和 Go-Zero 是 Go 語言中三種常見的服務框架,它們在定位、設計理念、復雜度和適用場景上差異較大。下面我們從功能定位、設計理念、優劣對比、使用建議等維度進行深入對比。🧭 一句話總結框架定位Gin輕量級、高性能的 HTTP 路由框架Go-Kr…