Linux——system V共享內存

共享內存區是最快的IPC(進程內通信)形式,不再通過執行進入內核的系統調用來傳遞彼此的數據

1.共享內存的原理

IPC通信的本質是讓不同的進程先看到同一份資源,然后再進行通信,所以想要通過共享內存進行通信,那么第一步一定是讓兩個進程能夠看到看到物理內存中的同一份資源。

2.共享內存函數

通過共享內存函數來創建共享內存

shmget

功能
? ? ? ? 創建共享內存

原型

????????int shmget(key_t key, size_t size, int shmflg);

參數

? ? ? ? key:該共享內存段名字

? ? ? ? size:共享內存的大小

? ? ? ? shmflg:由九個權限標志位構成

? ? ? ? ? ? ? ? ? ? ? 若取值為IPC_CREAT:共享內存不存在,創建并返回;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 共享內存存在,獲取并返回;

? ? ? ? ? ? ? ? ? ? ? 若取值為IPC_CREAT | IPC_EXCL:共享內存不存在,創建并返回

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 共享內存已存在,出錯返回

返回值

????????成功返回一個非負整數,即該共享內存的標識碼(shmid)

? ? ? ? 失敗返回-1? ? ? ?

:所以當想要創建一個新的共享內存時,shmflg的取值應為:IPC_CREAT | IPC_EXCL

問:這個key值從何而來?以及這個key值有和作用?

答1:key值是通過ftok函數得來的,ftok會根據文件名/路徑相應的inode以及proj_id生成一個唯一的key值,且該key值和路徑(pathname)是一一對應的關系

ftok:

功能????????

? ? ? ? 用來生成一個唯一的key值,該key值用于IPC 通信,共享內存的位置由系統決定

原型

????????key_t ftok(const char *pathname, int proj_id);

參數

? ? ? ? pathname:文件路徑,必須存在

? ? ? ? proj_id:項目標識符,通常是一個字符(0~255之間的整數)

:為什么是路徑?除了歷史原因之外,路徑具有唯一性。

答2:顯然這個key值是用來創建共享內存的。具體怎么實現的呢?比如當前進程需要創建一個新的共享內存,那么在shmget中,只要key值相同,他們就能夠打開同一個共享內存,此時就滿足了不同進程看到同一份資源的要求。

進程A和進程B的虛擬地址不同,但是它們指向了同一塊物理內存

除了讓不同進程能夠看到同一份資源外,我們還需要將物理內存中的共享內存和進程的虛擬地址建立映射關系

shmat

功能

????????將共享內存段連接到進程地址空間(建立物理內存和虛擬內存間的映射關系)

原型

????????void *shmat(int shmid, const void *shmaddr, int shmflg);

參數

? ? ? ? shmid:創建/打開共享內存成功時返回給當前進程的共享內存標識碼

? ? ? ? shmaddr:指定連接的地址

? ? ? ? shmflg:一般為nulltpr

返回值

? ? ? ? 成功返回一個指針,指向共享內存的第一個節

? ? ? ? 失敗返回-1

當前進程不在使用共享內存時,需要與共享內存脫離

shmdt

功能

????????將共享內存段與當前進程脫離

原型

????????int shmdt(const void *shmaddr);

參數

????????shmaddr: shmat所返回的指針??

返回值

? ? ? ? 成功返回0

? ? ? ? 失敗返回-1

:脫離不等于刪除當前內存段

shmctl

功能

????????用于控制共享內存

原型

????????int shmctl(int shmid, int cmd, struct shmid_ds *buf);

參數

????????shmid:shmget返回的共享內存標識碼

????????cmd:將要采取的動作(有三個可取值)

????????buf:指向?個保存著共享內存的模式狀態和訪問權限的數據結構

返回值

? ? ? ? 成功返回0

? ? ? ? 失敗返回-1

:三個可取值

IPC_STAT:把shmid_ds結構中的數據設置為共享內存的當前關聯值

IPC_SET:在進程有足夠權限的前提下,把共享內存的當前關聯值設置為shmid_ds數據結構中給出的值

IPC_RMID:刪除共享內存段

3.初步認識信號量

