在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內(nèi)不再提示

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

Linux閱碼場 ? 來源:Linuxer ? 2019-11-29 14:29 ? 次閱讀

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

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

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

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

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

共享內(nèi)存的方式有很多種,目前主流的方式仍然有:

共享內(nèi)存的方式

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

2.基于POSIXmmap文件映射實現(xiàn)共享內(nèi)存;

3.通過memfd_create()和fd跨進程共享實現(xiàn)共享內(nèi)存;

4.多媒體、圖形領(lǐng)域廣泛使用的基于dma-buf的共享內(nèi)存。

共享內(nèi)存

SYS V共享內(nèi)存

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

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

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

以及共享內(nèi)存的讀端sr.c:

編譯和準備運行:

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

下面運行sw和sr:

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

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

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

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

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

POSIX共享內(nèi)存

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

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

讀端:

編譯和執(zhí)行:

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

坦白講,mmap、munmap這樣的API讓我找到了回家的感覺,剛?cè)胄凶鯨inux的時候,寫好framebuffer驅(qū)動后,就是把/dev/fb0 mmap到用戶空間來操作,所以mmap這樣的 API,真的是特別親切,像親人一樣。

當然,如果你不喜歡shm_open()這個API,你也可以用常規(guī)的open來打開文件,然后進行mmap。關(guān)鍵的是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的共享內(nèi)存,仍然符合我們前面說的tmpfs的特點,在運行了sw,sr后,再運行psw和psr,我們發(fā)現(xiàn)free命令再次戲劇性變化:

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

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

memfd_create

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

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

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

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

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

