【深入學習Linux】System V共享內存

目錄

前言

一、共享內存是什么?

共享內存實現原理

共享內存細節理解

二、接口認識

1.shmget函數——申請共享內存

?2.ftok函數——生成key值

再次理解ftok和shmget

1)key與shmid的區別與聯系

2)再理解key

3)通過指令查看/釋放系統中的ipc資源

3.shmctl函數——控制、釋放共享內存

struct shmid_ds是什么

4.shmat函數和shmdt函數——對共享內存進行關聯和去關聯

三、共享內存的優缺點分析

總結



前言

早在設計Unix時,系統開發者就發現了一個悖論:在某些情況下,系統中的進程既要滿足互相隔離又要彼此協同合作。

由此衍生出了System V IPC等通信方式,在保持進程獨立性的前提下,通過內核中介、權限控制和同步機制實現安全通信。

System V IPC通信機制主要包括:消息隊列/ 信號量/ 共享內存三種通信方式,本文主要討論共享內存的概念原理以及使用方式。


一、共享內存是什么?

先來看看共享內存的概念:

通過讓不同的進程看到同一塊內存的方式,就被稱為“共享內存”

在對共享內存的概念有了一定了解后,再來理解共享內存的原理。

共享內存實現原理

在不破壞進程獨立性的前提下讓兩個進程通信,操作系統通過引入能讓兩個進程都能看到的同一份“資源”實現。對于共享內存,這份資源就是物理內存上的一段內存塊。

以下闡述共享內存的原理。

共享內存細節理解

1)C/C++語言中的malloc等申請空間的函數能用于申請共享內存嗎?

不能,malloc等函數申請的空間只屬于該進程自己,不能被其他進程共享。共享內存機制是專門設計出來用于IPC進程間通信的。

2)共享內存是一種通信方式,想要通信的進程都可以使用。當兩個進程希望進行通信時,可以使用已有的正在被其他進程使用的共享內存通信,也可以額外申請一塊內存用于通信,根據實際需求決定。

3)系統中可能同時存在很多共享內存塊。

二、接口認識

1.shmget函數——申請共享內存

?

2.ftok函數——生成key值

再次理解ftok和shmget

1)key與shmid的區別與聯系

ftok函數返回值是key,shmget的返回值是shmid(共享內存標識符)。key與shmid的關系,有些類似于文件描述符fd與inode的關系,一個是應用進程層面使用的(shmid與fd),另一個是系統內核層面使用的(key與inode)。

2)再理解key

3)通過指令查看/釋放系統中的ipc資源

刪除共享內存指令:

?shmid可以通過上述ipcs指令查看。

3.shmctl函數——控制、釋放共享內存

struct shmid_ds是什么

在shmctl函數的第三個參數中出現了struct shmid_ds結構體,該結構體是操作系統暴露給用戶級的一種數據結構,他與操作系統為方便管理共享內存創建的數據結構再內容上高度類似(系統中的還要更為復雜)。

struct shmid_ds其中記錄了該共享內存的屬性,包括現在有哪些進程正在通過該共享內存通信的信息,以及key值等。

若想獲取共享內存的屬性參數,可以通過創建一個空的struct shmid_ds對象,再將地址傳入shmctl函數中。注意此時的comd參數需傳入IPC_STAT。

struct shmid_ds tmp;
shmctl(shmid,IPC_STAT,&tmp);

4.shmat函數和shmdt函數——對共享內存進行關聯和去關聯

注意:正確的釋放共享內存的流程應該是,先將進程與共享內存去關聯,然后再釋放共享內存

這里附上筆者總結的共享內存創建流程:

在申請共享內存時應做到,誰申請,誰釋放。

三、共享內存的優缺點分析

1.優點

共享內存在所有進程通信間,通信速度是最快的——能減少的拷貝次數。

何以見得共享內存能減少拷貝次數?

假如同樣的代碼和數據,綜合考慮管道和共享內存分別進行通信,在考慮上鍵盤輸入,和顯示器輸出后,共享內存有幾次拷貝數據,管道呢?

由上圖我們可以清楚的觀察到,相比管道,共享內存不用在buffer緩沖區中臨時中轉一下,由此能夠減少一定的數據拷貝。

2.缺點

共享內存在數據通信時,沒有對數據做任何保護——沒有同步、互斥機制。

