linux應用開發基礎知識(八)——內存共享(mmap和system V)

mmap內存映射

內存共享定義

內存映射,簡而言之就是將用戶空間的一段內存區域映射到內核空間,映射成功后,用戶對這段內存區域的修改可以直接反映到內核空間,同樣,內核空間對這段區域的修改也直接反映用戶空間。那么對于內核空間<---->用戶空間兩者之間需要大量數據傳輸等操作的話效率是非常高的。

以下是一個把普遍文件映射到用戶空間的內存區域的示意圖
在這里插入圖片描述

mmap內存映射方法

mmap是一種內存映射文件的方法,即將一個文件或者其它對象映射到進程的地址空間,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系。
實現這樣的映射關系后,進程就可以采用指針的方式讀寫操作這一段虛擬內存,而系統會自動回寫到對應的文件磁盤上,即完成了對文件的操作而不必再調用read,write等系統調用函數。
相反,內核空間對這段區域的修改也直接反映用戶空間,從而可以實現不同進程間的文件共享。如下圖所示:
在這里插入圖片描述

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

參數說明:
參數start:指向欲映射的內存起始地址,通常設為 NULL,代表讓系統自動選定地址,映射成功后返回該地址。
參數length:代表將文件中多大的部分映射到內存。
參數prot:映射區域的保護方式。可以為以下幾種方式的組合:

PROT_READ(可讀)
PROT_WRITE(可寫)
PROT_EXEC(可執行)
PROT_NONE(不可訪問)

參數flags:由以下幾個常值指定:

MAP_SHARED(共享的)
MAP_PRIVATE(私有的)
MAP_FIXED(表示必須使用 start 參數作為開始地址,如果失敗不進行修正)
其中,MAP_SHARED , MAP_PRIVATE必選其一,而 MAP_FIXED 則不推薦使用。MAP_ANONYMOUS(匿名映射,用于血緣關系進程間通信)

參數fd:表示要映射的文件句柄。如果匿名映射寫-1。
參數offset:表示映射文件的偏移量,一般設置為 0 表示從文件頭部開始映射。offset必須是分頁大小的整數倍(一般是4096的整數倍)。

寫共享文件

#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"fcntl.h"
#include"sys/mman.h"
#include"sys/stat.h"
#include"stdlib.h"
#include"sys/types.h"
int main(int agrc,char* agrv[])
{int len;int fd;void* map;fd = open("1.txt",O_RDWR);if(fd<0){perror("open");return -1;}len = lseek(fd, 0, SEEK_END); printf("%d\n",len);map = mmap(NULL,len,PROT_WRITE,MAP_SHARED,fd,0);if(map == MAP_FAILED){perror("mmap");return -1;}for(int i=0;i<5;i++){memcpy(map++, "b", 1);}return 0;
}

讀共享文件

#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"fcntl.h"
#include"sys/mman.h"
#include"sys/stat.h"
#include"stdlib.h"
#include"sys/types.h"
int main(int agrc,char* agrv[])
{int len;int fd;void* map;fd = open("1.txt",O_RDWR);if(fd<0){perror("open");return -1;}len = lseek(fd, 0, SEEK_END); map = mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);if(map == MAP_FAILED){perror("mmap");return -1;}while (1) {printf("%s\n",(char*)map);}return 0;
}

mmap內存映射注意事項

(1) 創建映射區的過程中,隱含著一次對映射文件的讀操作,將文件內容讀取到映射區。
(2) 當MAP_SHARED時,要求:映射區的權限應 <= 文件打開的權限(出于對映射區的保護),如果不滿足報非法參數(Invalid argument)錯誤。
當MAP_PRIVATE時候,mmap中的權限是對內存的限制,只需要文件有讀權限即可,操作只在內存有效,不會寫到物理磁盤,且不能在進程間共享。
(3) 映射區的釋放與文件關閉無關,只要映射建立成功,文件可以立即關閉。
(4) 用于映射的文件大小必須>0,當映射文件大小為0時,指定非0大小創建映射區,訪問映射地址會報總線錯誤,指定0大小創建映射區,報非法參數錯誤(Invalid argument)
(5) 文件偏移量必須為0或者4096的整數倍(不是會報非法參數Invalid argument錯誤).
(6)映射大小可以大于文件大小,但只能訪問文件page的內存地址,否則報總線錯誤 ,超出映射的內存大小報段錯誤.

在這里插入圖片描述

system V共享內存

使用system V共享內存的步驟

1、創建/打開共享內存。
2、映射共享內存,即把指定的共享內存映射到進程的地址空間用于訪問。
3、讀寫共享內存。
4、撤銷共享內存映射。
5、刪除共享內存對象。

相關API

