system V共享內存【Linux】

文章目錄

  • 原理
  • shmget
  • ftok
  • shmat(share memory attach)
  • shmdt,去關聯(share memory delete attach)
  • shmctl ,刪除共享內存
  • 共享內存與管道

原理

共享內存本質讓不同進程看到同一份資源。
申請共享內存:
1、操作系統在物理內存當中申請一塊內存空間
2、將申請好的內存分別掛接到各自進程的進程地址空間上
具體如何掛接:
將這塊內存空間經過各自進程的頁表映射到進程地址空間的共享區中,給應用層返回共享內存的起始虛擬地址

從而實現了進程A和進程B通過各自的頁表訪問同一塊物理內存
在這里插入圖片描述

當前進程如何釋放共享內存:
1、把當前進程與共享內存去掉關聯,把頁表的映射關系去掉
2、釋放共享內存

申請共享內存、掛接、去掉關聯、釋放共享內存這些操作都不是進程直接操作的,是由操作系統來完成

在系統當中可能會有大量的進程在進行通信,因此系統當中就可能存在大量的共享內存,那么操作系統必然要對其進行管理,所以共享內存除了在內存當中真正開辟空間之外,系統一定還要為共享內存維護相關的內核數據結構

共享內存的數據結構:

struct shmid_ds {struct ipc_perm     shm_perm;   /* operation perms */int         shm_segsz;  /* size of segment (bytes) */__kernel_time_t     shm_atime;  /* last attach time */__kernel_time_t     shm_dtime;  /* last detach time */__kernel_time_t     shm_ctime;  /* last change time */__kernel_ipc_pid_t  shm_cpid;   /* pid of creator */__kernel_ipc_pid_t  shm_lpid;   /* pid of last operator */unsigned short      shm_nattch; /* no. of current attaches */unsigned short      shm_unused; /* compatibility */void            *shm_unused2;   /* ditto - used by DIPC */void            *shm_unused3;   /* unused */
};
struct ipc_perm{__kernel_key_t  key;__kernel_uid_t  uid;__kernel_gid_t  gid;__kernel_uid_t  cuid;__kernel_gid_t  cgid;__kernel_mode_t mode;unsigned short  seq;
};

shmget

在這里插入圖片描述
key:
1、必須在內核中具有唯一性,能夠讓不同的進程進行唯一性標識
2、第一個進程可以通過key創建共享內存,第二個之后的進程,只要拿著同一個key就可以和第一個進程看到同一個共享內存了
3、對于一個已經創建好的共享內存,key在哪 ?
key在共享內存的描述對象中

傳入shmget函數的第一個參數key,需要我們使用ftok函數進行獲取

size:
表示待創建共享內存的大小。
shmflg:
表示創建共享內存的方式
1、IPC_CREAT(單獨使用):
如果內核中不存在鍵值與key相等的共享內存,則新建一個共享內存并返回該共享內存的句柄;如果存在這樣的共享內存,則直接返回該共享內存的句柄

句柄:我們把具有標定某種資源能力的東西叫做句柄,而這里shmget函數的返回值實際上就是共享內存的句柄,這個句柄可以在用戶層標識共享內存,當共享內存被創建后,我們在后續使用共享內存的相關接口時,都是需要通過這個句柄對指定共享內存進行各種操作
2、IPC_CREAT | IPC_EXCL:
如果內核中不存在鍵值與key相等的共享內存,則新建一個共享內存并返回該共享內存的句柄;如果存在這樣的共享內存,則出錯返回

IPC_EXCL:不單獨使用!

ftok

在這里插入圖片描述
ftok函數的作用就是,將一個已存在的路徑名pathname和一個整數標識符proj_id轉換成一個key值,稱為IPC鍵值,在使用shmget函數獲取共享內存時,這個key值會被填充進維護共享內存的數據結構當中。需要注意的是,pathname所指定的文件必須存在且可存取

使用ftok函數生成key值可能會產生沖突,此時可以對傳入ftok函數的參數進行修改。
需要進行通信的各個進程,在使用ftok函數獲取key值時,都需要采用同樣的路徑名和和整數標識符,進而生成同一種key值,然后才能找到同一個共享資源

顯示系統中正在使用的System V共享內存段的信息

[cxq@iZ7xviiy0goapxtblgih6oZ 1. sharemem]$ ipcs -m

共享內存的生命周期是隨內核的,內核存在,共享內存就存在
用戶不主動關閉,共享內存會一直存在
如果想要關閉共享內存,只能內核重啟(用戶釋放)

關閉共享內存:

0是shmid

[cxq@iZ7xviiy0goapxtblgih6oZ 1. sharemem]$ ipcrm -m 0

在這里插入圖片描述

shmat(share memory attach)

在這里插入圖片描述

