共享內存的原理和創建

目錄

共享內存的原理

共享內存的創建

代碼實現創建

共享內存的管理指令


我們今天來學習共享內存!!!

共享內存的原理

兩個進程同時使用內存中開辟的共享空間進行通信就是建立并使用共享內存進行進程間的通信。System V 共享內存(Shared Memory)允許不同的進程共享一塊內存區域。

那它和命名管道有什么區別呢?

所以共享內存不是文件,這個本質區別!!!

接下來我們講一下共享內存通信的原理:

兩個進程通過各自的mm_struct和頁表的映射,映射到各自的物理內存上的一塊空間形成物理地址(空間的頭地址),那兩個進程要進行通信就需要同一個共享內存,所以為了實現通信,內存創建一個共享內存(本質不是由操作系統創建,應該是其中一個進程要求然后自己先創建了),我們暫且任務需要OS創建,這個共同的內存通過頁表映射到各自進程的虛表的共享區然后這個過程叫掛接到進程的地址空間中,解除共享狀態就是去關聯。管道如果只讀打開的話會卡在創建管道的之前,而共享內存就沒有這個問題。

共享內存的創建

使用shmget函數創建共享內存空間。

作為一個系統函數,三個參數,我們先看返回值以及參數說明吧。

size就是設置共享內存的字節大小,shmfig就是創建這個共享內存的創建標志,這個參數只能有以下三種傳遞方式:

前面這個key,類型就是這樣的,這個是用來標志共享內存的唯一標識符,這個一般是用戶自己傳進去的,也就是進程創建時自己提供,為什么不能操作系統直接提供呢?

共享內存在任何時刻可以在OS內部存在多個,那么個的共享內存操作系統肯定是需要管理的,怎么管理呢先描述再組織,又是這句話,共享內存=共享內存的內核數據結構+內存塊,操作系統將這個struct shm加載到操作系統中時,如果自行創建key那進程A進來創建共享內存得到操作系統的key,進程B要與之通信,可是如果此時進程B還沒有創建怎么辦,A和B毫不相干,這樣進程B進入操作系統就不知道key值不知道要訪問哪個共享內存了,如果這個是由jincA創建的key那到時候A只需要將其放在AB的共享區(都能看到的區域)這樣B就可以看到了!!!這個A創建的過程本質還是讓不同的進程看到同一份資源。

這個key值是隨便創建的嗎,A進程隨便給key不會和其他進程沖突嗎,會,所以操作系統認為你既然自己創建不好,我就自己提供一個函數創建一個key給你用。

ftok 是一個 System V IPC 中的函數,用于根據指定的路徑名和一個項目ID(通常是一個字符)生成一個唯一的鍵值(key_t)。這個鍵值通常用于共享內存、消息隊列或信號量等 IPC 資源的標識符。

ftok根據你傳入的公共路徑(會被解析成數字)和公共項目的ID進行聯合根據某種算法得出唯一key值

這種算法得出的key值原則上還是會有極小概率的沖突,可以忽略不計的,就是比自己創建準。

代碼實現創建

依舊是創建兩個進程和之前一樣,然后都可訪問公共頭文件comm.hpp,makefile里面就是能同時編譯兩個.cc,和上一篇博客里面寫的一樣的。

我們得先創建一個key,所以先使用ftok進行創建,默認server.cc里面進行創建,然后知道了公共路徑和id就知道了key,這個公共路徑是隨便起的自己系統里有這個路徑就行,id也是隨便起的,我們這里使用16進制數,所以將公共路徑和id寫入公共.hpp讓兩個進程都可以看到。

我們這個key值非常大,并且由于路徑和id一致所以沒次運行都是一樣的。

那光有key不行呀,我們是不是還要判斷創建key成功了沒有,并且有了key之后就可以創建shm了對吧,創建共享內存的地點還是在server,不過創建多大字節的空間就需要公共出來。

由于每次創建的都是最新的,已經存在了共享內存就會報錯!!!

這個我們的使用代碼進行創建的流程就完了,至于實現通信就是下節課的事了,由上面可以看到第一次運行了之后由于server進程結束就退出了,但是第二次運行時那個共享空間還在內核里面,所以共享內存的生命周期是不隨單個進程的,而是隨著操作系統的生命周期,所以要銷毀管道只能是將兩個互通的進程都關掉然后操作系統認為這個內存沒有意義了,就自己釋放了,這個過程屬于用戶讓操作系統釋放,方法2是讓OS自己重啟,make clean是代碼層面的釋放,我們還可以使用指令創建,釋放。

共享內存的管理指令

