【Linux】共享內存

文章目錄

  • 一、共享內存的原理
  • 詳談共享內存的實現過程
    • 二、共享內存的接口函數
      • 1.shmget
      • 2. shmat
      • shmdt
      • shmctl
    • 進程間使用共享內存通信
    • 三、共享內存的特性
  • 關于代碼


一、共享內存的原理

共享內存是由操作系統維護和管理的一塊內存。

共享內存的本質是內核級的緩沖區。

一個進程向操作系統申請一塊共享區內存,操作系統為該進程創建了一塊內存后,進程要將該共享內存與自己的虛擬地址空間進行映射掛接。

也就是將共享區內存通過頁表建立映射關系后,在進程自己的虛擬地址空間的共享區中就保留了共享內存的起始地址。

在這里插入圖片描述

同時,進程b也通過頁表映射,將共享區的起始地址映射到自己的虛擬地址空間中,兩個進程就能看到同一份資源,從而能實現通信!!!

那為什么要個操作系統申請內存,而不給進程自己管理呢?
因為操作系統要對各種共享內存進行先描述,再組織的工作。

所以,共享內存一定有對應的描述該共享內存的對象,保存共享內存及其周邊的各種屬性和信息。
在這里插入圖片描述

操作系統對這些對象進行管理的過程,本質轉化成對鏈表的增刪查改。


詳談共享內存的實現過程

二、共享內存的接口函數

1.shmget

shmget - allocates a System V shared memory segment
int shmget(key_t key, size_t size, int shmflg);

該接口就是向內存申請一塊共享內存。


參數2:size

該參數就是申請的共享內存塊的大小。

注意:一般申請的共享內存是4096字節(4KB)的整數倍。
如果申請的是4097字節,操作系統會給一塊4096*2字節大小的共享內存,但是能夠使用的只有4097字節,剩下的空間給了也不能用。

參數3:shmflg

這個參數類似于open函數的第三個參數,打開的方式:O_CREAT|O_WRONLY,shmflg參數的底層也是使用位圖實現的。

在這里插入圖片描述
重點是這兩個宏定義

  • 1.IPC_CREAT單獨使用時,如果不存在,就創建并返回,如果存在,就獲取并返回。
  • 2.IPC_CREAT|IPC_EXCL一起使用時,如果不存在,就創建并返回,如果存在,則出錯返回。
  • 3.IPC_EXCL不單獨使用

第二點讓人奇怪,解釋如下:
IPC_CREAT|IPC_EXCL能保證如果能申請到,那么申請到的共享內存是最新的!


參數3:key

key是一個唯一標識符,也就是說每個共享內存都有唯一的key。

ftok  - convert a pathname and a project identifier to a System V IPC key
SYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);

用戶通過傳遞一個路徑名和一個id,返回一個共享內存的唯一標識符。
所以ftok函數的本質就是一個算法。
pathname和proj_id是用戶自己控制的。

為什么不讓操作系統隨機生成呢?
因為操作系統隨機生成的key并不能傳遞給另一個進程,從而讓不同的進程看到同一份資源這個目的。

所以必須讓用戶傳參下來。

key_t key = ftok(pathname.c_str(),proj_id); // 成功返回key,失敗返回-1

返回值:
在這里插入圖片描述
如果共享內存申請成功,返回的是shmid,其實這個返回值就像是文件fd,創建一個文件,返回該文件在文件數組fd_array中的下標。申請失敗返回-1.

  key_t key = ftok(PATH_NAME,proj_id);flag = IPC_CREATE|IPC_EXCL|0666;int shmid = shmget(key,size,flag); // 申請成功返回id,失敗返回-1

所以可見,共享內存的確是由操作系統管理起來的。

所以,共享內存的生命周期是隨操作系統的,進程退出共享內存并不會釋放。除非內核重啟,否則共享內存是不會釋放的。


對比shmid和key:
shmid是共享內存在數組中的下標,只在進程內,用于標識資源的唯一性。
而key是內核級標定共享內存唯一性的。


共享內存的權限問題:
共享內存的權限,可以直接在shmget函數的第二個參數中傳遞。


如何保證讓不同的進程看到同一份內存呢?


2. shmat

在這里插入圖片描述

該函數是將指定進程與共享內存進行掛接。
第一個參數就是共享內存的id,第二個參數暫時不用管,設置為nullptr即可,第三個參數同樣暫時不管,設置成0.

 //  2. 將服務端與共享內存掛接起來
char *shmaddr = (char *)shmat(shmid, nullptr, 0); 
// 返回掛接的虛擬地址的起始地址

shmdt

在這里插入圖片描述
將掛接時獲取的地址傳過去,取消掛接即可,成功返回0,失敗返回-1.

