阿里二面:什么是mmap?

勵(lì)志當(dāng)最強(qiáng)課代表的我來給大家總結(jié)總結(jié)??????
什么是mmap?
視頻內(nèi)容:
1??零拷貝??
2??DNA 拷貝??
3??mmap ???
4??set file 替代 read 加 write??
視頻內(nèi)容:
1??零拷貝??
首先需要對傳統(tǒng)的 lo 方式有一個(gè)概念,基于傳統(tǒng)的 lo 方式底層實(shí)際上是通過調(diào)用 read 和 write 的函數(shù)來實(shí)現(xiàn),通過 read 把數(shù)據(jù)從硬盤讀取到內(nèi)核緩沖區(qū),再復(fù)制到用戶緩沖區(qū),然后再通過 right 寫入到 socket 緩存區(qū),最后寫入網(wǎng)卡設(shè)備。
用戶態(tài)和內(nèi)核態(tài)的上下文切換和4次拷貝。
首先第一步,用戶進(jìn)程通過 rate 方法向操作系統(tǒng)發(fā)起調(diào)用,只是上下文從用戶態(tài)轉(zhuǎn)向內(nèi)核態(tài)。
第二步, DMI 控制器把數(shù)據(jù)從硬盤中拷貝到讀緩沖區(qū)。
第三步, CPU 把讀緩沖區(qū)數(shù)據(jù)拷貝到應(yīng)用緩沖區(qū),上下文從內(nèi)核態(tài)轉(zhuǎn)為用戶態(tài), RAID 返回。
第四步,用戶進(jìn)程通過 RAID 方法發(fā)起調(diào)用,上下文從用戶態(tài)切換為內(nèi)核態(tài)。
第五步, CPU 將應(yīng)用緩沖區(qū)中的數(shù)據(jù)拷貝到 socket 緩沖區(qū)。
第六步, DMA 控制器把數(shù)據(jù)從 socket 緩沖區(qū)拷貝到網(wǎng)卡,上下文從內(nèi)核態(tài)切換回用戶態(tài), write 返回。

2??DNA 拷貝??
本質(zhì)上來說它就是一塊主板上獨(dú)立的芯片,通過它來進(jìn)行內(nèi)存和 IO 設(shè)備的數(shù)據(jù)傳輸,從而減少了 CPU 的等待時(shí)間

3??mmap ???
mmap 主要實(shí)現(xiàn)方式是將讀緩沖區(qū)中的地址和用戶緩沖區(qū)中的地址進(jìn)行映射,內(nèi)核緩沖區(qū)和應(yīng)用緩沖區(qū)共享,從而減少了從讀緩沖區(qū)到用戶緩沖區(qū)的一次 CPU 拷貝。
第一步,用戶進(jìn)程通過 mmap 方法向操作系統(tǒng)發(fā)起調(diào)用上下文,從用戶態(tài)轉(zhuǎn)向內(nèi)核態(tài)。
第二步, DMI 控制器把數(shù)據(jù)從硬盤中拷貝到讀緩中區(qū)。
第三步,上下文從內(nèi)核態(tài)轉(zhuǎn)為用戶態(tài), MF 調(diào)用返回。
第四步,用戶進(jìn)程通過 write 方法發(fā)起調(diào)用上下文,從用戶態(tài)轉(zhuǎn)為內(nèi)核態(tài)。
第五步, debug 將讀緩沖區(qū)中的數(shù)據(jù)拷貝到 socket 緩沖區(qū)。
第六步, DMI 控制器把數(shù)據(jù)從 socket 緩沖區(qū)拷貝到網(wǎng)卡上下文,從內(nèi)核態(tài)切換回用戶態(tài), write 返回。

4?? set file 替代 read 加 write??
由于 set file 替代 read 加 write 從而節(jié)省了一次系統(tǒng)調(diào)用,也就是兩次上下文的切換。
第一步,用戶進(jìn)程通過現(xiàn)在發(fā)現(xiàn)方法向操作系統(tǒng)發(fā)起調(diào)用,上下文從用戶態(tài)轉(zhuǎn)向內(nèi)核態(tài)。
第二步, DMA 控制器把數(shù)據(jù)從硬盤中拷貝到讀緩沖區(qū)。
第三步, CPU 將讀緩沖區(qū)的數(shù)據(jù)拷貝到 socket 緩沖區(qū)。
第四步, DMI 控制器把數(shù)據(jù)從 socket 緩存區(qū)拷貝到網(wǎng)卡,上下文從內(nèi)核態(tài)切換回用戶態(tài) send file 調(diào)用返回 send file 方法 IO 數(shù)據(jù)對用戶空間
