chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Linux閱碼場(chǎng) ? 來(lái)源:Linuxer ? 2019-11-29 14:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

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

共享內(nèi)存

SYS V共享內(nèi)存

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

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

下面寫(xiě)一個(gè)最簡(jiǎn)單的程序來(lái)看共享內(nèi)存的寫(xiě)端sw.c:

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

編譯和準(zhǔn)備運(yùn)行:

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

下面運(yùn)行sw和sr:

我們發(fā)現(xiàn)sr打印出來(lái)的和sw寫(xiě)進(jìn)去的是一致的。這個(gè)時(shí)候我們?cè)倏聪耭ree:

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

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

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

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

POSIX共享內(nèi)存

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

上面的程序如果用POSIX的寫(xiě)法,可以簡(jiǎn)化成寫(xiě)端psw.c:

讀端:

編譯和執(zhí)行:

這樣我們會(huì)在/dev/shm/、/run/shm下面看到一個(gè)文件:

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

當(dāng)然,如果你不喜歡shm_open()這個(gè)API,你也可以用常規(guī)的open來(lái)打開(kāi)文件,然后進(jìn)行mmap。關(guān)鍵的是mmap,wikipedia如是說(shuō):

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)存,仍然符合我們前面說(shuō)的tmpfs的特點(diǎn),在運(yùn)行了sw,sr后,再運(yùn)行psw和psr,我們發(fā)現(xiàn)free命令再次戲劇性變化:

請(qǐng)將這個(gè)free命令的結(jié)果與前2次的free結(jié)果的各個(gè)字段進(jìn)行對(duì)照:

第3次比第2次的cached大了這么多?是因?yàn)槲揖帉?xiě)這篇文章邊在訪問(wèn)磁盤(pán)里面的文件,當(dāng)然POSIX的這個(gè)共享內(nèi)存本身也導(dǎo)致cached增大了。

memfd_create

如果說(shuō)POSIX的mmap讓我找到回家的感覺(jué),那么memfd_create()則是萬(wàn)般驚艷。見(jiàn)過(guò)這種API,才知道什么叫天生尤物——而且是尤物中的尤物,它完全屬于那種讓碼農(nóng)第一眼看到就會(huì)兩眼充血,恨不得眼珠子奪眶而出貼到它身上去的那種API;一般人見(jiàn)到它第一次,都會(huì)忽略了它的長(zhǎng)相,因?yàn)樗纳聿膶?shí)在太火辣太搶眼了。

先不要浮想聯(lián)翩,在所有的所有開(kāi)始之前,我們要先提一下跨進(jìn)程分享fd(文件描述符,對(duì)應(yīng)我們很多時(shí)候說(shuō)的“句柄”)這個(gè)重要的概念。

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

這個(gè)進(jìn)程的0,1,2和那個(gè)進(jìn)程的0,1,2不是一回事。

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

fd = open();

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

Linux提供一個(gè)特殊的方法,可以把一個(gè)進(jìn)程的fd甩鍋、踢皮球給另外一個(gè)進(jìn)程(其實(shí)“甩鍋”這個(gè)詞用在這里不合適,因?yàn)椤八﹀仭笔且环N推卸,而fd的傳遞是一種分享)。我特碼一直想把我的bug甩(分)鍋(享)出去,卻發(fā)現(xiàn)總是被人把bug甩鍋過(guò)來(lái)。

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

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

    關(guān)注

    68

    文章

    11192

    瀏覽量

    221760
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11581

    瀏覽量

    217081

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    不同場(chǎng)景下的文件共享方案-SMB/WebDAV/FTP/ZeroNews

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

    RTOS怎么實(shí)現(xiàn)共享內(nèi)存?

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

    恒訊科技分析:Ubuntu云服務(wù)器數(shù)據(jù)共享高效方案

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

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

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

    黑芝麻智能芯多域零拷貝共享內(nèi)存技術(shù):破解車載大數(shù)據(jù)傳輸效能困局

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

    HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問(wèn)題性能優(yōu)化

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

    golang內(nèi)存分配

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

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

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

    hyper-v共享,Hyper-V 共享:Hyper-V的資源共享設(shè)置

    的解決方案。今天就為大家介紹Hyper-V共享:Hyper-V的資源共享設(shè)置。 ? ?在Hyper-V虛擬化環(huán)境中,資源共享是實(shí)現(xiàn)高效管理和靈活部署的關(guān)鍵功能之。Hyper-V提供了
    的頭像 發(fā)表于 02-07 10:26 ?1647次閱讀
    hyper-v<b class='flag-5'>共享</b>,Hyper-V <b class='flag-5'>共享</b>:Hyper-V的資源<b class='flag-5'>共享</b>設(shè)置

    Linux服務(wù)器卡頓救星之招釋放Cache內(nèi)存

    在程序運(yùn)行結(jié)束后不會(huì)自動(dòng)釋放。這可能會(huì)導(dǎo)致程序頻繁讀寫(xiě)文件后可用物理內(nèi)存變得很少,必要時(shí)(比如內(nèi)存確實(shí)不夠用),需要主動(dòng)釋放緩存內(nèi)存。 注意:般情況下,是不推薦主動(dòng)釋放緩存
    的頭像 發(fā)表于 01-16 10:04 ?2023次閱讀

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

    天津拓航科技自研生產(chǎn)的反射內(nèi)存交換機(jī)完全兼容替代GE八口反射內(nèi)存交換機(jī)
    發(fā)表于 12-06 15:40 ?0次下載

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

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

    虛擬內(nèi)存不足如何解決 虛擬內(nèi)存和物理內(nèi)存的區(qū)別

    虛擬內(nèi)存不足的解決方案 虛擬內(nèi)存不足是計(jì)算機(jī)用戶經(jīng)常遇到的問(wèn)題,尤其是在運(yùn)行大型軟件或多任務(wù)處理時(shí)。以下是些解決虛擬內(nèi)存不足問(wèn)題的方法: 增加物理
    的頭像 發(fā)表于 12-04 09:14 ?2085次閱讀

    DDR5內(nèi)存與DDR4內(nèi)存性能差異

    DDR5內(nèi)存與DDR4內(nèi)存性能差異 隨著技術(shù)的發(fā)展,內(nèi)存技術(shù)也在不斷進(jìn)步。DDR5內(nèi)存作為新代的內(nèi)存
    的頭像 發(fā)表于 11-29 14:58 ?3977次閱讀

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

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