ipcs指令可以看到各自通信模式,有消息隊列,共享內存和管道,由于我們之前沒有釋放共享內存所以就顯示有一個,

nattch是該共享內存的附加進程數,就是有多少個進程在進行通信,當 nattch == 0 時,意味著當前沒有任何進程使用該共享內存,但內存段仍然存在,直到 shmctl(IPC_RMID) 刪除它。因為我們只是創建還沒有使用所以是0。

ipcs -m選項直接可以看到共享進程。

ipcrm 是 Linux 上的 IPC(進程間通信)資源管理命令,用于刪除共享內存、信號量或消息隊列。其中,ipcrm -m 用于刪除共享內存段

可以看到要刪除一個共享內存需要-m之后再指定上可以標志該內存段的ID,就是刪除這個指定的內存段,為什么不使用key而使用shmid(shmget的返回值)。

還有一個原因是key也是有可能重復的對吧,即使使用了那種算法。

這個shmid有點像文件描述符對吧,shmid可以指明一個獨一的共享內存。

如果我們一直創建共享內存然后刪掉,再創建,發現這個shmid從0開始自增到n,n可以等于2.。。。,所以這個shmid就是數組的下標,我們可以認為shmid數組表的下標存放了shmid值,然后內容指向了共享內存,這個結構和文件描述符表是大致一樣的,但是文件的是從3開始創建的,所以共享內存這部分和它又有所不同(后面會細講)。

接著講指令創建:

shmctl() 是 Linux System V 共享內存管理函數,用于獲取共享內存信息、修改權限、刪除共享內存等

這個函數的功能有點多,可以用于創建共享內存等等。

就是將指定唯一的shmid的共享內存創建/修改/刪除,到底執行哪一種就取決于cmd的傳入,這個cmd是像flag有特定傳入限制的(有提供不需要自己寫),然后如果是創建/修改就需要使用buf,刪除填個nullptr就可以了,不關心buf指向的共享內存的信息。

buf指針指向struct shmid_ds這個裝有共享內存信息的結構體,用于修改/創建。我就說共享內存空間有類似于PCB的內核數據結構吧。

我們進行函數級的刪除,再使用ipcs -m進行追蹤。

刪除成功!!!

咦不對呀,這個shmctl不是指令呀,怎么寫在這里,我后學的這個還不行嗎???

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

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

相關文章

3.10[A]cv

核心模塊: rasterizer:光柵化器,負責三角形遍歷和像素繪制Shader:包含頂點著色器和多種片元著色器Texture:紋理處理模塊 頂點著色器的計算量一般遠小于片元著色器。因為組成三角形的頂點相對有限,而片元需…

mac使用Homebrew安裝miniconda(mac搭建python環境),并在IDEA中集成miniconda環境

一、安裝Homebrew mac安裝brew 二、使用Homebrew安裝miniconda brew search condabrew install miniconda安裝完成后的截圖: # 查看是否安裝成功 brew list環境變量(無需手動配置) 先執行命令看能不能正常返回,如果不能正常…

多視圖幾何--相機標定--從0-1理解張正友標定法

1基本原理 1.1 單應性矩陣(Homography)的建立 相機模型:世界坐標系下棋盤格平面(Z0)到圖像平面的投影關系為: s [ u v 1 ] K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} K…

WWDG窗口看門狗原理

WWDG(窗口看門狗)在窗口期喂狗 作用: 原理: 框圖 WWDG寄存器: WWDG_CR控制寄存器 WWDG_CFR配置寄存器 狀態寄存器WWDG_SR 超時時間計算公式 最小最大超時值 HAL配置函數: 1. IWDG 和 WWDG 的區別 IWDG&…

無公網IP也能遠程控制Windows:Linux rdesktop內網穿透實戰

文章目錄 前言1. Windows 開啟遠程桌面2. Linux安裝rdesktop工具3. Win安裝Cpolar工具4. 配置遠程桌面地址5. 遠程桌面連接測試6. 設置固定遠程地址7. 固定地址連接測試 前言 如今遠程辦公已經從一種選擇變成了許多企業和個人的必修課,而如何在Linux系統上高效地訪…

Pygame實現射擊鴨子游戲3-2

2 鴨子類Target的創建 2.1 __init__()函數 Target類的__init__()函數代碼如圖5所示。 圖5 __init__()函數代碼 其中,第18行將Target類聲明為pygame.sprite.Sprite類的子類;第19行代碼中,__init__()函數的img_path參數表示鴨子圖片的文件名…

利用Java爬蟲獲取衣聯網商品詳情:實戰指南