甚至管道可能出現寫端還未寫完數據,而讀端就來讀取的情況——這時讀端大概率讀到無意義的數據。

比如,管道通信寫端在沒有寫入數據時,讀端會被OS阻塞,反之亦然;

管道在讀端將數據讀取后,寫端再寫會覆蓋已讀的數據。

是否能在不使用信號量的前提下,對共享內存進行保護?

可以給通信的進程雙方添加管道,凡共享內存通信前先借助管道確認對方是否準備完畢。

讀/寫端先不直接訪問共享內存,而是先通過管道通信確認后,再通過共享內存通信。

比如,讀端想要通過共享內存讀取數據之前,先在管道讀端處讀取信號(如一個特定字符)。若未讀取到特定值字符,則由于管道的特性讀端進程會被阻塞,直到寫端發來信號。


總結

本文詳細介紹了System V通信方式中的“共享內存”通信方式。從原理的介紹,到接口的使用,再到最后的優缺點分析,較為系統的剖析共享內存的原理和使用。

雖然共享內存在如今這個萬物互聯的世界越來越不常用,但在某些脫網單機情況下依舊是進程通信的最佳選擇。

希望本文對你有所幫助。

讀完點贊,手留余香~

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

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

相關文章

探索 Java 垃圾收集:對象存活判定、回收流程與內存策略

個人主頁-愛因斯晨 文章專欄-JAVA學習筆記 熱門文章-賽博算命 一、引言 在 Java 技術體系里,垃圾收集器(Garbage Collection,GC)與內存分配策略是自動內存管理的核心支撐。深入探究其原理與機制,對優化程序內存性能…

hbase資源和數據權限控制

hbase適合大數據量下點查 https://zhuanlan.zhihu.com/p/471133280 HBase支持對User、NameSpace和Table進行請求數和流量配額限制,限制頻率可以按sec、min、hour、day 對于請求大小限制示例(5K/sec,10M/min等),請求大小限制單位如…

大數據-275 Spark MLib - 基礎介紹 機器學習算法 集成學習 隨機森林 Bagging Boosting

點一下關注吧!!!非常感謝!!持續更新!!! 大模型篇章已經開始! 目前已經更新到了第 22 篇:大語言模型 22 - MCP 自動操作 FigmaCursor 自動設計原型 Java篇開…

Delphi 實現遠程連接 Access 數據庫的指南

