Linux之共享內存mmap用法實例(六十三)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長!

優質專欄:Audio工程師進階系列原創干貨持續更新中……】🚀
優質專欄:多媒體系統工程師系列原創干貨持續更新中……】🚀
優質視頻課程:AAOS車載系統+AOSP14系統攻城獅入門實戰課原創干貨持續更新中……】🚀

人生格言: 人生從來沒有捷徑,只有行動才是治療恐懼和懶惰的唯一良藥.

更多原創,歡迎關注:Android系統攻城獅

歡迎關注Android系統攻城獅

🍉🍉🍉文章目錄🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Linux mmap介紹
    • 🌻3.代碼實例
      • 🐓3.1 基本內存映射和讀取
      • 🐓3.2 共享內存映射和寫入
      • 🐓3.3 匿名內存映射

🌻1.前言

本篇目的:Linux之共享內存mmap用法實例

🌻2.Linux mmap介紹

  • Linux下的mmap是一種內存映射的機制,允許用戶空間的應用程序將文件或設備直接映射到內存中。這種機制可以提供高效的大文件讀寫方式,同時避免了傳統文件讀寫操作的系統調用開銷。
  • mmap機制將文件內容映射到進程的地址空間,使得進程可以通過操作內存的方式讀寫文件,而無需進行文件系統的I/O操作。這對于頻繁訪問大型文件的應用程序來說,可以顯著提高性能,因為它減少了數據在用戶空間和內核空間之間的拷貝次數。
  • mmap函數的原型定義在<sys/mman.h>頭文件中,其基本調用形式如下:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • 參數說明如下:
  • addr:指定映射內存的起始地址,通常設置為NULL,讓系統自動選擇。
  • length:要映射的內存長度。
  • prot:映射區域的保護模式,可以是PROT_READPROT_WRITEPROT_EXEC等,或者它們的組合。
  • flags:映射區域的標志,常用的標志有MAP_SHAREDMAP_PRIVATEMAP_ANONYMOUSMAP_GROWSDOWN等。
  • fd:文件描述符,來自于之前對文件的open操作。
  • offset:文件映射開始的偏移量,通常是對文件大小的偏移。
    mmap的返回值是一個void*類型的指針,指向映射內存的起始地址。如果映射失敗,則返回NULL,并設置errno來指示錯誤。
    內存映射通常分為兩種模式:
  1. MAP_SHARED:映射區域的內存可以被多個進程共享。對共享映射區域的修改會立即反映到文件系統中,反之亦然。
  2. MAP_PRIVATE:映射區域的內存對其他進程是不可見的。對私有映射區域的修改不會影響文件系統,但可以提高數據訪問的效率。
    此外,mmap還可以用于匿名內存映射,即不與任何文件關聯的內存映射。這時可以使用MAP_ANONYMOUS標志,并通常與/dev/zero設備文件一起使用,以分配不來自文件的內存。
  • 內存映射的解除可以通過munmap函數實現,其原型如下:
int munmap(void *addr, size_t length);
  • 參數addrmmap返回的地址,length是要解除映射的長度。成功時返回0,失敗時返回-1并設置errno
  • mmap機制在Linux系統中廣泛應用于高效的數據處理,如數據庫、緩存、文件共享等。它也是許多高性能服務器和客戶端應用程序的關鍵特性之一。
  • 使用mmap時,開發者需要充分理解內存保護機制,以避免可能的競態條件和數據不一致問題。

🌻3.代碼實例

🐓3.1 基本內存映射和讀取

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <string>int main() {// 打開文件int fd = open("example.txt", O_RDONLY);if (fd == -1) {std::cerr << "Open file failed." << std::endl;return 1;}// 映射文件void* map = mmap(NULL, 1024, PROT_READ, MAP_PRIVATE, fd, 0);if (map == MAP_FAILED) {std::cerr << "Map memory failed." << std::endl;close(fd);return 1;}// 讀取映射的內容char buffer[1024];std::memcpy(buffer, map, 1024);// 輸出內容std::cout << "Content of the file: " << buffer << std::endl;// 解除映射munmap(map, 1024);// 關閉文件close(fd);return 0;
}

🐓3.2 共享內存映射和寫入

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <string>int main() {// 創建共享內存文件int fd = open("shared_memory.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) {std::cerr << "Open file failed." << std::endl;return 1;}// 映射文件void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (map == MAP_FAILED) {std::cerr << "Map memory failed." << std::endl;close(fd);return 1;}// 寫入內容std::string message("Hello, shared memory!");std::memcpy(map, message.c_str(), message.size());// 輸出內容char buffer[1024];std::memcpy(buffer, map, 1024);std::cout << "Written content: " << buffer << std::endl;// 解除映射munmap(map, 1024);// 關閉文件close(fd);return 0;
}