對于共享內存而言,它沒有保護機制(當一個用戶的信息還沒有寫完時,可能就被另一個用戶讀走了),沒有保護機制就會造成讀取數據的不一致。因此我們需要引入信號量來解決這個問題

3.1概念補充

在初步認識信號量前,需要對某些概念進行補充。

①:代碼分為臨界區和非臨界區

對于非臨界區而言,即每個程序自己的代碼,他們之間不會相互影響

對于臨界區而言,涉及資源互斥的部分,也就上面提到的共享資源訪問時出現問題的部分

②:互斥

只允許一個程序訪問進程

③:臨界資源

被保護起來的資源

④:同步

多個進程訪問臨界資源時,具有一定的順序性

⑤:原子性

簡單說就是做和不做的區別

:對共享資源的保護,總之就是對訪問共享資源的代碼進行保護

3.2信號量

舉一個電影院的例子:
一個影廳只有100個位置,如果票重復和提供的座位不足以發售的票都會出現問題。那么解決問題的措施就是 1.避免出現座位重復的票 2.避免發售的票太多。因此進入影院前,需要訂票來確定自己座位

對于共享內存而言,將共享內存分塊訪問,那么所做的就是 1.避免多個進程訪問共享內存中的同一塊資源? 2.避免過多進程對該共享內存進行訪問

因此信號量的本質是一個計數器,用于描述臨界資源中,資源數量的多少,如果進程申請資源成功就做減減操作,直至為零。

:任何進程想要訪問臨界資源,必須先申請信號量,本質是對資源(座位)的預訂機制

當進程申請信號量時,就做減減操作,保證該操作具有原子性,該操作稱為p操作

當進程不用時,就做加加操作,同時保證該操作具有原子性,該操作稱為v操作

3.3不同信號量

二元信號量:信號量只有0或者1

多元信號量:1以上就是多元信號量,內部資源可以供多個進程使用

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

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

相關文章

01 SQl注入基礎步驟(數字、字符、布爾盲注、報錯)

目錄 1、SQL注入漏洞的概要 2、SQL注入的常規思路 3、數字型注入 4、字符型注入 5、布爾盲注 6、報錯注入 1、SQL注入漏洞的概要 原理:通過用戶輸入的數據未嚴格過濾,將惡意SQL語句拼接到原始查詢中,從而操控數據庫執行非預期操作。 …

leetcode-sql數據庫面試題沖刺(高頻SQL五十題)