//共享內存創建
int shmget(key_t key, int size, int shmflg);
//共享內存映射
void  *shmat(int shmid, const void *shmaddr, int shmflg);
//共享內存撤銷,撤銷后內存地址不可再訪問
int  shmdt(void *shmaddr);
//共享內存控制
int  shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl(shmid, IPC_RMID, NULL);刪除共享內存

寫數據

#include<stdio.h>
#include"stdlib.h"
#include"unistd.h"
#include"sys/types.h"
#include"string.h"
#include"sys/stat.h"
#include"sys/shm.h"
#include"sys/ipc.h"
int main(int agrc,char* agrv[])
{key_t key;int shimd;void* shmaddr;key = ftok("2.txt", 100);printf("key = %d\n",key);if(key == -1){perror("key");return -1;}shimd = shmget(key, 512, IPC_CREAT|0666);printf("shimd = %d\n",shimd);if(shimd == -1){perror("get");return -1;}shmaddr = shmat(shimd, NULL, 0);strcpy(shmaddr, "hello,world!");sleep(1);return 0;
}

讀數據

#include<stdio.h>
#include"stdlib.h"
#include"unistd.h"
#include"sys/types.h"
#include"string.h"
#include"sys/stat.h"
#include"sys/shm.h"
#include"sys/ipc.h"
int main(int agrc,char* agrv[])
{key_t key;int shimd;void* shmaddr;key = ftok("2.txt", 100);if(key == -1){perror("key");return -1;}shmaddr = shmat(32811, NULL, 0);printf("%s\n",(char*)shmaddr);shmdt(shmaddr);sleep(1);return 0;
}

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

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

相關文章

海外注冊 | 歐盟醫療器械法規下免除臨床試驗的條件與要求

在歐盟醫療器械法規&#xff08;MDR&#xff09;的嚴格監管下&#xff0c;植入性醫療器械和III類醫療器械通常需要進行臨床試驗來證明其安全性和性能。 然而&#xff0c;MDR也規定了一些特定情況下免除臨床試驗的可能性。以下是免除臨床試驗的條件和要求的詳細說明&#xff1a…

MVC(Model-View-Controller)模式

MVC&#xff08;Model-View-Controller&#xff09;模式三個主要組件&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;視圖&#xff08;View&#xff09;&#xff0c;和控制器&#xff08;Controller&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;&a…

【高中數學/基本不等式】已知:a,b皆為正數,且1/(2a+b)+1/(a+2b)=1 求:a+b的最小值?

【問題來源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 第二題 【問題】 已知&#xff1a;a,b皆為正數&#xff0c;且1/(2ab)1/(a2b)1 求&#xff1a;ab的最小值&#xff1f; 【解答】 解&#xff1a;此題也有分母難消的問題&#xff…

人口萎縮,韓國釜山“進入消失階段”

KlipC報道&#xff1a;調查顯示&#xff0c;隨著低生育率和人口老化&#xff0c;釜山人口逐漸萎縮&#xff0c;韓國第二大城市釜山顯現出“進入消失階段”的跡象。 據悉&#xff0c;“消失風險指數”是將20歲至39歲女性人口總數除以65歲及以上人口得到的數值。當該指數大于1.5…

自然語言處理學習(2)基本知識 文本預處理+文本數據分析+文本增強

conda activate DL conda deactivate課程鏈接 一 一些包的安裝 1 stanfordcorenlp 在anoconda prompt 里面&#xff1a;進入自己的conda環境&#xff0c;pip install stanfordcorenlp 進入方式 相關包下載&#xff0c;Jar包我沒有下載下來&#xff0c;太慢了&#xff0c;這個…

記錄Atlas800服務器環境安裝

一、創建安裝賬號 groupadd HwHiAiUser useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash二、下載依賴包 以下包根據需求自行下載 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh wg…

debug-mmlab

mmyolo bug1: MMYOLO for yolov5 instance segmentation on balloon dataset getting this error "ValueError: Key img_path is not in available keys. solution: pip install albumentations1.3.1 reference

【計算機考研】408王道四本書的正確使用順序

個人認為如果對408的分數要求不太高&#xff0c;120分以下跟著王道就夠了&#xff0c;而120分以上還需要看一下教材。 王道的書很適合應試考試&#xff0c;書中的內容都是抓重點&#xff0c;咸魚老師上課講的內容也非常好&#xff0c;通俗易懂&#xff0c;計算機網絡要稍遜一些…

實現Linux C++進程意外退出時信號處理與堆棧打印