方法一:通過局域網共享 Access 文件(簡單但有限) 步驟 1:共享 Access 數據庫 將 .mdb 或 .accdb 文件放在局域網內某臺電腦的共享文件夾中。 右鍵文件夾 → 屬性 → 共享 → 啟用共享并設置權限(需允許網絡用戶讀寫&a…

VR視頻制作有哪些流程?

VR視頻制作流程知識 VR視頻制作,作為融合了創意與技術的復雜制作過程,涵蓋從初步策劃到最終呈現的多個環節。在這個過程中,我們可以結合眾趣科技的產品,解析每一環節的實現與優化,揭示背后的奧秘。 VR視頻制作有哪些…

文件上傳/下載接口開發

接口特性 文件傳輸接口與傳統接口的核心差異體現在數據傳輸格式: 上傳接口采用 multipart/form-data 格式支持二進制文件傳輸下載接口接收二進制流并實現本地文件存儲 文件上傳接口開發 接口規范 請求地址:/createbyfile 請求方式:POST…

深入學習RabbitMQ隊列的知識

目錄 1、AMQP協議 1.1、介紹 1.2、AMQP的特點 1.3、工作流程 1.4、消息模型 1.5、消息結構 1.6、AMQP 的交換器類型 2、RabbitMQ結構介紹 2.1、核心組件 2.2、最大特點 2.3、工作原理 3、消息可靠性保障 3.1、生產端可靠性 1、生產者確認機制 2、持久化消息 3.…

【計算機網絡】NAT、代理服務器、內網穿透、內網打洞、局域網中交換機

🔥個人主頁🔥:孤寂大仙V 🌈收錄專欄🌈:計算機網絡 🌹往期回顧🌹:【計算機網絡】數據鏈路層——ARP協議 🔖流水不爭,爭的是滔滔不息 一、網絡地址轉…

[論文閱讀] 人工智能 | 大語言模型計劃生成的新范式:基于過程挖掘的技能學習

#論文閱讀# 大語言模型計劃生成的新范式:基于過程挖掘的技能學習 論文信息 Skill Learning Using Process Mining for Large Language Model Plan Generation Andrei Cosmin Redis, Mohammadreza Fani Sani, Bahram Zarrin, Andrea Burattin Cite as: arXiv:2410.…

C文件操作2

五、文件的隨機讀寫 這些函數都需要包含頭文件 #include<stdio.h> 5.1 fseek 根據文件指針的位置和偏移量來定位文件指針&#xff08;文件內容的光標&#xff09; &#xff08;重新定位流位置指示器&#xff09; int fseek ( FILE * stream, long int offset, int or…

react私有樣式處理

react私有樣式處理 Nav.jsx Menu.jsx vue中通過scoped來實現樣式私有化。加上scoped&#xff0c;就屬于當前組件的私有樣式。 給視圖中的元素都加了一個屬性data-v-xxx&#xff0c;然后給這些樣式都加上屬性選擇器。&#xff08;deep就是不加屬性也不加屬性選擇器&#xff09; …

【信創-k8s】海光/兆芯+銀河麒麟V10離線部署k8s1.31.8+kubesphere4.1.3

? KubeSphere V4已經開源半年多&#xff0c;而且v4.1.3也已經出來了&#xff0c;修復了眾多bug。介于V4優秀的LuBan架構&#xff0c;核心組件非常少&#xff0c;資源占用也顯著降低&#xff0c;同時帶來眾多功能和便利性。我們決定與時俱進&#xff0c;使用1.30版本的Kubernet…

單片機內部結構基礎知識 FLASH相關解讀

一、總線簡單說明 地址總線、控制總線、數據總線 什么是8位8051框架結構的微控制器&#xff1f; 數據總線寬度為8位&#xff0c;即CPU一次處理或傳輸的數據量為8位&#xff08;1字節&#xff09; 同時還有一個16位的地址總線&#xff0c;這個地方也剛好對應了為什么能看到內存…

HTTPS加密的介紹

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff0c;超文本傳輸安全協議&#xff09;是HTTP協議的安全版本。它在HTTP的基礎上加入了SSL/TLS協議&#xff0c;用于對數據進行加密&#xff0c;并確保數據傳輸過程中的機密性、完整性和身份驗證。 在HTTPS出現之前&a…

【freertos-kernel】stream_buffer

文章目錄 補充任務通知發送處理ulTaskGenericNotifyTakexTaskGenericNotifyWait 清除xTaskGenericNotifyStateClearulTaskGenericNotifyValueClear 結構體StreamBufferHandle_tStreamBufferCallbackFunction_t 創建xStreamBufferGenericCreatestream buffer的類型 刪除vStreamB…

在word中點擊zotero Add/Edit Citation沒有反應的解決辦法

重新安裝了word插件 1.關掉word 2.進入Zotero左上角編輯-引用 3.往下滑找到Microsoft Word&#xff0c;點重新安裝加載項

新華三H3CNE網絡工程師認證—Easy IP

Easy IP 就是“用路由器自己的公網IP&#xff0c;給全家所有設備當共享門牌號”的技術&#xff01;&#xff08;省掉額外公網IP&#xff0c;省錢又省配置&#xff01;&#xff09; 生活場景對比&#xff0c;想象你住在一個小區&#xff1a;普通動態NAT&#xff1a;物業申請了 …

算法打開13天

41.前 K 個高頻元素 &#xff08;力扣347題&#xff09; 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 示例 1: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2]示例 2: 輸入: nums [1], k 1 輸出: …

LabVIEW與PLC液壓泵測控系統

針對液壓泵性能測試場景&#xff0c;采用LabVIEW與西門子 PLC 控制系統&#xff0c;構建高精度、高可靠性的智能測控系統。通過選用西門子 PLC、NI 數據采集卡、施耐德變頻電機等&#xff0c;結合LabVIEW 強大的數據處理與界面開發能力&#xff0c;實現液壓泵壓力、流量、轉速等…

應急響應靶機-web2-知攻善防實驗室

題目&#xff1a; 前景需要&#xff1a;小李在某單位駐場值守&#xff0c;深夜12點&#xff0c;甲方已經回家了&#xff0c;小李剛偷偷摸魚后&#xff0c;發現安全設備有告警&#xff0c;于是立刻停掉了機器開始排查。 這是他的服務器系統&#xff0c;請你找出以下內容&#…