fd = open();

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

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

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

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

    關(guān)注

    68

    文章

    11011

    瀏覽量

    215259
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212376

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    Linux系統(tǒng)中通過預留物理內(nèi)存實現(xiàn)ARM與FPGA高效通信的方法

    管理子系統(tǒng)管理。因此,需要預留部分物理內(nèi)存,使其不被內(nèi)核管理。接下來將為大家詳細介紹在 Linux 系統(tǒng)中通過預留物理內(nèi)存實現(xiàn) ARM 與 FPGA 高效通信的方法,預留物理
    的頭像 發(fā)表于 04-16 13:42 ?376次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)中通過預留物理<b class='flag-5'>內(nèi)存</b>實現(xiàn)ARM與FPGA高效通信的方法

    無法使用API實現(xiàn)NPU與OpenVINO?的內(nèi)存共享怎么辦?

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

    Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時的常見問題

    Linux系統(tǒng)中,虛擬內(nèi)存管理是操作系統(tǒng)內(nèi)核的個重要功能,負責管理物理內(nèi)存和磁盤上的交換空間。以下是對Linux下如何管理虛擬
    的頭像 發(fā)表于 12-04 09:19 ?1051次閱讀

    Linux內(nèi)存泄露案例分析和內(nèi)存管理分享

    作者:京東科技 李遵舉 、問題 近期我們運維同事接到線上LB(負載均衡)服務內(nèi)存報警,運維同事反饋說LB集群有部分機器的內(nèi)存使用率超過80%,有的甚至超過90%,而且內(nèi)存使用率還再不
    的頭像 發(fā)表于 10-24 16:14 ?969次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>泄露案例分析和<b class='flag-5'>內(nèi)存</b>管理分享

    Windows管理內(nèi)存的三種主要方式

    Windows操作系統(tǒng)提供了多種方式來管理內(nèi)存,以確保系統(tǒng)資源的有效利用和性能的優(yōu)化。以下是關(guān)于Windows管理內(nèi)存的三種主要方式的詳細闡述,包括堆內(nèi)存管理、虛擬內(nèi)存管理以及
    的頭像 發(fā)表于 10-12 17:09 ?2034次閱讀

    如何使用反射內(nèi)存交換機

    反射內(nèi)存交換機是種用于實現(xiàn)高速數(shù)據(jù)共享和通信的關(guān)鍵設備,以下是關(guān)于如何使用反射內(nèi)存交換機的詳細介紹:、前期準備?在開始使用反射
    發(fā)表于 09-14 09:23 ?0次下載

    如何選擇反射內(nèi)存

    ,應優(yōu)先選擇具有納秒級延遲和高傳輸速率的產(chǎn)品。內(nèi)存容量:確定所需的內(nèi)存容量,以滿足系統(tǒng)在特定時間段內(nèi)存儲和共享數(shù)據(jù)的需求。如果數(shù)據(jù)量較大或者需要長時間保存數(shù)據(jù),應選
    的頭像 發(fā)表于 09-05 09:37 ?440次閱讀
    如何選擇反射<b class='flag-5'>內(nèi)存</b>卡

    反射內(nèi)存卡使用手冊

    反射內(nèi)存卡使用手冊、引言()背景作用:反射內(nèi)存卡允許采用不同總線結(jié)構(gòu)和不同操作系統(tǒng)的計算機以確定的速率實時共享數(shù)據(jù)。當數(shù)據(jù)寫入本地反射
    的頭像 發(fā)表于 09-04 14:47 ?868次閱讀
    反射<b class='flag-5'>內(nèi)存</b>卡使用手冊

    16 口多模反射內(nèi)存交換機:高速數(shù)據(jù)共享的核心樞紐

    在當今數(shù)字化和信息化高速發(fā)展的時代,數(shù)據(jù)的快速傳輸、實時共享以及高效處理成為了眾多行業(yè)和領(lǐng)域追求的關(guān)鍵目標。在這樣的背景下,16口多模反射內(nèi)存交換機應運而生,成為了構(gòu)建高性能數(shù)據(jù)共享網(wǎng)絡的重要
    的頭像 發(fā)表于 09-04 14:38 ?467次閱讀
    16 口多模反射<b class='flag-5'>內(nèi)存</b>交換機:高速數(shù)據(jù)<b class='flag-5'>共享</b>的核心樞紐

    多模反射內(nèi)存交換機:實現(xiàn)高速實時數(shù)據(jù)共享的關(guān)鍵設備

    在當今數(shù)字化、信息化的時代,數(shù)據(jù)的快速傳輸和實時共享對于許多領(lǐng)域的系統(tǒng)運行至關(guān)重要。多模反射內(nèi)存交換機作為種先進的網(wǎng)絡設備,為滿足這些需求提供了高效、可靠的解決方案。多模反射內(nèi)存交換
    的頭像 發(fā)表于 09-04 10:55 ?495次閱讀
    多模反射<b class='flag-5'>內(nèi)存</b>交換機:實現(xiàn)高速實時數(shù)據(jù)<b class='flag-5'>共享</b>的關(guān)鍵設備

    PCIe 接口的反射內(nèi)存

    、確定性的數(shù)據(jù)共享。常見的反射內(nèi)存卡大小有128MB和256MB等。當在其中個卡的特定地址寫入數(shù)據(jù)時,數(shù)據(jù)會通過光纖快速傳輸?shù)骄W(wǎng)絡中的其他反射內(nèi)存卡的相同地址,從而
    的頭像 發(fā)表于 09-04 10:38 ?747次閱讀
    PCIe 接口的反射<b class='flag-5'>內(nèi)存</b>卡

    反射內(nèi)存卡與普通內(nèi)存卡的區(qū)別

    應用場景和目的反射內(nèi)存卡:主要用于需要多個設備或系統(tǒng)之間進行高速、實時數(shù)據(jù)共享和通信的場景,例如工業(yè)控制、航空航天等領(lǐng)域。普通內(nèi)存卡:通常用于個人電子設備,如手機、相機、平板電腦等,用于存儲文件
    的頭像 發(fā)表于 09-04 10:24 ?1002次閱讀
    反射<b class='flag-5'>內(nèi)存</b>卡與普通<b class='flag-5'>內(nèi)存</b>卡的區(qū)別

    反射內(nèi)存卡原理說明

    、引言反射內(nèi)存卡是種用于實現(xiàn)高速數(shù)據(jù)共享和實時通信的先進技術(shù)。它在多個領(lǐng)域,特別是對數(shù)據(jù)傳輸速度和實時性要求極高的應用中,發(fā)揮著關(guān)鍵作用。二、基本原理
    的頭像 發(fā)表于 09-04 10:19 ?595次閱讀
    反射<b class='flag-5'>內(nèi)存</b>卡原理說明

    buffers內(nèi)存與cached內(nèi)存的區(qū)別

    free 命令是Linux系統(tǒng)上查看內(nèi)存使用狀況最常用的工具,然而很少有人能說清楚 “buffers” 與 “cached” 之間的區(qū)別。
    的頭像 發(fā)表于 07-29 14:17 ?708次閱讀
    buffers<b class='flag-5'>內(nèi)存</b>與cached<b class='flag-5'>內(nèi)存</b>的區(qū)別

    16 口多模反射內(nèi)存交換機:高速數(shù)據(jù)共享的核心樞紐

    內(nèi)存交換機應運而生,成為了構(gòu)建高性能數(shù)據(jù)共享網(wǎng)絡的重要組成部分。? 16 口多模反射內(nèi)存交換機,從字面上理解,它是種具備 16 個端口,且采用多模傳輸方式的反射
    的頭像 發(fā)表于 07-15 10:01 ?484次閱讀
    16 口多模反射<b class='flag-5'>內(nèi)存</b>交換機:高速數(shù)據(jù)<b class='flag-5'>共享</b>的核心樞紐
    主站蜘蛛池模板: 最新人妖shemaletube人妖 最新日本免费一区二区三区中文 | 久久精彩免费视频 | 精品成人在线 | 日韩在线三级 | 久久夜色精品国产飘飘 | 天天夜夜啦啦啦 | 国产视频首页 | 欧美zoozzooz性欧美 | 天天弄 | 天天综合天天看夜夜添狠狠玩 | 91最新网站免费 | 色爱区综合激月婷婷激情五月 | 你懂的网站在线播放 | 成人网中文字幕色 | 兔费看全黄三级 | 天天在线天天在线天天影视 | 国产色爽免费视频 | 特级毛片永久久免费观看 | 海外毛片 | 国产精品午夜寂寞视频 | 69pao强力打造在线 | 国产免费久久精品99久久 | bt种子磁力天堂torrent | 国产69精品久久久久9牛牛 | 国产美女一级ba大片免色 | 国产片91人成在线观看 | 国产婷婷高清在线观看免费 | 国产精品久久久久久久久kt | 国产在线精品一区二区夜色 | 亚色图 | 天堂在线中文网 | 四虎网站网址 | 欧美成人三级网站 | 色秀视频免费网站在线观看 | 黄色三级网站 | 免费看h视频 | 中文字幕在线一区 | 日本一区高清视频 | 9966国产精品视频 | 在线视频一区二区三区 | 亚洲国产色婷婷精品综合在线观看 |