新聞中心
Linux作為一款自由開源的操作系統(tǒng),其性能和穩(wěn)定性備受贊譽,被廣泛應(yīng)用于服務(wù)器、嵌入式系統(tǒng)等領(lǐng)域。其中,mmap()系統(tǒng)調(diào)用是Linux有名的一大特色,它允許用戶進(jìn)程通過建立虛擬內(nèi)存映射來訪問文件或設(shè)備,實現(xiàn)了一個銜接內(nèi)存的方法,將磁盤上的文件映射到進(jìn)程地址空間,提高了文件的訪問效率。而mmap64的出現(xiàn),更是解決了32位平臺無法支持大內(nèi)存訪問的問題。本文將。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供東興網(wǎng)站建設(shè)、東興做網(wǎng)站、東興網(wǎng)站設(shè)計、東興網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、東興企業(yè)網(wǎng)站模板建站服務(wù),十年東興做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
一、linux mmap64的概念和原理
1.1 概念
mmap64是由32位機器到64位機器轉(zhuǎn)換時,操作系統(tǒng)為保持兼容,新增的一個系統(tǒng)調(diào)用。與mmap()函數(shù)相比,主要區(qū)別在于支持對大內(nèi)存的訪問。mmap()函數(shù)在32位機器上只能映射2GB左右大小的內(nèi)存,而mmap64則能夠在64位機器上支持對更大內(nèi)存的訪問。因此,它在處理大型文件時非常有用。
1.2 原理
mmap64調(diào)用原理跟mmap調(diào)用基本一樣,但其在創(chuàng)建映射時會將offset參數(shù)左移32位,以支持64位地址指針。
mmap64的調(diào)用格式為:
“`
void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset);
“`
其中,
– addr:映射區(qū)的開始地址
– length:映射區(qū)的長度
– prot:映射區(qū)域的保護(hù)方式
– flags:映射區(qū)域的類型和其他屬性
– fd:打開文件的文件描述符 fd。
– offset:被映射內(nèi)存的起始偏移量,單位為字節(jié)。
二、Linux mmap64的應(yīng)用
2.1 mmap64用于內(nèi)存映射文件
mmap64支持通過共享內(nèi)存與IPC通信,但更常見的應(yīng)用是內(nèi)存映射文件。mmap64可以將一個文件(或設(shè)備)映射到用戶空間的一段內(nèi)存中,所有對這片內(nèi)存的讀寫操作都將直接對文件進(jìn)行,而不需要使用read()/write()等系統(tǒng)調(diào)用。
2.2 mmap64用于大文件讀寫操作
mmap64還可以用于大文件的讀寫操作。相比一次讀取大文件到內(nèi)存中,使用mmap64將文件映射到內(nèi)存中,可以避免內(nèi)存不足的情況發(fā)生。同時,尤其適用于通過多進(jìn)程方式訪問同一個文件的情景。由于多進(jìn)程共享一個文件映射,不需要復(fù)制整個文件,而是共享同一個內(nèi)存區(qū)域,避免了復(fù)制的時間和性能開銷。這種方法在多進(jìn)程之間較為常見。
2.3 mmap64用于動態(tài)內(nèi)存管理
mmap64還可以用在動態(tài)內(nèi)存管理中。mmap64系統(tǒng)調(diào)用也可以用于確定內(nèi)存的起始地址。mmap64返回的地址使用后可以通過munmap移除,從而使做大過程變得更加靈活。此外,雖然mmap()無法動態(tài)地調(diào)整映射的長度,但通過使用mremap(),我們可以以原址為中心,調(diào)整區(qū)域大小。
三、Linux mmap64實際使用中需要注意的事項
3.1 地址保護(hù)權(quán)限
mmap64將文件映射到內(nèi)存中,需設(shè)置訪問該內(nèi)存的權(quán)限,如果內(nèi)存可寫,那么文件也可寫;如果是只讀的,文件只能讀取。
3.2 對文件的訪問方式
mmap64常常被用于大型磁盤文件的高效讀寫。然而,需要注意的是,使用mmap時,對于頻繁更改的文件,如日志文件、數(shù)據(jù)庫文件等,如果不適當(dāng)?shù)厥褂胢map,將會對磁盤空間產(chǎn)生很大的壓力。所以,對于頻繁修改文件的應(yīng)用,應(yīng)盡量避免使用mmap。
3.3 應(yīng)防止野指針
使用mmap64函數(shù)映射一個文件時,注意內(nèi)存塊是否要求清空,否則可能會引發(fā)安全性問題。這時需要注意讓系統(tǒng)保證這段內(nèi)存避免產(chǎn)生野指針。
四、Linux mmap64
可以出,Linux mmap64作為一項重要的內(nèi)存映射技術(shù),是在Linux系統(tǒng)下開發(fā)軟件的不可或缺的一項技能。mmap64可以用于內(nèi)存和磁盤之間進(jìn)行高效率的交換數(shù)據(jù);通過mmap64可以更好的集成磁盤訪問和內(nèi)存訪問;在操作大文件時提供了更好的支持等等。Linux mmap64不僅可以用于文件的內(nèi)存映射,還能夠通過設(shè)置內(nèi)存的保護(hù)以實現(xiàn)內(nèi)存管理,對多進(jìn)程共享內(nèi)存等使用都非常方便。合理地使用mmap64將顯著改善軟件的計算性能。在Linux平臺下,若能熟練地掌握mmap64的使用方法,并且結(jié)合各類應(yīng)用場景,將會使代碼的效率更加卓越。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
探討一下 Linux 共享內(nèi)存的 N 種方式
關(guān)于 Linux 共享內(nèi)存,寫得更好的應(yīng)該是宋寶華的 《世上更好的共享內(nèi)存》 一文。
本文可以說是對這篇文章的學(xué)習(xí)筆記,順手練習(xí)了一下 rust libc —— shichaoyuan/learn_rust/linux-shmipc-demo
按照宋寶華的總結(jié),當(dāng)前有四種主流的共享內(nèi)存方式:
前兩種方式比較符合傳統(tǒng)的用法,共享內(nèi)侍碧存做為進(jìn)程間通信的媒介。
第三種方式更像是通過傳遞內(nèi)存“句柄”進(jìn)行數(shù)據(jù)傳輸。
第四種方式是為設(shè)備間傳遞數(shù)據(jù)設(shè)計,避免內(nèi)存拷貝,直接傳遞內(nèi)存“句柄”。
這里嘗試了一下第二種和第三種方式。
這套 API 應(yīng)該是最檔缺普遍的 —— shm_open + mmap,本質(zhì)上來說 Aeron 也是用的這種方式(關(guān)于 Aeron 可以參考 我之前的文章 )。
看一下 glibc 中 shm_open 函數(shù)的實現(xiàn)就一清二楚了:
shm_open 函數(shù)就是在 /dev/shm 目錄下建文件,該目錄掛載為 tmpfs,至于 tmpfs 可以簡單理解為存儲介質(zhì)是內(nèi)存的一種文件系統(tǒng),更準(zhǔn)確的理解可以參考官方文檔 tmpfs.txt 。
然后通過 mmap 函數(shù)將 tmpfs 文件映射到用戶空間就可以隨意操作了。
優(yōu)點:
這種方式更大的優(yōu)勢在于共享的內(nèi)存是有“實體”(也就是 tmpfs 中的文件)的,所以多個進(jìn)程可以很容易通過文件名這個信息構(gòu)建共享內(nèi)存結(jié)構(gòu),特別適合把共享內(nèi)存做為通信媒介的場景(例如 Aeron )。
缺點:
如果非要找一個缺點的話,可能是,文件本身獨立于進(jìn)程的生命周期,在使用完畢后需要注意刪除文件(僅僅行談辯 close 是不行的),否則會一直占用內(nèi)存資源。
memfd_create 函數(shù)的作用是創(chuàng)建一個匿名的文件,返回對應(yīng)的 fd,這個文件當(dāng)然不普通,它存活在內(nèi)存中。更準(zhǔn)確的理解可以參考官方文檔 memfd_create(2) 。
直觀理解,memfd_create 與 shm_open 的作用是一樣的,都是創(chuàng)建共享內(nèi)存實體,只是 memfd_create 創(chuàng)建的實體是匿名的,這就帶了一個問題:如何讓其它進(jìn)程獲取到匿名的實體?shm_open 方式有具體的文件名,所以可以通過打開文件的方式獲取,那么對于匿名的文件怎么處理呢?
答案是:通過 Unix Domain Socket 傳遞 fd。
rust 的 UDS 實現(xiàn):
rust 在 std 中已經(jīng)提供了 UDS 的實現(xiàn),但是關(guān)于傳遞 fd 的 send_vectored_with_ancillary 函數(shù)還屬于 nightly-only experimental API 階段。所以這里使用了一個三方 crate —— sendfd ,坦白說可以自己實現(xiàn)一下,使用 libc 構(gòu)建好 SCM_RIGHTS 數(shù)據(jù),sendmsg 出去即可,不過細(xì)節(jié)還是挺多,我這里就放棄了。
這套 API 設(shè)計更靈活,直接拓展了我的思路,本來還是受限于 Aeron 的用法,如果在這套 API 的加持下,是否可以通過傳遞數(shù)據(jù)包內(nèi)存塊(fd)真正實現(xiàn)零拷貝呢?
優(yōu)點:
靈活。
缺點:
無
linux mmap64的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux mmap64,深入探究Linux mmap64的實現(xiàn)及應(yīng)用,探討一下 Linux 共享內(nèi)存的 N 種方式的信息別忘了在本站進(jìn)行查找喔。
香港云服務(wù)器機房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
標(biāo)題名稱:深入探究Linuxmmap64的實現(xiàn)及應(yīng)用(linuxmmap64)
網(wǎng)站地址:http://m.fisionsoft.com.cn/article/djcjgos.html


咨詢
建站咨詢
