linuxmmap命令的簡單介紹

Linux將設(shè)備地址映射到用戶空間內(nèi)存映射與VMA?

1、VM_IO標(biāo)志內(nèi)存區(qū)域中包含對設(shè)備I/O空間的映射。該標(biāo)志通常在設(shè)備驅(qū)動程序執(zhí)行 mmap()函數(shù)進(jìn)行I/O空間映射時才被設(shè)置,同時該標(biāo)志也表示該內(nèi)存區(qū)域不能被包含在任何進(jìn)程的存放轉(zhuǎn)存(core dump)中。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)科爾沁右翼前免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

2、VMA可以使用多種方式來實(shí)現(xiàn),其中最常見的是使用鏈表來組織。在Linux內(nèi)核中,每個進(jìn)程都有自己的VMA鏈表,用于存儲它的地址空間中所有的VMA。進(jìn)程在對這段地址空間進(jìn)行訪問時,內(nèi)核會遍歷這些鏈表,找到響應(yīng)的VMA映射物理內(nèi)存。

3、每一個進(jìn)程都有一個列表vm_area_struct,指向虛擬地址空間的不同的內(nèi)存塊,這個變量的名字叫mmap。其實(shí)內(nèi)存映射不僅僅是物理內(nèi)存和虛擬內(nèi)存之間的映射,還包括將文件中的內(nèi)容映射到虛擬內(nèi)存空間。

4、start指定文件被映射到用戶空間的起始地址,一般設(shè)為NULL,由內(nèi)核指定改地址;函數(shù)返回值為映射到用戶空間的地址。

5、通常32位Linux內(nèi)核地址空間劃分0~3G為用戶空間,3~4G為內(nèi)核空間。

MMAP和零拷貝

1、用了 MMAP 打通用戶空間和內(nèi)核空間,并將一部分內(nèi)存映射到磁盤上的一段空間。流程:data 從網(wǎng)卡過來,進(jìn)入內(nèi)核,再讀入到用戶空間的服務(wù),服務(wù)處理后扔到 MMAP 中,內(nèi)核將數(shù)據(jù)再拷貝到磁盤中。

2、A: Linux提供了mmap零拷貝來實(shí)現(xiàn)我們的需求。 mmap(內(nèi)存映射)是一個比sendfile昂貴但優(yōu)于傳統(tǒng)I/O的方法。 ① 發(fā)出mmap系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(第一次上下文切換)。

3、一般情況下,用戶空間是不能夠直接訪問設(shè)備的。mmap可實(shí)現(xiàn)這個功能。mmap通過將設(shè)備內(nèi)存映射到用戶空間的一段內(nèi)存上,這樣,當(dāng)用戶訪問用戶空間的這段地址范圍時,實(shí)際是訪問設(shè)備內(nèi)存。

4、零拷貝在Netty中的三種實(shí)現(xiàn)。 使用堆外內(nèi)存,也叫直接內(nèi)存(Direct Memory)。netty的接收和發(fā)生都是使用Direct buffer,對應(yīng)系統(tǒng)底層的mmap機(jī)制,直接使用堆外內(nèi)存進(jìn)行Socket讀寫,不需要進(jìn)行字節(jié)緩沖區(qū)的二次拷貝。

5、應(yīng)用: kafka生產(chǎn)者發(fā)送消息到broker的時候,broker的網(wǎng)絡(luò)接收到數(shù)據(jù)后,copy到broker的內(nèi)核空間。然后通過mmap技術(shù),broker會修改消息頭,添加一些元數(shù)據(jù)。所以,寫入數(shù)據(jù)很快。

6、read流程:小結(jié):通過上面兩種普通模式數(shù)據(jù)交互的方式發(fā)現(xiàn),如果我們執(zhí)行read和write操作,會經(jīng)歷四次數(shù)據(jù)拷貝和四次空間切換。

mmap和sendfile

1、相比mmap來說,sendfile同樣減少了一次CPU拷貝,而且還減少了2次上下文切換。

2、零拷貝技術(shù) 是另一個系統(tǒng)調(diào)用,Linux 中如 sendfile 命令。它減少了內(nèi)存中用戶空間與內(nèi)核空間數(shù)據(jù)的拷貝過程,使得 CPU 處理效率更高。Kafka 是一個分布式發(fā)布訂閱消息系統(tǒng)( 詳細(xì)學(xué)習(xí)參考 ),它巧妙用到了這兩種技術(shù)。

3、mmap將磁盤文件映射到內(nèi)存,支持讀和寫,對內(nèi)存的操作會反映在磁盤文件上。 RocketMQ 在消費(fèi)消息時,使用了 mmap。kafka 使用了 sendFile。

4、mmap(內(nèi)存映射)是一個比sendfile昂貴但優(yōu)于傳統(tǒng)I/O的方法。 ① 發(fā)出mmap系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(第一次上下文切換)。

5、sendfile() 在一個文件描述符和另一個文件描述符之間復(fù)制數(shù)據(jù)。 因?yàn)檫@種復(fù)制是在 內(nèi)核中完成 的,所以 sendfile() 比 read(2) 和 write(2) 的組合更有效,后者需要將數(shù)據(jù)傳入和傳出用戶空間。

linux中使用了什么內(nèi)存管理方法,為什么

1、Linux保留內(nèi)核空間最頂部FIXADDR_TOP~4GB的區(qū)域作為保留區(qū)。當(dāng)系統(tǒng)物理內(nèi)存超過4GB時,必須使用CPU的擴(kuò)展分頁(PAE)模式所提供的64位頁目錄項(xiàng)才能存取到4GB以上的物理內(nèi)存,這需要CPU的支持。

2、Linux采用了一種虛擬內(nèi)存管理機(jī)制,使得每個應(yīng)用程序可以訪問和使用操作系統(tǒng)所提供的整個虛擬地址空間。這使得每個應(yīng)用程序似乎擁有整個系統(tǒng)的內(nèi)存,而不受物理內(nèi)存大小的限制。

3、Linux虛擬內(nèi)存的實(shí)現(xiàn)需要六種機(jī)制的支持:地址映射機(jī)制、內(nèi)存分配回收機(jī)制、緩存和刷新機(jī)制、請求頁機(jī)制、交換機(jī)制、內(nèi)存共享機(jī)制。

4、Linux的內(nèi)存管理采取的是分頁存取機(jī)制,為了保證物理內(nèi)存能得到充分的利用,內(nèi)核會在適當(dāng)?shù)臅r候?qū)⑽锢韮?nèi)存中不經(jīng)常使用的數(shù)據(jù)塊自動交換到虛擬內(nèi)存中,而將經(jīng)常使用的信息保留到物理內(nèi)存。

5、這種方式中,將用戶程序的地址空間,注意,是 用戶程序的地址空間 分為若干個固定大小的區(qū)域,成為“頁”或“頁面”。我們可以知道,這也頁其實(shí)是不存在的,只是一種劃分內(nèi)存空間的方法。

本文標(biāo)題:linuxmmap命令的簡單介紹
鏈接分享:http://bm7419.com/article49/dggcshh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、App開發(fā)、營銷型網(wǎng)站建設(shè)服務(wù)器托管、全網(wǎng)營銷推廣、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)