shmctl

在這里插入圖片描述
就是將共享內存刪除。
參數1傳對應的共享內存,參數2傳IPC_RMID,參數3先不管,穿nullptr;
參數2的命令如下,就是標記對應的共享內存為刪除狀態。
在這里插入圖片描述

進程間使用共享內存通信

假設進程A申請共享內存。

對進程A來說:

  • 1.進程A先調用shmget函數,創建共享內存。
  • 2.進程A與對應的共享內存掛接起來。
  • 3.通信完成后取消掛接。
  • 4.再將共享內存釋放。

對進程B來說:
1.進程B先調用shmget函數,獲取共享內存。
2.進程B與對應的共享內存掛接起來。
3.通信完成后取消掛接。

三、共享內存的特性

1.共享內存沒有同步互斥之類的保護機制

2.共享內存是所有進程間通信中,速度最快的!(拷貝少)
進程想向內存中寫入數據,直接向對應的共享內存進行寫入即可,只需要將用戶層緩沖區拷貝到內存中即可。只需要一次拷貝。

3.共享內存內部的數據,由用戶自己維護!!

關于代碼

代碼地址請移步:gitee——共享內存

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

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

相關文章

C語言精華題目錦集1

第一題 test.c文件中包括如下語句&#xff0c;文件中定義的四個變量中&#xff0c;是指針類型的是&#xff08;&#xff09;【多選】 #define INT_PTR int* typedef int* intptr; INT_PRT a,b; int_ptr c,d;A:a ?B:b ?C:c ?D:d #define是宏定義&#xff0c;此時在程序中IN…

SQLite3 數據庫學習(六):Qt 嵌入式 Web 服務器詳解

參考引用 SQLite 權威指南&#xff08;第二版&#xff09;SQLite3 入門 1. Apache 搭建 cgi 環境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服務器軟件 它可以運行在幾乎所有廣泛使用的計算機平臺上&#xff0c;由于其跨平臺和安全性被廣泛使用 1.2 具體搭建流程…

一、用戶管理

一、后端數據庫初始化 1.1 因為版本問題&#xff0c;始終報錯&#xff0c;按照報錯信息去查詢解決方案&#xff0c;無法解決 靈機一動&#xff1a; 網址&#xff1a; Spring Boot 3.0 升級 實戰踩坑記錄 - 掘金 (juejin.cn) &#xff11;.&#xff12; 個人配置【運行成功…

c++的三目運算符

C三目運算符增強 C中的三目運算符表達式返回的可以是一個變量&#xff0c;但是C語言中返回的是一個常量。 C語言中&#xff1a; void test05() { int a 10; int b 20; printf("%d\n", a < b ? a : b); //在C語言中三目運算符返回的是表達式的值&am…

Javascript每天一道算法題(十三)——最大子數組和_中等

文章目錄 動態規劃題三個重要步驟&#xff08;了解思路&#xff09;1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——動態規劃 總結 動態規劃題三個重要步驟&#xff08;了解思路&#xff09; &#xff08;1&#xff09;定義數組元素的含義 用一個數組來保存歷史數…

2020年06月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 執行以下腳本后舞臺上的角色將 ? A:先克隆自身,克隆體出現后被刪除。 B:先克隆自身,克隆體出現后刪除本體。 C:克隆出自身后本體與克隆體同時被刪除。 D:克隆出自身后本體與克…

docker常用命令, 鏡像版本的導入、導出并加載,打包鏡像的命令

文章目錄 docker常用命令&#xff1a;打鏡像包&#xff1a;鏡像版本的導入、導出并加載 docker常用命令&#xff1a; 打鏡像包&#xff1a; ? docker build -t calc:20230630 /home/apps/calc/docker/ 刪除某個鏡像的版本&#xff0c;allen_mysql的5.7版本 docker rmi all…

Redis深入理解-內核請求處理流程、數據傳輸協議

Redis 內核級請求處理流程 Redis Server 其實就是 Linux 服務器中的一個進程 主要還是下圖的流程 應用先和 server 端建立 TCP 連接建立連接之后&#xff0c;server 端就會有一個與該客戶端通信的 socket&#xff0c;客戶端的讀寫請求發送到服務端的 socket那么通過 IO 多路…

分組背包問題學習筆記 AcWing 9. 分組背包問題

原題 有 N&#xfffd; 組物品和一個容量是 V&#xfffd; 的背包。 每組物品有若干個&#xff0c;同一組內的物品最多只能選一個。 每件物品的體積是 vij&#xfffd;&#xfffd;&#xfffd;&#xff0c;價值是 wij&#xfffd;&#xfffd;&#xfffd;&#xff0c;其中 …

