91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

世上最好的共享內存(Linux共享內存最透徹的一篇)上集

Linux閱碼場 ? 來源:Linuxer ? 2019-11-29 14:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

共享單車、共享充電寶、共享雨傘,世間的共享有千萬種,而我獨愛共享內存。

早期的共享內存,著重于強調把同一片內存,map到多個進程的虛擬地址空間(在相應進程找到一個VMA區(qū)域),以便于CPU可以在各個進程訪問到這片內存。

現階段廣泛應用于多媒體、Graphics領域的共享內存方式,某種意義上不再強調映射到進程虛擬地址空間的概念(那無非是為了讓CPU訪問),而更強調以某種“句柄”的形式,讓大家知道某一片視頻、圖形圖像數據的存在并可以借助此“句柄”來跨進程引用這片內存,讓視頻encoder、decoder、GPU等可以跨進程訪問內存。所以不同進程用的加速硬件其實是不同的,他們更在乎的是可以通過一個handle拿到這片內存,而不再特別在乎CPU訪問它的虛擬地址(當然仍然可以映射到進程的虛擬地址空間供CPU訪問)。

只要內存的拷貝(memcpy)仍然是一個占據內存帶寬、CPU利用率的消耗大戶存在,共享內存作為Linux進程間通信、計算機系統(tǒng)里各個不同硬件組件通信的最高效方法,都將持續(xù)繁榮。關于內存拷貝會大多程度地占據CPU利用率,這個可以最簡單地嘗試拷貝1080P,幀率每秒60的電影畫面,我保證你的系統(tǒng)的CPU,蛋會疼地不行。

我早就想系統(tǒng)地寫一篇綜述Linux里面各種共享內存方式的文章了,但是一直被帶娃這個事業(yè)牽絆,今日我決定頂著娃娃們的山呼海嘯,也要寫一篇文章不吐不快。

共享內存的方式有很多種,目前主流的方式仍然有:

共享內存的方式

1.基于傳統(tǒng)SYS V的共享內存;

2.基于POSIXmmap文件映射實現共享內存;

3.通過memfd_create()和fd跨進程共享實現共享內存;

4.多媒體、圖形領域廣泛使用的基于dma-buf的共享內存。

共享內存

SYS V共享內存

歷史悠久、年代久遠、API怪異,對應內核代碼linux/ipc/shm.c,當你編譯內核的時候不選擇CONFIG_SYSVIPC,則不再具備此能力。

你在Linux敲ipcs命令看到的share memory就是這種共享內存:

下面寫一個最簡單的程序來看共享內存的寫端sw.c:

以及共享內存的讀端sr.c:

編譯和準備運行:

在此之前我們看一下系統(tǒng)的free:

下面運行sw和sr:

我們發(fā)現sr打印出來的和sw寫進去的是一致的。這個時候我們再看下free:

可以看到used顯著增大了(711632 -> 715908), shared顯著地增大了(2264-> 6360),而cached這一列也顯著地增大326604->330716。

我們都知道cached這一列統(tǒng)計的是file-backed的文件的page cache的大小。理論上,共享內存屬于匿名頁,但是由于這里面有個非常特殊的tmpfs(/dev/shm指向/run/shm,/run/shm則mount為tmpfs):

所以可以看出tmpfs的東西其實真的是有點含混:我們可以理解它為file-backed的匿名頁(anonymous page),有點類似女聲中的周深。前面我們反復強調,匿名頁是沒有文件背景的,這樣當進行內存交換的時候,是與swap分區(qū)交換。磁盤文件系統(tǒng)里面的東西在內存的副本是file-backed的頁面,所以不存在與swap分區(qū)交換的問題。但是tmpfs里面的東西,真的是在統(tǒng)計意義上統(tǒng)計到page cache了,但是它并沒有真實的磁盤背景,這又和你訪問磁盤文件系統(tǒng)里面的文件產生的page cache有本質的區(qū)別。所以,它是真地有那么一點misc的感覺,凡事都沒有絕對,唯有變化本身是不變的。

也可以通過ipcs找到新創(chuàng)建的SYS V共享內存:

POSIX共享內存

我對POSIX shm_open()、mmap () API系列的共享內存的喜愛,遠遠超過SYS V 100倍。原諒我就是一個懶惰的人,我就是討厭ftok、shmget、shmat、shmdt這樣的API。

上面的程序如果用POSIX的寫法,可以簡化成寫端psw.c:

讀端:

編譯和執(zhí)行:

這樣我們會在/dev/shm/、/run/shm下面看到一個文件:

坦白講,mmap、munmap這樣的API讓我找到了回家的感覺,剛入行做Linux的時候,寫好framebuffer驅動后,就是把/dev/fb0 mmap到用戶空間來操作,所以mmap這樣的 API,真的是特別親切,像親人一樣。

當然,如果你不喜歡shm_open()這個API,你也可以用常規(guī)的open來打開文件,然后進行mmap。關鍵的是mmap,wikipedia如是說:

mmap

In computing, mmap(2) is a POSIX-compliant Unix system call that maps files or devices into memory. It is a method of memory-mapped file I/O. It implements demand paging, because file contents are not read from disk directly and initially do not use physical RAM at all. The actual reads from disk are performed in a "lazy" manner, after a specific location is accessed. After the memory is no longer needed, it is important to munmap(2) the pointers to it. Protection information can be managed using mprotect(2), and special treatment can be enforced using madvise(2).

POSIX的共享內存,仍然符合我們前面說的tmpfs的特點,在運行了sw,sr后,再運行psw和psr,我們發(fā)現free命令再次戲劇性變化:

請將這個free命令的結果與前2次的free結果的各個字段進行對照:

第3次比第2次的cached大了這么多?是因為我編寫這篇文章邊在訪問磁盤里面的文件,當然POSIX的這個共享內存本身也導致cached增大了。

memfd_create

如果說POSIX的mmap讓我找到回家的感覺,那么memfd_create()則是萬般驚艷。見過這種API,才知道什么叫天生尤物——而且是尤物中的尤物,它完全屬于那種讓碼農第一眼看到就會兩眼充血,恨不得眼珠子奪眶而出貼到它身上去的那種API;一般人見到它第一次,都會忽略了它的長相,因為它的身材實在太火辣太搶眼了。

先不要浮想聯(lián)翩,在所有的所有開始之前,我們要先提一下跨進程分享fd(文件描述符,對應我們很多時候說的“句柄”)這個重要的概念。

眾所周知,Linux的fd屬于一個進程級別的東西。進入每個進程的/proc/pid/fd可以看到它的fd的列表:

這個進程的0,1,2和那個進程的0,1,2不是一回事。

某年某月的某一天,人們發(fā)現,一個進程其實想訪問另外一個進程的fd。當然,這只是目的不是手段。比如進程A有2個fd指向2片內存,如果進程B可以拿到這2個fd,其實就可以透過這2個fd訪問到這2片內存。這個fd某種意義上充當了一個中間媒介的作用。有人說,那還不簡單嗎,如果進程A:

fd = open();

open()如果返回100,把這個100告訴進程B不就可以了嗎,進程B訪問這個100就可以了。這說明你還是沒搞明白fd是一個進程內部的東西,是不能跨進程的概念。你的100和我的100,不是一個東西。這些基本的東西你搞不明白,你搞別的都是白搭。

Linux提供一個特殊的方法,可以把一個進程的fd甩鍋、踢皮球給另外一個進程(其實“甩鍋”這個詞用在這里不合適,因為“甩鍋”是一種推卸,而fd的傳遞是一種分享)。我特碼一直想把我的bug甩(分)鍋(享)出去,卻發(fā)現總是被人把bug甩鍋過來。

那么如何甩(分)鍋(享)fd呢?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11277

    瀏覽量

    224952
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009

