亚洲国产第一_开心网五月色综合亚洲_日本一级特黄特色大片免费观看_久久久久久久久久免观看

Hello! 歡迎來到小浪云!


【Linux內(nèi)核】零拷貝技術(shù)


avatar
小浪云 2025-04-17 24

零拷貝技術(shù)是指在計(jì)算機(jī)操作中,cpu不需要將數(shù)據(jù)從一個(gè)存儲區(qū)域復(fù)制到另一個(gè)存儲區(qū)域,從而減少上下文切換和cpu的拷貝時(shí)間。其主要作用是在數(shù)據(jù)傳輸過程中減少拷貝次數(shù)和系統(tǒng)調(diào)用,實(shí)現(xiàn)cpu的零參與,徹底消除cpu在這方面的負(fù)載。零拷貝技術(shù)主要依賴于dma數(shù)據(jù)傳輸技術(shù)和內(nèi)存區(qū)域映射技術(shù)。

零拷貝技術(shù)可以減少數(shù)據(jù)在內(nèi)核緩沖區(qū)和用戶緩沖區(qū)之間的反復(fù)I/O拷貝操作,以及用戶進(jìn)程地址空間和內(nèi)核地址空間之間因上下文切換帶來的CPU開銷。Linux中提供了輪詢、IO中斷和DMA傳輸三種磁盤與主存之間的數(shù)據(jù)傳輸機(jī)制。

傳統(tǒng)的IO讀寫方式包括兩次CPU拷貝和兩次DMA拷貝,經(jīng)過了四次上下文切換。

【Linux內(nèi)核】零拷貝技術(shù)

在DMA出現(xiàn)之前,IO操作通過CPU中斷完成,每次讀取磁盤數(shù)據(jù)時(shí)都需要CPU中斷并等待數(shù)據(jù)讀取和拷貝完成,導(dǎo)致CPU的上下文切換。

【Linux內(nèi)核】零拷貝技術(shù)

DMA(直接內(nèi)存訪問)是一種允許外設(shè)直接訪問系統(tǒng)主存的機(jī)制,數(shù)據(jù)傳輸可以繞開CPU調(diào)度,大多數(shù)硬件設(shè)備都支持DMA技術(shù)。

【Linux內(nèi)核】零拷貝技術(shù)

整個(gè)DMA數(shù)據(jù)傳輸操作在DMA控制器的控制下進(jìn)行,CPU僅在傳輸開始和結(jié)束時(shí)做中斷處理,傳輸過程中CPU可以繼續(xù)其他工作,提高系統(tǒng)效率。

【Linux內(nèi)核】零拷貝技術(shù)

零拷貝在Linux中的實(shí)現(xiàn)主要有三種思路:

  1. 用戶態(tài)直接IO:應(yīng)用程序直接訪問硬件存儲,數(shù)據(jù)直接從硬件傳輸?shù)接脩艨臻g,減少數(shù)據(jù)拷貝次數(shù)。

【Linux內(nèi)核】零拷貝技術(shù)

  1. mmap + write:使用mmap將內(nèi)核讀緩沖區(qū)與用戶緩沖區(qū)映射,減少了一次CPU拷貝操作。
tmp_buf = mmap(file_fd, len); write(socket_fd, tmp_buf, len);

【Linux內(nèi)核】零拷貝技術(shù)

  1. sendfile:sendfile系統(tǒng)調(diào)用在Linux內(nèi)核2.1中引入,簡化了網(wǎng)絡(luò)數(shù)據(jù)傳輸過程,減少了CPU拷貝和用戶與內(nèi)核態(tài)轉(zhuǎn)換次數(shù)。
sendfile(socket_fd, file_fd, len);

【Linux內(nèi)核】零拷貝技術(shù)【Linux內(nèi)核】零拷貝技術(shù)

sendfile在Linux2.4版本中引入DMA gather操作,進(jìn)一步減少了CPU拷貝操作。

sendfile(socket_fd, file_fd, len);

【Linux內(nèi)核】零拷貝技術(shù)【Linux內(nèi)核】零拷貝技術(shù)

  1. splice:在Linux2.6.17版本引入的splice系統(tǒng)調(diào)用,可以在兩個(gè)文件描述符之間實(shí)現(xiàn)零拷貝,不需要硬件支持。
splice(fd_in, off_in, fd_out, off_out, len, flags);

【Linux內(nèi)核】零拷貝技術(shù)【Linux內(nèi)核】零拷貝技術(shù)

  1. 寫時(shí)拷貝:當(dāng)多個(gè)進(jìn)程共享數(shù)據(jù)時(shí),只有在需要修改數(shù)據(jù)時(shí)才進(jìn)行拷貝操作。

【Linux內(nèi)核】零拷貝技術(shù)【Linux內(nèi)核】零拷貝技術(shù)【Linux內(nèi)核】零拷貝技術(shù)

無論是傳統(tǒng)IO還是零拷貝方式,兩次DMA拷貝是必需的。以下是幾種IO拷貝方式的對比:

【Linux內(nèi)核】零拷貝技術(shù)

在應(yīng)用案例中,rocketmq使用mmap + write方式,適用于小塊文件的數(shù)據(jù)持久化和傳輸;kafka使用sendfile方式,適用于大塊文件的高吞吐量數(shù)據(jù)傳輸,但其索引文件使用mmap + write方式。

【Linux內(nèi)核】零拷貝技術(shù)

相關(guān)閱讀