讓當前進程和指定的共享內存關聯起來

shmdt,去關聯(share memory delete attach)

在這里插入圖片描述

shmctl ,刪除共享內存

在這里插入圖片描述

第一個參數shmid,表示所控制共享內存的用戶級標識符。
第二個參數cmd,表示具體的控制動作。

shmctl函數的第二個參數傳入的常用的選項有以下三個
1、IPC_STAT,獲取共享內存的當前關聯值,此時參數buf作為輸出型參數
2、IPC_SET ,在進程有足夠權限的前提下,將共享內存的當前關聯值設置為buf所指的數據結構中的值
3、IPC_RMID ,刪除共享內存段

第三個參數buf,用于獲取或設置所控制共享內存的數據結構

代碼:兩個進程之間通信,使用共享內存和管道

共享內存與管道

管道通信:
在這里插入圖片描述
將一個文件從一個進程傳輸到另一個進程需要進行四次拷貝操作

1、server將信息從輸入文件復制到server的臨時緩沖區中。
2、將server臨時緩沖區的信息復制到管道中。
3、client將信息從管道復制到client的緩沖區中。
4、將client臨時緩沖區的信息復制到輸出文件中。

使用共享內存進行通信,將一個文件從client傳輸到server只需要進行兩次拷貝操作
1、從輸入文件到共享內存。
2、從共享內存到輸出文件。

優:共享內存是所有進程間通信方式中最快的一種通信方式,因為該通信方式需要進行的拷貝次數最少
缺:管道是自帶同步與互斥機制的,但是共享內存并沒有提供任何的保護機制,包括同步與互斥。

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

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

相關文章

詳解Redis:什么是Redis?

什么是Redis? Redis(Remote Dictionary Server)是一種開源的、高性能的、基于內存快速讀寫的的數據結構存儲系統,常用于緩存,分布式鎖等場景; Redis常用數據類型有哪些? String(字符串) 適用場景…

Qt中實現讓靜態圖片動起來,創建動畫效果

在現代應用程序開發中,動畫效果是提升用戶體驗的重要元素之一。Qt作為一個強大的跨平臺應用程序框架,提供了豐富的工具和庫來創建各種動畫效果。本文將介紹如何在Qt中使用靜態圖片創建動畫效果。 實現方法一 使用QTimer和QPixmap 1.準備圖片資源&#…

Qt圖形與圖片(Qt位置相關函數、Qt基礎圖形的繪制、雙緩沖機制、顯示SVG格式圖片)

此篇文章介紹幾種主要位置函數及其之間的區別,以及各種與位置相關函數的使用場合;然后,通過一個簡單繪圖工具實例,介紹利用QPainter和QPainterPath兩種方法繪制各種基礎圖形;最后,通過幾個實例介紹如何利用…

暑假自律日記十

7.11 (半小時日記打卡之——暑假第十天) 日程 8.30起床 9.20到達逸夫樓開始總結區間DP,上午完成了區間DP和四邊形優化部分的學習 下午組隊打了一場去年的牛客多校,壓力有點大,問題也有點多,總而言之&…

GD32F303RET6讀取SGM58031電壓值

1、SGM58031芯片詳解 (1)SGM58031是一款低功耗,16位精度,delta-sigma (ΔΣ)模數轉換器(ADC)。它從3V到5.5V供電。 (2)SGM58031包含一個片上參考和振蕩器。它有一個I2C兼容接口,可以選擇四個I2…

深入Memcached鍵值對限制:優化存儲策略

標題:深入Memcached鍵值對限制:優化存儲策略 Memcached作為一種廣泛使用的高性能分布式內存緩存系統,對鍵值對的大小有特定的限制。這些限制不僅關系到緩存效率,還直接影響到緩存數據的組織和內存的使用。本文將深入探討Memcache…

【RHCE】系統服務綜合實驗

一、實驗內容 現有主機 node01 和 node02,完成如下需求: 1、在 node01 主機上提供 DNS 和 WEB 服務 2、dns 服務提供本實驗所有主機名解析 3、web服務提供 www.rhce.com 虛擬主機 4、該虛擬主機的documentroot目錄在 /nfs/rhce 目錄 5、該目錄由 node02…

Python | Leetcode Python題解之第229題多數元素II

題目: 題解: class Solution:def majorityElement(self, nums: List[int]) -> List[int]:cnt {}ans []for v in nums:if v in cnt:cnt[v] 1else:cnt[v] 1for item in cnt.keys():if cnt[item] > len(nums)//3:ans.append(item)return ans

【conda】解決 An HTTP error occurred when trying to retrieve this URL.問題

