最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一篇帶你徹底了解,零拷貝Zero-Copy技術(shù)(圖解)

2022-05-02 12:41 作者:補給站Linux內(nèi)核  | 我要投稿




1、數(shù)據(jù)拷貝基礎(chǔ)過程

  • 在Linux系統(tǒng)內(nèi)部緩存和內(nèi)存容量都是有限的,更多的數(shù)據(jù)都是存儲在磁盤中。對于Web服務(wù)器來說,經(jīng)常需要從磁盤中讀取數(shù)據(jù)到內(nèi)存,然后再通過網(wǎng)卡傳輸給用戶:



1.1 僅CPU方式

  1. 當(dāng)應(yīng)用程序需要讀取磁盤數(shù)據(jù)時,調(diào)用read()從用戶態(tài)陷入內(nèi)核態(tài),read()這個系統(tǒng)調(diào)用最終由CPU來完成;

  2. CPU向磁盤發(fā)起I/O請求,磁盤收到之后開始準(zhǔn)備數(shù)據(jù);

  3. 磁盤將數(shù)據(jù)放到磁盤緩沖區(qū)之后,向CPU發(fā)起I/O中斷,報告CPU數(shù)據(jù)已經(jīng)Ready了;

  4. CPU收到磁盤控制器的I/O中斷之后,開始拷貝數(shù)據(jù),完成之后read()返回,再從內(nèi)核態(tài)切換到用戶態(tài);


1.2 CPU&DMA方式

  • CPU的時間寶貴,讓它做雜活就是浪費資源。

  • 直接內(nèi)存訪問(Direct Memory Access),是一種硬件設(shè)備繞開CPU獨立直接訪問內(nèi)存的機制。所以DMA在一定程度上解放了CPU,把之前CPU的雜活讓硬件直接自己做了,提高了CPU效率。 目前支持DMA的硬件包括:網(wǎng)卡、聲卡、顯卡、磁盤控制器等。


  • 有了DMA的參與之后的流程發(fā)生了一些變化:


  • 最主要的變化是,CPU不再和磁盤直接交互,而是DMA和磁盤交互并且將數(shù)據(jù)從磁盤緩沖區(qū)拷貝到內(nèi)核緩沖區(qū),之后的過程類似。

  • 無論從僅CPU方式和DMA&CPU方式,都存在多次冗余數(shù)據(jù)拷貝和內(nèi)核態(tài)&用戶態(tài)的切換。 繼續(xù)思考Web服務(wù)器讀取本地磁盤文件數(shù)據(jù)再通過網(wǎng)絡(luò)傳輸給用戶的詳細過程。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。∏?00名進群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)?

?

2、普通模式數(shù)據(jù)交互

  • 一次完成的數(shù)據(jù)交互包括幾個部分:系統(tǒng)調(diào)用syscall、CPU、DMA、網(wǎng)卡、磁盤等。


  • 系統(tǒng)調(diào)用syscall是應(yīng)用程序和內(nèi)核交互的橋梁,每次進行調(diào)用/返回就會產(chǎn)生兩次切換:

  1. 調(diào)用syscall 從用戶態(tài)切換到內(nèi)核態(tài)

  2. syscall返回 從內(nèi)核態(tài)切換到用戶態(tài)



  • 來看下完整的數(shù)據(jù)拷貝過程簡圖:


  • 讀數(shù)據(jù)過程:

  1. 應(yīng)用程序要讀取磁盤數(shù)據(jù),調(diào)用read()函數(shù)從而實現(xiàn)用戶態(tài)切換內(nèi)核態(tài),這是第1次狀態(tài)切換;

  2. DMA控制器將數(shù)據(jù)從磁盤拷貝到內(nèi)核緩沖區(qū),這是第1次DMA拷貝;

  3. CPU將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū),這是第1次CPU拷貝;

  4. CPU完成拷貝之后,read()函數(shù)返回實現(xiàn)用戶態(tài)切換用戶態(tài),這是第2次狀態(tài)切換;

  • 寫數(shù)據(jù)過程:

  1. 應(yīng)用程序要向網(wǎng)卡寫數(shù)據(jù),調(diào)用write()函數(shù)實現(xiàn)用戶態(tài)切換內(nèi)核態(tài),這是第1次切換;

  2. CPU將用戶緩沖區(qū)數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū),這是第1次CPU拷貝;

  3. DMA控制器將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到socket緩沖區(qū),這是第1次DMA拷貝;

  4. 完成拷貝之后,write()函數(shù)返回實現(xiàn)內(nèi)核態(tài)切換用戶態(tài),這是第2次切換;

  • 綜上所述:

  1. 讀過程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;

  2. 寫過程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;

  • 可見傳統(tǒng)模式下,涉及多次空間切換和數(shù)據(jù)冗余拷貝,效率并不高,接下來就該零拷貝技術(shù)出場了。