原文標題:宋寶華:世上最好的共享內存(Linux共享內存最透徹的一篇)上集

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核伙伴系統(tǒng)內存申請函數詳解:從原理到實戰(zhàn)

    Linux 內核中,內存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開發(fā)、內核模塊開發(fā)的必備知識點。它通過 "2 的冪
    的頭像 發(fā)表于 02-10 16:58 ?3630次閱讀
    <b class='flag-5'>Linux</b>內核伙伴系統(tǒng)<b class='flag-5'>內存</b>申請函數詳解:從原理到實戰(zhàn)

    Linux下擴充Swap交換空間:解決內存不足的實用指南,這些影響要注意!

    大家在使用 Linux 系統(tǒng)(比如常用的 Ubuntu)時,是不是偶爾會遇到 “內存不足” 的彈窗?比如運行大型編譯任務、多開虛擬機、做數據分析,或者把 Linux 當服務器用的時候,物理內存
    的頭像 發(fā)表于 02-09 16:33 ?186次閱讀
    <b class='flag-5'>Linux</b>下擴充Swap交換空間:解決<b class='flag-5'>內存</b>不足的實用指南,這些影響要注意!

    Linux如何防止內存沖突?

    在聊這個話題之前,我們先回憶下單片機系統(tǒng)中是如何分配內存的?如果沒有bootloader,那硬件環(huán)境起來之后就直接進入主程序運行,如果有引導程序bootloader,那就需要設置好跳轉地址,否則設置不對,系統(tǒng)就無法啟動了。
    的頭像 發(fā)表于 01-30 16:51 ?1355次閱讀
    <b class='flag-5'>Linux</b>如何防止<b class='flag-5'>內存</b>沖突?

    【「Linux 設備驅動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    *kmalloc(size_t size, int flags);”函數。 通過對這章的學習,深刻體會到Linux內核的內存分配管理機制博大精深,有些知識點還是初次觸碰到,當然也有些耳熟能詳的概念,比如“寫
    發(fā)表于 01-16 20:05

    rk基于linux/android內存管理

    、內存分布 ? U-Boot 由前級 Loader 加載到 CONFIG_SYS_TEXT_BASE 地址,初始化時會探明當前系統(tǒng)的總內存容 量, 32 位平臺上認為最大 4GB 可用(但是不影響
    的頭像 發(fā)表于 12-15 10:42 ?208次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內存</b>管理

    Linux Swap交換空間詳解:Android編譯內存不足?這樣擴充立竿見影

    ? ? 在 ?Linux? 系統(tǒng)使用過程中,你是否遇到過? “ 內存不足 ”? 的報錯?比如編譯? Android? 源碼時,明明按教程操作,卻因物理內存沒達到? 16G? 要求而編譯中斷?這正是
    的頭像 發(fā)表于 12-06 08:10 ?4244次閱讀

    不同場景下的文件共享方案-SMB/WebDAV/FTP/ZeroNews

    四大主流文件共享方案,為企業(yè)選型提供專業(yè)參考。 SMB 簡介 SMB(Server Message Block) 是種網絡文件共享協(xié)議,主要用于局域網(LAN)內計算機之間的文件和打印機共享
    的頭像 發(fā)表于 08-28 12:04 ?970次閱讀
    不同場景下的文件<b class='flag-5'>共享</b>方案-SMB/WebDAV/FTP/ZeroNews

    RTOS怎么實現共享內存

    K230的RTOS支持POSIX標準的共享內存嗎 我嘗試使用卻失敗 還是說需要源碼部分配置的開啟才可以使用 求教大佬
    發(fā)表于 08-04 08:06

    恒訊科技分析:Ubuntu云服務器數據共享高效方案

    ,幫助您根據實際需求選擇最適合的解決方案。 、NFS(Network File System)共享方案 NFS是Linux系統(tǒng)中最常用的文件共享協(xié)議之
    的頭像 發(fā)表于 07-09 21:40 ?1480次閱讀

    高性能緩存設計:如何解決緩存?zhèn)?b class='flag-5'>共享問題

    在多核高并發(fā)場景下, 緩存?zhèn)?b class='flag-5'>共享(False Sharing) 是導致性能驟降的“隱形殺手”。當不同線程頻繁修改同緩存行(Cache Line)中的獨立變量時,CPU緩存致性協(xié)議會強制同步整個
    的頭像 發(fā)表于 07-01 15:01 ?762次閱讀
    高性能緩存設計:如何解決緩存?zhèn)?b class='flag-5'>共享</b>問題

    黑芝麻智能芯多域零拷貝共享內存技術:破解車載大數據傳輸效能困局

    通過 零拷貝共享內存技術 ,黑芝麻智能解決車載多域間大數據傳輸的延遲與資源消耗問題。核心技術包括 全局內存管理單元 和 dmabuf機制優(yōu)化 ,顯著降低CPU負載與DDR帶寬占用,推動汽車向
    發(fā)表于 06-23 17:53 ?1723次閱讀
    黑芝麻智能<b class='flag-5'>一</b>芯多域零拷貝<b class='flag-5'>共享</b><b class='flag-5'>內存</b>技術:破解車載大數據傳輸效能困局

    HarmonyOS優(yōu)化應用內存占用問題性能優(yōu)化

    ,包括數字、字符串等。共享對象傳輸指SharedArrayBuffer支持在多線程之間傳遞,傳遞之后的SharedArrayBuffer對象和原始的SharedArrayBuffer對象指向同內存
    發(fā)表于 05-21 11:27

    golang內存分配

    作者:錢文 Go 的分配采用了類似 tcmalloc 的結構.特點: 使用小塊小塊的連續(xù)內存頁, 進行分配某個范圍大小的內存需求. 比如某個連續(xù) 8KB 專門用于分配 17-24
    的頭像 發(fā)表于 03-31 15:00 ?514次閱讀
    golang<b class='flag-5'>內存</b>分配

    無法使用API實現NPU與OpenVINO?的內存共享怎么辦?

    無法使用 遠程張量 API 實現 NPU 與OpenVINO?的內存共享。
    發(fā)表于 03-06 07:11