1. 修改SSL驗證 如果其他方法無效,還可以嘗試關閉SSL驗證來解決問題。具體操作如下: 在終端中輸入以下命令,關閉SSL驗證: conda config --set ssl_verify false或者,在conda的配置文件(.condarc&#xff0…

為什么渲染農場渲染的是幀,而不是視頻?

在3D動畫產業的壯闊畫卷中,渲染農場作為幕后英雄,以其龐大的計算能力支撐起無數視覺奇觀的誕生。這些由高性能計算機集群構成的系統,通過獨特的逐幀渲染策略,解鎖了單機難以企及的創作自由與效率。本文將深入剖析這一策略背后的邏…

maven7——(重要,構建項目)maven項目構建(命令)

Maven的常用命令管理項目的生命周期 clean命令 清除編譯產生的target文件夾內容,可以配合相應命令在cmd中使用,如mvn clean package, mvn clean test D:\工作\公司培訓-4班\day20\day20\untitled1>mvn clean compile命令 該命令可以…

element如何實現自定義表頭?

有時候我們需要實現自定義表頭,例如表頭里加按鈕啥的,這時候就需要用到自定義表頭,但是官方對自定義表頭的使用寫的還是比較簡單,今天就來詳細說說 在需要使用自定義表頭的表頭上使用:render-header來啟用自定義表頭: <el-table-column :render-header="button&…

機器學習開源分子生成系列(2)-基于三維形狀和靜電相似性的DeepFMPO v3D安裝及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介紹及安裝使用。 一、DeepFMPO v3D是什么&#xff1f; github代碼介紹文章 在藥物發現中&#xff0c;如何尋找具新穎性和結構多樣性的候選分子是頗受藥物設計科學家關注的問題。通過虛擬篩選的化學空間搜索往往會受限于篩選…

Linux賬戶和組管理——用戶密碼文件,工作組賬號文件,用戶管理

#### 用戶密碼文件 - /etc/shadow存儲密碼加密后的密文&#xff0c;又稱為“影子文件”&#xff0c;該文件為了保證了賬戶密碼的安全性只有 root 賬戶擁有讀權限&#xff0c;注意&#xff1a;若該文件權限發生變化&#xff0c;需要留心惡意攻擊 bash [rootserver ~]# ll /etc/…

linux之棧溢出分析

我們來創建一個例子&#xff0c;其中包含一個段錯誤&#xff0c;這次是由于棧溢出導致的。這是一個常見的錯誤&#xff0c;通常發生在程序遞歸調用深度過大&#xff0c;超出了為棧分配的內存空間。 下面是一個簡單的C程序&#xff0c;stack_overflow_example.c&#xff0c;它通…

優化與改進之輕量級Transformer - Transformer教程

在自然語言處理&#xff08;NLP&#xff09;的世界里&#xff0c;Transformer模型無疑是一顆璀璨的明珠。自從它在2017年被提出以來&#xff0c;就憑借其強大的性能和優雅的設計贏得了廣泛的關注和應用。然而&#xff0c;隨著應用的深入&#xff0c;Transformer的體量和計算資源…

牛頓力學和拉格朗日力學求解atwood machine問題對比

一個半徑為 R R R、轉動慣量為 I I I 的圓盤。繩子與圓盤無滑動&#xff0c;質量 m 2 m_2 m2? 的物體在重力 g g g 作用下下墜&#xff0c;帶動質量 m 1 m_1 m1? 的物體上升。求 m 1 m_1 m1?和 m 2 m_2 m2? 的加速度 a a a。 牛頓力學方法 對質量 m 1 m_1 m1? 和 …

Web 性能入門指南-1.2 分析在線零售 Web 性能及優化方向

讓顧客滿意是零售業成功的秘訣。事實證明&#xff0c;提供快速、一致的在線體驗可以顯著提高零售商關心的每項指標——從轉化率和收入到留存率和品牌認知度。 本文大綱&#xff1a; 頁面速度影響在線零售業務數據 如何將您的網站速度與競爭對手進行比較 性能優化入門&#xf…

Scanner工具類

掃描控制臺輸入 1.nextLine nextLine() 方法會掃描輸入流中的字符&#xff0c;直到遇到行末尾的換行符 \n&#xff0c;然后將該行的內容作為字符串返回&#xff0c;同時&#xff0c;nextLine() 會將 Scanner 對象的位置移動到下一行的開頭&#xff0c;以便下一次讀取數據時從下…

代碼隨想錄day09 151.翻轉字符串里的單詞 、卡碼網:55.右旋轉字符串

代碼隨想錄day09 151.翻轉字符串里的單詞 、卡碼網&#xff1a;55.右旋轉字符串 151. 反轉字符串中的單詞 這題我直接想到的是istringstream 和 stack 但不知道這樣使用是不是違反了規定 class Solution { public:string reverseWords(string s) {istringstream iss(s);stri…