文章目錄 0. 引言1. 獲取堆棧信息流程圖2. 實現進程守護與信號處理2.1 進程如何守護化&#xff1f;2.2 信號處理hook函數注冊2.3 守護進程代碼熟宣 3. 堆棧信息捕獲與打印邏輯4. 其他說明5. 附錄完整代碼 0. 引言 在軟件開發中&#xff0c;特別是對于需要高可靠性的后臺服務或…

掌握Go語言郵件發送:net/smtp實用教程與最佳實踐

掌握Go語言郵件發送&#xff1a;net/smtp實用教程與最佳實踐 概述基本配置與初始化導入net/smtp包設置SMTP服務器基本信息創建SMTP客戶端實例身份驗證 發送簡單文本郵件配置發件人信息構建郵件頭部信息編寫郵件正文使用SendMail方法發送郵件示例代碼 發送帶附件的郵件郵件多部分…

大模型知識學習

大模型訓練過程 數據清洗 擬人化描述&#xff1a;知識庫整理 預訓練 擬人化描述&#xff1a;知識學習可以使用基于BERT預訓練模型進行訓練 指令微調 擬人化描述&#xff1a;實際工作技能學習實際操作&#xff1a;讓大模型模仿具體的輸入輸出進行擬合&#xff0c;即模仿學…

Study--Oracle-06-Oracler網絡管理

一、ORACLE的監聽管理 1、ORACLE網絡監聽配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle數據庫中&#xff0c;監聽器&#xff08;Listener&#xff09;是一個獨立的進程&#xff0c;它監聽數據庫服務器上的特定端口上的網絡連接請求&#xff0c…

Vitis AI - 量化流程詳解

目錄 1. 簡介 2. 具體流程 2.1 校準激活 2.2 量化感知訓練 2.3 量化校準配置 2.4 quantization 函數 3. 總結 1. 簡介 想象一下&#xff0c;你有一個非常聰明的機器人朋友&#xff0c;它可以幫你做很多事情&#xff0c;比如預測天氣。但是&#xff0c;這個機器人的大腦…

01 數據采集層 流量分發第一步規范采集海量數據

《易經》&#xff1a;“初九&#xff1a;潛龍勿用”。潛龍的意思是隱藏&#xff0c;陽氣潛藏&#xff0c;陽爻位于最下方稱為“初九”&#xff0c;龍潛于淵&#xff0c;是學而未成的階段&#xff0c;此時需要打好基礎。 而模塊一我們就是講解推薦系統有關的概念、基礎數據體系…

基于SpringBoot+Vue商戶點評管理與數據分析系統設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

使用 Vanna 生成準確的 SQL 查詢:工作原理和性能分析

Vanna工作原理 從本質上講,Vanna 是一個 Python 包,它使用檢索增強功能來幫助您使用 LLM 為數據庫生成準確的 SQL 查詢。 Vanna 的工作分為兩個簡單的步驟 - 在您的數據上訓練 RAG“模型”,然后提出問題,這些問題將返回可設置為在您的數據庫上自動運行的 SQL 查詢。 vn.t…

【后端面試題】【中間件】【NoSQL】MongoDB提高可用性的方案(主從結構、仲裁節點、分片、寫入語義)

主從結構 MongoDB的高可用和別的中間件的高可用方案基本類似。比如在MySQL里&#xff0c;接觸了分庫分表和主從同步&#xff1b;在Redis里&#xff0c;Redis也有主從結構&#xff1b;在Kafka里&#xff0c;分區也是有主從結構的。 所以先介紹啟用了主從同步 我們的系統有一個關…

基于Java的微信記賬小程序【附源碼】

摘 要 隨著我國經濟迅速發展&#xff0c;人們對手機的需求越來越大&#xff0c;各種手機軟件也都在被廣泛應用&#xff0c;但是對于手機進行數據信息管理&#xff0c;對于手機的各種軟件也是備受用戶的喜愛&#xff0c;記賬微信小程序被用戶普遍使用&#xff0c;為方便用戶能夠…

算法題中常用的C++功能

文章目錄 集合優先隊列雙端隊列排序時自定義比較函數最大數值字符串追加&#xff1a;刪除&#xff1a;子串&#xff1a; 元組vector查找創建和初始化賦值&#xff1a; 字典map引入頭文件定義和初始化插入元素訪問元素更新元素刪除元素檢查元素存在遍歷元素int和string轉換 集合…

Ubuntu20.04更新GLIBC到2.35版本

目錄 1 背景2 增加源2.1 標準源2.2 鏡像源 3 更新 1 背景 Ubuntu20.04默認GLIBC庫版本是2.31.今天碰到一個軟件需要2.35版本的GLIBC。 升級GLIBC庫有兩種方式&#xff1a; 下載高版本庫源碼&#xff0c;編譯后替換系統中低版本庫。由于GLIBC庫是Linux系統中最基礎庫&#xff…