🐓3.3 匿名內存映射

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <string>int main() {// 創建一個匿名內存區域void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);if (map == MAP_FAILED) {std::cerr << "Map memory failed." << std::endl;return 1;}// 寫入內容std::string message("Hello, anonymous memory!");std::memcpy(map, message.c_str(), message.size());// 輸出內容char buffer[1024];std::memcpy(buffer, map, 1024);std::cout << "Written content: " << buffer << std::endl;// 輸出內容char buffer[1024];std::memcpy(buffer, map, 1024);std::cout << "Written content: " << buffer << std::endl;// 解除映射munmap(map, 1024);return 0;
}

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

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

相關文章

外賣霸王餐返利外賣會員卡小程序開發

外賣霸王餐返利外賣會員卡小程序開發 "社交電商賦能下的外賣返利小程序"是專為商家與用戶雙贏而設計的創新平臺。 以下是其開發方案的詳細步驟&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我們需要明確小程序的核心功能和特色。包括設定活動類型、返利…

Python學習(3) 函數

定義 定義一個函數的格式&#xff1a; def 函數名(參數):執行代碼如果沒有參數&#xff0c;則稱為無參函數。 定義時小括號中寫的是形參&#xff08;形式參數&#xff09;&#xff0c;調用時寫的是實參&#xff08;實際參數&#xff09;。 調用 調用格式&#xff1a; def…

【Docker】Linux 系統(CentOS 7)安裝 Docker

文章目錄 對 VMware 軟件的建議官方說明文檔Docker安裝卸載舊版本docker設置倉庫開始安裝 docker 引擎最新版 Docker 安裝指定版本 Docker 安裝&#xff08;特殊需求使用&#xff09; 啟動 Docker查看 Docker 版本查看 Docker 鏡像設置 Docker 開機自啟動 驗證開機啟動是否生效…

自定義原生小程序頂部及獲取膠囊信息

需求&#xff1a;我需要將某個文字或者按鈕放置在小程序頂部位置 思路&#xff1a;根據獲取到的頂部信息來定義我需要放的這個元素樣式 * 這里我是定義某個指定頁面 json&#xff1a;給指定頁面的json中添加自定義設置 "navigationStyle": "custom" JS&am…

新時代AI浪潮下,程序員和產品經理如何入局AIGC領域?

當下&#xff0c;AI浪潮席卷全球&#xff0c;AIGC大模型技術已經成為當今技術領域的一個重要趨勢&#xff0c;對于產品經理來說&#xff0c;掌握這項技術不僅能夠增強他們的職業技能&#xff0c;還能在競爭激烈的職場中脫穎而出。 為什么呢&#xff1f; 把握AI時代的機遇 AI技…

StringMVC

目錄 一&#xff0c;MVC定義 二&#xff0c;SpringMVC的基本使用 2.1建立連接 - RequestMapping("/...") ?編輯 2.2請求 1.傳遞單個參數 2.傳遞多個參數 3.傳遞對象 4.參數重命名 5.傳遞數組 6. 傳遞集合 7.傳遞JSON數據 8. 獲取url中數據 9. 傳遞文…

怎么通過OpenAI API調用其多模態大模型(GPT-4o)

現在只要有額度&#xff0c;大家都可以調用OpenAI的多模態大模型了&#xff0c;例如GPT-4o和GPT-4 Turbo&#xff0c;我一年多前總結過一些OpenAI API的用法&#xff0c;發現現在稍微更新了一下。主要參考了這里&#xff1a;https://platform.openai.com/docs/guides/vision 其…

python數據類型之元組、集合和字典

目錄 0.三者主要作用 1.元組 元組特點 創建元組 元組解包 可變和不可變元素元組 2.集合 集合特點 創建集合 集合元素要求 集合方法 訪問與修改 子集和超集 相等性判斷 集合運算 不可變集合 3.字典 字典特點 字典創建和常見操作 字典內置方法 pprin模塊 0.…

k8s——Pod詳解

一、Pod基礎概念 1.1 Pod定義 Pod是kubernetes中最小的資源管理組件&#xff0c;Pod也是最小化運行容器化應用的資源對象。一個Pod代表著集群中運行的一個進程。kubernetes中其他大多數組件都是圍繞著Pod來進行支撐和擴展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod運行…

繆爾賽思又來到了你的面前(哈希)