題目: 620.有趣的電影 表:cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是該表的主鍵(具有唯一值…

7.2 奇異值分解的基與矩陣

一、奇異值分解 奇異值分解(SVD)是線性代數的高光時刻。 A A A 是一個 m n m\times n mn 的矩陣,可以是方陣或者長方形矩陣,秩為 r r r。我們要對角化 A A A,但并不是把它化成 X ? 1 A X X^{-1}A X X?1AX 的形…

在本地部署DeepSeek等大模型時,需警惕的潛在安全風險

在本地部署DeepSeek等大模型時,盡管數據存儲在本地環境(而非云端),但仍需警惕以下潛在安全風險: 1. 模型與數據存儲風險 未加密的存儲介質:若訓練數據、模型權重或日志以明文形式存儲,可能被物…

【javaEE】多線程(進階)

1.????前言~🥳🎉🎉🎉 Hello, Hello~ 親愛的朋友們👋👋,這里是E綿綿呀????。 如果你喜歡這篇文章,請別吝嗇你的點贊????和收藏📖📖。如果你對我的…

dify中使用NL2SQL

在 Dify 工作流中融入 NL2SQL(自然語言轉 SQL)之能力,可依循如下步驟達成,借由 Dify 的模塊化設計以及模型編排之功能,優化數據庫查詢之智能化交互: 一、環境準備與 Dify 部署 安裝 Docker 與 Dify 務須確…

使用Everything搜索指定文件夾中的內容

直接路徑搜索法 在 Everything 的搜索框中輸入文件夾路徑加空格,再輸入要搜索的內容或文件名。如要在 D 盤的 “文檔” 文件夾中搜索名為 “報告.docx” 的文件,可輸入 “D:\ 文檔 報告.docx”235。 高級搜索法 打開 Everything 軟件,點擊菜…

Java在小米SU7 Ultra汽車中的技術賦能

目錄 一、智能駕駛“大腦”與實時數據 場景一:海量數據的分布式計算 場景二:實時決策的毫秒級響應 場景三:彈性擴展與容錯機制 技術隱喻: 二、車載信息系統(IVI)的交互 場景一:Android Automo…

Vue開發中計算屬性與方法調用之間的區別與聯系

文章目錄 一 概述二 核心區別三 聯系四 使用原則 一 概述 在 Vue 中,計算屬性(computed) 和 方法(methods) 都可以用于處理數據邏輯,但它們的核心區別在于 緩存機制 和 觸發方式 。 計算屬性示例&#xf…

【Unity】 HTFramework框架(六十一)Project窗口文件夾鎖定器

更新日期:2025年3月7日。 Github源碼:[點我獲取源碼] Gitee源碼:[點我獲取源碼] 索引 Project窗口文件夾鎖定器框架文件夾鎖定自定義文件夾鎖定限制條件 Project窗口文件夾鎖定器 在Project窗口中,文件夾鎖定器能夠為任何文件夾加…

C語言:6.20字符型數據練習題

編寫程序,輸人一行數字字符(用回車結束),每個數字字符 的前后都有空格。 把這一行中的數字轉換成一個整數。 例如,若輸入(<CR>代表 Enter鍵):2 4 8 3<CR>則輸出 整數:2483。 #include <stdio.h>int main() {char ch;int number 0;printf("請輸入一行…

【軟件工程】一篇入門UML建模圖(狀態圖、活動圖、構件圖、部署圖)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;軟件開發必練內功_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 前…

【C語言】數組篇

目錄 引言一維數組數組的定義數組的初始化完全初始化部分初始化省略數組長度 數組元素的訪問 多維數組二維數組的定義二維數組的初始化完全初始化部分初始化省略第一維長度 二維數組元素的訪問 遍歷數組元素遍歷一維數組遍歷二維數組 數組作為函數參數一維數組作為函數參數二維…

OpenCV視頻解碼性能優化十連擊(實測幀率提升300%)

解密工業級視頻處理優化方案&#xff01;從硬件加速到多線程榨干CPU/GPU性能&#xff0c;附RTSP流調優參數與內存泄漏排查技巧。 &#x1f527; 優化前準備 環境檢測腳本 import cv2# 驗證硬件加速支持 print("CUDA支持:", cv2.cuda.getCudaEnabledDeviceCount() &…

基于編譯器特性淺析C++程序性能優化

最近在惡補計算機基礎知識&#xff0c;學到CSAPP第五章的內容&#xff0c;在這里總結并且展開一下C程序性能優化相關的內容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;來衡量&#xff0c;其指的是處理每個元素…

transformer模型介紹——大語言模型 LLMBook 學習(二)

1. transformer模型 1.1 注意力機制 **注意力機制&#xff08;Attention Mechanism&#xff09;**在人工智能中的應用&#xff0c;實際上是對人類認知系統中的注意力機制的一種模擬。它主要模仿了人類在處理信息時的選擇性注意&#xff08;Selective Attention&#xff09;&a…

word甲烷一鍵下標

Sub 甲烷下標()甲烷下標 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…

Dify 本地部署教程

目錄 一、下載安裝包 二、修改配置 三、啟動容器 四、訪問 Dify 五、總結 本篇文章主要記錄 Dify 本地部署過程,有問題歡迎交流~ 一、下載安裝包 從 Github 倉庫下載最新穩定版軟件包,點擊下載~,當然也可以克隆倉庫或者從倉庫里直接下載zip源碼包。 目前最新版本是V…

2.1 掌握XML基礎知識

本文介紹了結構化、半結構化和非結構化數據的概念與特點。結構化數據以固定格式存儲于數據庫&#xff0c;便于查詢與管理&#xff0c;常用于金融等領域。半結構化數據如XML、JSON&#xff0c;具有一定的組織形式但模式不固定&#xff0c;適用于Web內容和日志文件。非結構化數據…

Android Studio 配置國內鏡像源

Android Studio版本號&#xff1a;2022.1.1 Patch 2 1、配置gradle國內鏡像&#xff0c;用騰訊云 鏡像源地址&#xff1a;https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK國內鏡像 地址&#xff1a;Index of /AndroidSDK/