3、零拷貝技術(shù)

3.1 出現(xiàn)原因

  • 可以看到,如果應(yīng)用程序不對數(shù)據(jù)做修改,從內(nèi)核緩沖區(qū)到用戶緩沖區(qū),再從用戶緩沖區(qū)到內(nèi)核緩沖區(qū)。兩次數(shù)據(jù)拷貝都需要CPU的參與,并且涉及用戶態(tài)與內(nèi)核態(tài)的多次切換,加重了CPU負擔(dān)。 需要降低冗余數(shù)據(jù)拷貝、解放CPU,這也就是零拷貝Zero-Copy技術(shù)。

3.2 解決思路

  • 目前來看,零拷貝技術(shù)的幾個實現(xiàn)手段包括:mmap+write、sendfile、sendfile+DMA收集、splice等。



3.2.1 mmap方式

  • mmap是Linux提供的一種內(nèi)存映射文件的機制,它實現(xiàn)了將內(nèi)核中讀緩沖區(qū)地址與用戶空間緩沖區(qū)地址進行映射,從而實現(xiàn)內(nèi)核緩沖區(qū)與用戶緩沖區(qū)的共享。

  • 這樣就減少了一次用戶態(tài)和內(nèi)核態(tài)的CPU拷貝,但是在內(nèi)核空間內(nèi)仍然有一次CPU拷貝。



  • mmap對大文件傳輸有一定優(yōu)勢,但是小文件可能出現(xiàn)碎片,并且在多個進程同時操作文件時可能產(chǎn)生引發(fā)coredump的signal。

3.2.2 sendfile方式

  • mmap+write方式有一定改進,但是由系統(tǒng)調(diào)用引起的狀態(tài)切換并沒有減少。

  • sendfile系統(tǒng)調(diào)用是在 Linux 內(nèi)核2.1版本中被引入,它建立了兩個文件之間的傳輸通道。

  • sendfile方式只使用一個函數(shù)就可以完成之前的read+write 和 mmap+write的功能,這樣就少了2次狀態(tài)切換,由于數(shù)據(jù)不經(jīng)過用戶緩沖區(qū),因此該數(shù)據(jù)無法被修改。



  • 從圖中可以看到,應(yīng)用程序只需要調(diào)用sendfile函數(shù)即可完成,只有2次狀態(tài)切換、1次CPU拷貝、2次DMA拷貝。

  • 但是sendfile在內(nèi)核緩沖區(qū)和socket緩沖區(qū)仍然存在一次CPU拷貝,或許這個還可以優(yōu)化。

3.2.3 sendfile+DMA收集

  • Linux 2.4 內(nèi)核對 sendfile 系統(tǒng)調(diào)用進行優(yōu)化,但是需要硬件DMA控制器的配合。 升級后的sendfile將內(nèi)核空間緩沖區(qū)中對應(yīng)的數(shù)據(jù)描述信息(文件描述符、地址偏移量等信息)記錄到socket緩沖區(qū)中。

  • DMA控制器根據(jù)socket緩沖區(qū)中的地址和偏移量將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到網(wǎng)卡中,從而省去了內(nèi)核空間中僅剩1次CPU拷貝。



  • 這種方式有2次狀態(tài)切換、0次CPU拷貝、2次DMA拷貝,但是仍然無法對數(shù)據(jù)進行修改,并且需要硬件層面DMA的支持,并且sendfile只能將文件數(shù)據(jù)拷貝到socket描述符上,有一定的局限性。

3.2.4 splice方式

  • splice系統(tǒng)調(diào)用是Linux 在 2.6 版本引入的,其不需要硬件支持,并且不再限定于socket上,實現(xiàn)兩個普通文件之間的數(shù)據(jù)零拷貝。



  • splice 系統(tǒng)調(diào)用可以在內(nèi)核緩沖區(qū)和socket緩沖區(qū)之間建立管道來傳輸數(shù)據(jù),避免了兩者之間的 CPU 拷貝操作。


  • splice也有一些局限,它的兩個文件描述符參數(shù)中有一個必須是管道設(shè)備。


一篇帶你徹底了解,零拷貝Zero-Copy技術(shù)(圖解)的評論 (共 條)

分享到微博請遵守國家法律
昭通市| 舒城县| 贵州省| 贵港市| 海安县| 武穴市| 临泽县| 农安县| 阳信县| 卢氏县| 宿松县| 葫芦岛市| 溧水县| 平度市| 耒阳市| 南江县| 米易县| 修水县| 徐水县| 刚察县| 那曲县| 襄城县| 将乐县| 长治市| 尼玛县| 温州市| 甘谷县| 镇平县| 睢宁县| 桃园县| 汉川市| 兴和县| 高州市| 唐海县| 嘉祥县| 马公市| 蕉岭县| 察隅县| 阜新市| 万年县| 泸州市|