【Linux篇】進程間通信:進程IPC

目錄

共享內存空間

共享內存是在用戶空間還是內核空間?——用戶空間

共享內存的生命周期

如何使用共享內存

共享內存的權限

共享內存是進程間通信中,速度最快的方式:

共享內存的缺點:


進程間通信標準:

  1. system V---共享內存
  2. linux內核支持了這種標準,專門設計了一個IPC通信模塊,對于我們來說就是通信接口的設計

共享內存空間

共享內存是一種進程間通信的機制,即不同進程的虛擬內存空間(虛擬內存地址不需要相同),映射到相同的物理內存中。如果某個進程向共享內存寫入數據,所做的改動將【立即影響到】【同時訪問】(加了鎖的就不算“同時可以訪問")同一段共享內存的任何其他進程

在Linux中,每個進程都有屬于自己的進程控制塊(PCB)和地址空間(Addr Space),并且都有一個與之對應的頁表,負責將進程的虛擬地址與物理地址進行映射,通過內存管理單元(MMU)進行管理。兩個不同的虛擬地址通過頁表映射到物理空間的同一區域,它們所指向的這塊區域即共享內存

我們把將物理內存中的某段空間映射到多個進程的虛擬地址空間中的這種通信方式,叫做“共享內存”

在操作系統內,有多個共享內存同時存在,所以操作系統要將它們都管理起來

  • 先描述再組織

  • 共享內存一定會有對應的描述共享內存的內核結構。有這一點后,再加上物理內存。

  • 進程與共享內存的關系就是內核數據結構之間的關系。進程的內核數據結構與共享內存的數據結構

在共享內存中,存在引用計數,當引用計數為0時,表示沒有進程在使用這塊共享內存,此時就會被操作系統釋放掉

共享內存是在用戶空間還是內核空間?——用戶空間

共享內存的接口,system V的特性

key:用來標識共享內存的唯一性

size:共享內存的大小

shmflg:共享內存創建的選項

怎么評估共享內存存在還是不存在?

怎么保證兩個不同的進程,拿到的就是同一個內存?

  • 手動構建key

  • 查看一個已經創建的共享內存

ipcs -m

  • 刪除共享內存

ipcrm -m +共享內存id

能不能使用key來代替id?

不能。為什么?

key是要給內核進行區分唯一性的。用戶使用指令管理共享內存是在用戶層的,而指令內部是對系統調用進行了封裝的。也就是說,指令是運行在用戶層的,而key是給OS用的,所以不能使用key來代替id

  • 代碼刪除共享內存

 void Destroy(){if(_shmid == gdefaultid)return;int n=shmctl(_shmid,IPC_RMID,nullptr);if(n > 0){printf("shmctl delete shm: %d success!\n",_shmid);}else{EXR_EXIT("shmctl\n");}}   

共享內存的生命周期

  • 共享內存的生命周期隨內核。

  • 如果進程沒有顯示的刪除對應的共享內存,即便進程退出了,ipc資源依舊被占用

如何使用共享內存

使用共享內存需要先把共享內存映射到進程的地址空間當中。

怎么映射的?

操作系統提供了一個系統調用shmat。調用這個系統調用的進程會把自己的堆棧之間的映射區和隊友的共享內存建立映射。

成功:返回共享內存起始的虛擬地址

失敗:-1

shmat,將共享內存掛接到進程的地址空間中

共享內存的權限

共享區屬于用戶空間

共享內存是進程間通信中,速度最快的方式:

  1. 兩個進程都映射了這塊空間,映射之后讀寫直接被對方看到

  2. 不需要進行系統調用進行讀取或者寫入內容,直接以指針地址的方式訪問空間

共享內存的缺點:

  1. 通信雙方沒有所謂的同步機制

  2. 因為沒有同步機制,所以會導致數據不一致

共享內存沒有保護機制

如果非得將共享內存保護起來呢?

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

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

相關文章

Kubernetes 存儲入門

目錄 Volume 的概念 Volume 的類型 通過 emptyDir 共享數據 編寫 emptyDir 的 Deployment 文件 部署該 Deployment 查看部署結果 登錄 Pod 中的第一個容器 登錄 Pod 中的第二個容器查看 /mnt 下的文件 刪除此 Pod 使用 HostPath 掛載宿主機文件 編寫 Deployment 文件…

深入理解Redission釋放鎖過程

lock.unlock();調用unlock方法,往下追Override public void unlock() {try {// 1. 執行異步解鎖操作并同步等待結果// - 獲取當前線程ID作為鎖持有者標識// - unlockAsync()觸發Lua腳本執行實際解鎖// - get()方法阻塞直到異步操作完成get(unlockAsync(Thread.curre…

四、計算機組成原理——第4章:指令系統

目錄 4.1指令系統 4.1.1指令集體系結構 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定長操作碼指令格式 4.1.4擴展操作碼指令格式 4.1.5指令的操作類型 1.數據傳送 2.算術和邏輯運算 3.移位操作 4.轉移操作 …

RAG面試內容整理-檢索器與生成器的解耦架構

在RAG系統中,檢索器(Retriever)與生成器(Generator)的解耦架構是實現靈活高效的關鍵設計。所謂解耦,即將檢索相關文檔和生成答案兩個步驟分開,由不同的模塊或模型負責。這種架構帶來的直接好處是模塊獨立優化:我們可以針對檢索任務微調或更換檢索模型,而不必影響生成模…

【2026畢業論文鴻蒙系統畢設選題】最新穎的基于HarmonyOS鴻蒙畢業設計選題匯總易過的精品畢設項目分享(建議收藏)?

文章目錄前言最新畢設選題(建議收藏起來)最新穎的鴻蒙畢業設計選題匯總100套易過的精品畢設項目分享畢設作品推薦👇👇👇文未可免費咨詢畢設相關問題,點贊留言可送系統源碼👇👇&#…

超全!Linux 面試 100 題精選解析:網絡篇|16 個 Linux 網絡排查與配置必考題詳解

網絡,是 Linux 系統的神經系統。 一臺服務器再強大,沒有網絡連接也如孤島。尤其在實際運維與面試場景中,“網絡相關的問題”是高頻重災區,比如: IP 配置錯亂,連不上公網DNS 無響應,域名解析失敗…

在 CentOS 上安裝 FFmpeg

在 CentOS 上安裝 FFmpeg 可以通過以下兩種推薦方法實現(以 CentOS 7/8 為例): 方法一:通過 RPM Fusion 倉庫安裝(推薦) # 1. 安裝 EPEL 倉庫 sudo yum install epel-release# 2. 啟用 RPM Fusion 倉庫 # C…

數據結構——圖(一、圖的定義)

一、圖的定義1、什么是圖?圖G(V,E) 如圖,無向圖G頂點集V{,,...,},用|V|表示圖G的頂點個數如:V{A,B,C,D} ,|V|4邊集E{(u,v)|uV, vV}, 用|E|表示圖G的邊的條數如:E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推導式與生成器表達式

Python 列表推導式與生成器表達式在 Python 中,列表推導式(List Comprehension)和生成器表達式(Generator Expression)是處理序列數據的高效工具。它們不僅能簡化代碼,還能提升數據處理的效率。本文將詳細介…

XCF32PVOG48C Xilinx Platform Flash PROM

XCF32PVOG48C 是 Xilinx 公司推出的一款高容量、低功耗的 Platform Flash PROM(平臺閃存配置芯片),專為 Xilinx FPGA 和 CPLD 系列產品提供非易失性配置存儲支持。憑借其 32 Mbit 的大容量與出色的系統兼容性,該芯片成為中高端 FP…

重復文件清理工具,附免費鏈接

鏈接:https://pan.baidu.com/s/1s_Zx1eHp5Y-XnbbGldIgvw?pwdkjex 提取碼:kjex 復制這段內容后打開百度網盤手機App,操作更方便哦

【Spring Boot 快速入門】二、請求與響應

目錄請求響應請求Postman 工具簡單參數請求實體參數請求數組集合參數日期參數JSON 參數路徑參數響應請求響應 請求 Postman 工具 Postman 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件 作用:常用于進行接口測試 簡單參數請求 原始方式 在原始的…

高并發系統技術架構

(點個贊,算法會給你推薦更多類似干貨 ~) 口訣: CDN 扛靜態,WAF 防惡意;驗證碼攔機器; Nginx 先限流,Sentinel 再熔斷; Redis 扣庫存,MQ 異步寫; 對…

python任意模塊間采用全局字典來實現借用其他類對象的方法函數來完成任務或數據通信的功能

我們在編寫pthon代碼時,模塊間的數據通信主要采用以下幾種方法:1、采用全局變量。所有模塊都通過引用全局變量,通過本模塊對此全局變量數據的修改值,其他模塊也能訪問并得到此全局變量的當前值,由于全局變量的不可控性…

linux 部署 flink 1.15.1 并提交作業

下載 1.15.1 https://flink.apache.org/downloads.html#apache-flink-1151 部署模式分類 會話模式應用模式單作業模式 1、會話模式 先啟動一個集群,保持一個會話,然后通過客戶端提交作業,所有作業都在一個會話執行; 會話模式適合規…

Redis數據量過大的隱患:查詢會變慢嗎?如何避免?

一、Redis數據過多引發的五大隱患(附系統交互圖) #mermaid-svg-X83bpHUu830QXKUt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X83bpHUu830QXKUt .error-icon{fill:#552222;}#mermaid-svg-…

網絡與信息安全有哪些崗位:(3)安全運維工程師

安全運維工程師是企業安全防線的 “日常守護者”,既要確保安全設備與系統的穩定運行,又要實時監控潛在威脅,快速響應并處置安全事件,是連接安全技術與業務運營的關鍵角色。其核心價值在于通過常態化運維,將安全風險控制…

魚皮項目簡易版 RPC 框架開發(三)

本文為筆者閱讀魚皮的項目 《簡易版 RPC 框架開發》的筆記,如果有時間可以直接去看原文, 1. 簡易版 RPC 框架開發 前面的內容可以筆者的前面兩個篇筆記 魚皮項目簡易版 RPC 框架開發(一) 魚皮項目簡易版 RPC 框架開發(…

嵌入式Linux:注冊線程清理處理函數

在 Linux 多線程編程中,線程終止時可以執行特定的清理操作,通過注冊線程清理函數(thread cleanup handler)來實現。這類似于使用 atexit() 注冊進程終止處理函數。線程清理函數用于在線程退出時執行一些資源釋放或清理工作&#x…

【Git】Linux-ubuntu 22.04 初步認識 -> 安裝 -> 基礎操作

文章目錄Git 初識Git 安裝Linux-centosLinux-ubuntuWindowsGit 基本操作配置 Git認識工作區、暫存區、版本庫添加文件 -- 場景一查看 .git 文件添加文件 -- 場景二修改文件版本回退撤銷修改情況一:對于工作區的代碼,還沒有 add情況二:已經 ad…