定義一棵根節點為 1 1 1&#xff0c; n ( 2 ≤ n ≤ 1 0 3 ) n(2≤n≤10^3) n(2≤n≤103) 個節點的樹的哈希值為&#xff1a; H ∑ i 1 n X i Y f a ( i ) m o d 998244353 H∑^n_{i1}X^iY^{fa(i)}\ mod\ 998244353 Hi1∑n?XiYfa(i) mod 998244353 f a ( i ) fa(i) fa(i)…

斷網之后的頁面,Autox.js是點擊還是上下滑動比較好?

在處理斷網之后的頁面&#xff0c;選擇點擊還是上下滑動作為刷新操作&#xff0c;取決于應用的設計和用戶界面。通常&#xff0c;這兩種操作都可以作為刷新頁面的方式&#xff0c;但它們各自有不同的適用場景&#xff1a; 點擊刷新 - 適用場景&#xff1a;如果應用提供了一個明…

Java進階學習筆記7——權限修飾符

什么是權限修飾符&#xff1f; 就是用來限制類中的成員&#xff08;成員變量、成員方法、構造器、代碼塊....&#xff09;能夠被訪問的范圍。 protected使用的比較少&#xff0c;但是程序員還是要閱讀代碼&#xff0c;看官方文檔是怎么寫的&#xff0c;都會接觸到protected修飾…

C#串口通信-串口相關參數介紹

串口通訊(Serial Communication)&#xff0c;是指外設和計算機間&#xff0c;通過數據信號線、地線等&#xff0c;按位進行傳輸數據的一種雙向通訊方式。 串口是一種接口標準&#xff0c;它規定了接口的電氣標準&#xff0c;沒有規定接口插件電纜以及使用的通信協議&#xff0c…

ssh 配置 authorized_keys 后無法免密登錄

查看日志&#xff1a; tail -f /var/log/auth.log May 25 15:55:13 121 sudo: pam_unix(sudo:session): session opened for user root by root(uid0) May 25 15:55:13 121 sshd[550561]: Received signal 15; terminating. May 25 15:55:13 121 sshd[922866]: Server liste…

性能測試場景的設計方法

引用&#xff1a;根據2008年Aberdeen Group的研究報告&#xff0c;對于Web網站&#xff0c;1秒的頁面加載延遲相當于少了11%的PV&#xff08;page view&#xff09;&#xff0c;相當于降低了16%的顧客滿意度。如果從金錢的角度計算&#xff0c;就意味著&#xff1a;如果一個網站…

「探討」:什么是網絡審計?好用的網絡審計系統推薦【圖文詳解】

網絡是企業運營、政府管理、個人生活不可或缺的基礎設施。 然而網絡安全問題卻日益凸顯&#xff0c;數據泄露、網絡攻擊、欺詐行為等風險日益嚴重。 一、網絡審計的定義 網絡審計&#xff0c;又稱信息技術審計或電子審計&#xff0c;是指審計人員運用專業技能和工具&#xff…

fdk-aac將aac格式轉為pcm數據

int sampleRate 44100; // 采樣率int sampleSizeInBits 16; // 采樣位數&#xff0c;通常是16int channels 2; // 通道數&#xff0c;單聲道為1&#xff0c;立體聲為2FILE *m_fd NULL;FILE *m_fd2 NULL;HANDLE_AACDECODER decoder aacDecoder_Open(TT_MP4_ADTS, 1);if (!…

實戰之快速完成 ChatGLM3-6B 在 GPU-8G的 INT4 量化和本地部署

ChatGLM3 (ChatGLM3-6B) 項目地址 https://github.com/THUDM/ChatGLM3大模型是很吃CPU和顯卡的&#xff0c;所以&#xff0c;要不有一個好的CPU&#xff0c;要不有一塊好的顯卡&#xff0c;顯卡盡量13G&#xff0c;內存基本要32GB。 清華大模型分為三種(ChatGLM3-6B-Base&…

“大數據建模、分析、挖掘技術應用研修班”的通知!

隨著2015年9月國務院發布了《關于印發促進大數據發展行動綱要的通知》&#xff0c;各類型數據呈現出了指數級增長&#xff0c;數據成了每個組織的命脈。今天所產生的數據比過去幾年所產生的數據大好幾個數量級&#xff0c;企業有了能夠輕松訪問和分析數據以提高性能的新機會&am…

Vue3中為Ant Design Vue中table的checkbox加tooltip、popover

問題的產生 Vue版本&#xff1a;3.3.13 ant-design-vue 版本&#xff1a;3.x.x 在工作時遇到一個場景&#xff0c;需要在 ant-table 的 checkbox 被禁用的時候提示原因&#xff0c;但是在 ant-design-vue 文檔中并沒有發現有相關介紹。 首先我去看了issue中是否有提到相關問題…