數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

本篇內(nèi)容主要講解“數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么”吧!

堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都陽(yáng)臺(tái)護(hù)欄小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設(shè)營(yíng)銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開(kāi)發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

數(shù)據(jù)拷貝基礎(chǔ)過(guò)程

在 Linux 系統(tǒng)內(nèi)部緩存和內(nèi)存容量都是有限的,更多的數(shù)據(jù)都是存儲(chǔ)在磁盤中。

對(duì)于 Web 服務(wù)器來(lái)說(shuō),經(jīng)常需要從磁盤中讀取數(shù)據(jù)到內(nèi)存,然后再通過(guò)網(wǎng)卡傳輸給用戶:

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

上述數(shù)據(jù)流轉(zhuǎn)只是大框,接下來(lái)看看幾種模式:

①僅 CPU 方式

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

如上圖:

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

  • CPU 向磁盤發(fā)起 I/O 請(qǐng)求,磁盤收到之后開(kāi)始準(zhǔn)備數(shù)據(jù)。

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

  • CPU 收到磁盤控制器的 I/O 中斷之后,開(kāi)始拷貝數(shù)據(jù),完成之后 read() 返回,再?gòu)膬?nèi)核態(tài)切換到用戶態(tài)。

②CPU&DMA 方式

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

CPU 的時(shí)間寶貴,讓它做雜活就是浪費(fèi)資源。

直接內(nèi)存訪問(wèn)(Direct Memory Access),是一種硬件設(shè)備繞開(kāi) CPU 獨(dú)立直接訪問(wèn)內(nèi)存的機(jī)制。

所以 DMA 在一定程度上解放了 CPU,把之前 CPU 的雜活讓硬件直接自己做了,提高了 CPU 效率。

目前支持 DMA 的硬件包括:網(wǎng)卡、聲卡、顯卡、磁盤控制器等。

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

敲黑板:無(wú)論從僅 CPU 方式和 DMA&CPU 方式,都存在多次冗余數(shù)據(jù)拷貝和內(nèi)核態(tài)&用戶態(tài)的切換。

我們繼續(xù)思考 Web 服務(wù)器讀取本地磁盤文件數(shù)據(jù)再通過(guò)網(wǎng)絡(luò)傳輸給用戶的詳細(xì)過(guò)程。

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

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

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

  • syscall 返回,從內(nèi)核態(tài)切換到用戶態(tài)。

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

來(lái)看下完整的數(shù)據(jù)拷貝過(guò)程簡(jiǎn)圖:

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

讀數(shù)據(jù)過(guò)程:

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

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

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

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

寫(xiě)數(shù)據(jù)過(guò)程:

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

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

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

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

綜上所述:

  • 讀過(guò)程涉及 2 次空間切換、1 次 DMA 拷貝、1 次 CPU 拷貝。

  • 寫(xiě)過(guò)程涉及 2 次空間切換、1 次 DMA 拷貝、1 次 CPU 拷貝。

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

零拷貝技術(shù)

出現(xiàn)原因

我們可以看到,如果應(yīng)用程序不對(duì)數(shù)據(jù)做修改,從內(nèi)核緩沖區(qū)到用戶緩沖區(qū),再?gòu)挠脩艟彌_區(qū)到內(nèi)核緩沖區(qū)。

兩次數(shù)據(jù)拷貝都需要 CPU 的參與,并且涉及用戶態(tài)與內(nèi)核態(tài)的多次切換,加重了 CPU 負(fù)擔(dān)。

我們需要降低冗余數(shù)據(jù)拷貝、解放 CPU,這也就是零拷貝 Zero-Copy 技術(shù)。

解決思路

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

①mmap 方式

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

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

②sendfile 方式

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

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

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

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

③sendfile+DMA 收集

Linux 2.4 內(nèi)核對(duì) sendfile 系統(tǒng)調(diào)用進(jìn)行優(yōu)化,但是需要硬件 DMA 控制器的配合。

升級(jí)后的 sendfile 將內(nèi)核空間緩沖區(qū)中對(duì)應(yīng)的數(shù)據(jù)描述信息(文件描述符、地址偏移量等信息)記錄到 socket 緩沖區(qū)中。

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

④splice 方式

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么

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

到此,相信大家對(duì)“數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章名稱:數(shù)據(jù)拷貝的基礎(chǔ)過(guò)程是什么
網(wǎng)站URL:http://muchs.cn/article14/ighhge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、企業(yè)建站、網(wǎng)站排名

廣告

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

營(yíng)銷型網(wǎng)站建設(shè)