在電商領域,獲取商品詳情是數據分析和市場研究的重要環節。衣聯網作為知名的電商平臺,提供了豐富的服裝商品資源。本文將詳細介紹如何利用Java編寫爬蟲程序,通過商品ID獲取衣聯網商品詳情。 一、準備工作 (一)環境搭…

五、OpenGL中Shader與C++數據傳輸

文章目錄 一、概述二、Shader 代碼文件的基本格式三、Shader的向量語法介紹四、Shader之間的數據傳輸五、Shader與C的數據傳輸uniform六、完整示例 一、概述 在 OpenGL 中,Shader(著色器)使用 GLSL(OpenGL Shading Language&…

【3DMAX插件】3DMAX建筑大師插件MasterBuilder使用方法

3DMAX建筑大師插件是一款專為3DMAX設計的程序化(參數化)建筑建模工具,其最大特點是能夠一鍵生成建筑模型,極大地提升了工作效率。該插件配備了多種結構控制選項,涵蓋陽臺、門窗、欄桿、樓頂水塔等附屬建筑元素&#xf…

隱私保護在 Facebook 用戶身份驗證中的應用

在這個數字化的時代,個人隱私保護成為了公眾關注的焦點。社交媒體巨頭 Facebook 作為全球最大的社交平臺之一,擁有數十億用戶,其在用戶身份驗證過程中對隱私保護的重視程度直接影響著用戶的安全感和信任度。本文將探討 Facebook 在用戶身份驗…

Swift Package Manager (SPM) 創建并集成本地庫

在macOS 項目中,使用 Swift Package Manager (SPM) 創建并集成本地庫的完整步驟。 創建一個macos應用程序,選擇 swift、oc、swiftui都可以。 創建好應用之后,開始創建SPM本地庫。 打開終端app,進入項目根目錄,逐次輸…

滲透測試之利用sql拿shell(附完整流程+防御方案)【下】

導讀: 時刻保持謙遜,始終保持學習,探尋事物的本質,不要把事情復雜化 話不多說,書接上回 三、利用日志getshell 利用條件: 擁有網站的寫入權限知道網站的絕對路徑數據庫日志開啟 實際操作: (1)查看數據庫日志是否開啟以及路徑 show variables like %general%; (2…

LeetCode 熱題 100_每日溫度(72_739_中等_C++)(棧)(暴力破解;棧(從左到右);棧(從右到左))

LeetCode 熱題 100_每日溫度(72_739) 題目描述:輸入輸出樣例:題解:解題思路:思路一(暴力破解法(雙重循環)):思路二(棧:從左到右)&…

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目錄 1 -> 工程模板介紹 2 -> 創建一個新的工程 2.1 -> 創建和配置新工程 2.1.1 -> 創建HarmonyOS工程 2.2.2 -> 創建OpenHarmony工程 1 -> 工程模板介紹 DevEco Studio支持多種品類的應用/元服務開發,預置豐富的工程模板,可以根…

unity3d 背景是桌面3d數字人,前面是web的表單

是可以實現的,但涉及多個技術棧的結合,包括 Unity3D、Web 技術(HTML、JavaScript)、以及可能的 WebGL 或 WebRTC 技術。大致有以下幾種實現方案: 方案 1:Unity 作為獨立應用(桌面端&#xff0…

貓耳大型活動提效——組件低代碼化

1. 引言 貓耳前端在開發活動的過程中,經歷過傳統的 pro code 階段,即活動頁面完全由前端開發編碼實現,直到 2020 年接入公司內部的低代碼活動平臺,滿足了大部分日常活動的需求,運營可自主配置活動并上線,釋…

深度學習系列79:Text2sql調研

參考 https://github.com/topics/text-to-sql 這里是一些資源:https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 這里是綜述文章:https://zhuanlan.zhihu.com/p/647249972 1. 數據集 Spider: 一個跨域的復雜text2sql數據集&a…

Linux 系統負載過高的排查思路

技術探討:Linux系統負載過高的排查思路 在Linux服務器運行過程中,如果系統負載過高,可能會導致性能下降和服務不穩定。以下是針對Linux系統負載過高問題的排查思路和解決方法: 1. 查看系統負載: 使用uptime或top命令查…

【互聯網性能指標】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

📕我是廖志偉,一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》(基礎篇)、(進階篇)、(架構篇)清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

linux---天氣爬蟲

代碼概述 這段代碼實現了一個天氣查詢系統,支持實時天氣、未來天氣和歷史天氣查詢。用戶可以通過終端菜單選擇查詢類型,并輸入城市名稱來獲取相應的天氣信息。程序通過 TCP 連接發送 HTTP 請求,并解析返回的 JSON 數據來展示天氣信息。 #in…