PC8233(CC/CV控制)高耐壓輸入5V/3.4A同步降壓電路內建補償帶恒流恒壓輸出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降壓調節器,輸出電流高達3.4A,操作范圍從8V到32V的寬電源電壓。內部補償要求最低數量現成的標準外部組件。PC8233在CC&#xff08;恒定輸出電流&#xff09;模式或CV&#xff08;恒定輸出電壓&#xff09;模式&#x…

【前端】前端監控?埋點

文章目錄 前端監控分為三個方面前端監控流程異常監控常見的錯誤捕獲方法主要是 try / catch 、window.onerror 和window.addEventListener 等。Promise 錯誤Vue 錯誤React 錯誤 性能監控用戶行為監控常見的埋點方案來源 前端監控分為三個方面 異常監控&#xff08;監控前端頁面…

基于element-ui后臺模板,日常嘮嗑

后面會補充github地址 文章目錄 目錄 文章目錄 案例說明 1.引入庫 2.創建布局組件 3.創建布局組件 4.菜單效果展示 5.創建頂部組件 5.創建頂部面包屑組件 6.創建內容區域組件 7.效果總覽 7.布丁&#xff08;實現一些小細節&#xff09; 前言一、pandas是什么&#xff1f;二、使…

CentOS7中升級OpenSSL詳細教程

文章目錄 一. 引言二. 升級前的準備1.備份現有配置2. 檢查系統版本3. 安裝依賴 三. OpenSSL安裝四. 驗證 一. 引言 OpenSSL: 是用于保護數據安全的重要工具。它能提供加密&#xff0c;解密等多項功能。 然而&#xff0c;隨著技術的發展和新的安全漏洞的出現&#xff0c;使用最…

管理類聯考——英語二——備考 100 句涵蓋所有詞匯

全中 在海里的這個地區&#xff0c;熊貓們喜歡就著蘇打碗豆喝茶。而大洋州的民兵則喜歡經過半島&#xff0c;帶著編劇本的公式上餐廳去。附件的電影院里有額外的歌劇和香蕉&#xff0c;這一時代的斑馬們被外面的天線所吸引。實驗室里的蟹想用它的肋骨去戳四肢象燈炮的小羊。但…

千夢網創:創業,一場游戲一場夢

創業這件事就好比一場養成類游戲&#xff0c;而我們自己就是游戲主角。 這個游戲有一個特殊之處在于&#xff1a;SSS級裝備有穿戴等級設定&#xff0c;就算你氪重金買到了一把神器&#xff0c;自身閱歷不夠也根本無法發揮它的強大威力而只能當個裝飾。 這就要求我們真正沉浸在…

催單開發信怎么寫?外貿人如何寫催單郵件?

年末催單開發信編寫技巧&#xff1f;最有效的催單話術有哪些&#xff1f; 催單開發信成為了企業間日常溝通的重要一環。這些信件不僅有助于促進業務發展&#xff0c;還可加強供應鏈的協調&#xff0c;確保貨物及時送達。蜂郵EDM將介紹如何寫一封出色的催單開發信&#xff0c;以…

ubuntu20.04安裝多版本cuda,切換版本

1. 安裝cuda toolkit: 下載網站 https://developer.nvidia.com/cuda-11.3.0-download-archive 選擇版本&#xff0c;這里選擇11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run給cuda權限: chmod x…

Linux加強篇001-部署Linux系統

目錄 一、前言 1.1準備工具 1.2安裝配置VM虛擬機 1.3安裝軟件 1.4系統初始化進程 1.5重置root密碼 二、鞏固練習 1&#xff0e;為什么建議讀者在下載系統文件后先進行校驗而不是直接安裝呢&#xff1f; 2&#xff0e;使用虛擬機安裝Linux系統時&#xff0c;為什么要先…

科技與藝術如何交織出“理想之家”?三星電視給出家電行業最優解答

作者 | 曾響鈴 文 | 響鈴說 理想的家&#xff0c;是什么樣子? 關于這個問題&#xff0c;社交媒體上有形形色色的答案。很多人的夢中情屋是原木風、奶油色&#xff0c;點綴著綠意盎然的植物&#xff1b;還有一些人的Dream house是用全屋智能將科技感拉滿&#xff0c;再配上打…

OpenStack云計算平臺-計算服務

目錄 一、計算服務概覽 二、安裝并配置控制節點 1、先決條件 2、安全并配置組件 3、完成安裝 三、安裝和配置計算節點 1、安全并配置組件 2、完成安裝 四、驗證操作 一、計算服務概覽 使用OpenStack計算服務來托管和管理云計算系統。OpenStack計算服務是基礎設施即服務…