成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

唬人的“零拷貝”技術,也就那么回事

開發 前端 開發工具
我深知不懂底層技術點就如同空中樓閣,再這樣下去面阿里 P10 是沒希望了。想到這里,我開始慌了,所以今天和大家一起學習個底層技術點:零拷貝 Zero-Copy。

我深知不懂底層技術點就如同空中樓閣,再這樣下去面阿里 P10 是沒希望了。想到這里,我開始慌了,所以今天和大家一起學習個底層技術點:零拷貝 Zero-Copy。

[[354394]]
圖片來自 Pexels 

Linux 系統中一切皆文件,仔細想一下 Linux 系統的很多活動無外乎讀操作和寫操作,零拷貝就是為了提高讀寫性能而出現的。

[[354395]]

廢話不多說,馬上開大車,走起!

 

數據拷貝基礎過程

在 Linux 系統內部緩存和內存容量都是有限的,更多的數據都是存儲在磁盤中。

對于 Web 服務器來說,經常需要從磁盤中讀取數據到內存,然后再通過網卡傳輸給用戶:

 

上述數據流轉只是大框,接下來看看幾種模式:

①僅 CPU 方式

 

如上圖:

  • 當應用程序需要讀取磁盤數據時,調用 read() 從用戶態陷入內核態,read() 這個系統調用最終由 CPU 來完成。
  • CPU 向磁盤發起 I/O 請求,磁盤收到之后開始準備數據。
  • 磁盤將數據放到磁盤緩沖區之后,向 CPU 發起 I/O 中斷,報告 CPU 數據已經 Ready 了。
  • CPU 收到磁盤控制器的 I/O 中斷之后,開始拷貝數據,完成之后 read() 返回,再從內核態切換到用戶態。

②CPU&DMA 方式

 

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

直接內存訪問(Direct Memory Access),是一種硬件設備繞開 CPU 獨立直接訪問內存的機制。

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

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

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

 

最主要的變化是,CPU 不再和磁盤直接交互,而是 DMA 和磁盤交互并且將數據從磁盤緩沖區拷貝到內核緩沖區,之后的過程類似。

敲黑板:無論從僅 CPU 方式和 DMA&CPU 方式,都存在多次冗余數據拷貝和內核態&用戶態的切換。

我們繼續思考 Web 服務器讀取本地磁盤文件數據再通過網絡傳輸給用戶的詳細過程。

普通模式數據交互

一次完成的數據交互包括幾個部分:系統調用 syscall、CPU、DMA、網卡、磁盤等。

 

系統調用 syscall 是應用程序和內核交互的橋梁,每次進行調用/返回就會產生兩次切換:

  • 調用 syscall,從用戶態切換到內核態。
  • syscall 返回,從內核態切換到用戶態。

 

來看下完整的數據拷貝過程簡圖:

 

讀數據過程:

  • 應用程序要讀取磁盤數據,調用 read() 函數從而實現用戶態切換內核態,這是第 1 次狀態切換。
  • DMA 控制器將數據從磁盤拷貝到內核緩沖區,這是第 1 次 DMA 拷貝。
  • CPU 將數據從內核緩沖區復制到用戶緩沖區,這是第 1 次 CPU 拷貝。
  • CPU 完成拷貝之后,read() 函數返回實現用戶態切換用戶態,這是第 2 次狀態切換。

寫數據過程:

  • 應用程序要向網卡寫數據,調用 write() 函數實現用戶態切換內核態,這是第 1 次切換。
  • CPU 將用戶緩沖區數據拷貝到內核緩沖區,這是第 1 次 CPU 拷貝。
  • DMA 控制器將數據從內核緩沖區復制到 socket 緩沖區,這是第 1 次 DMA 拷貝。
  • 完成拷貝之后,write() 函數返回實現內核態切換用戶態,這是第 2 次切換。

綜上所述:

  • 讀過程涉及 2 次空間切換、1 次 DMA 拷貝、1 次 CPU 拷貝。
  • 寫過程涉及 2 次空間切換、1 次 DMA 拷貝、1 次 CPU 拷貝。

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

零拷貝技術

出現原因

我們可以看到,如果應用程序不對數據做修改,從內核緩沖區到用戶緩沖區,再從用戶緩沖區到內核緩沖區。

兩次數據拷貝都需要 CPU 的參與,并且涉及用戶態與內核態的多次切換,加重了 CPU 負擔。

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

解決思路

目前來看,零拷貝技術的幾個實現手段包括:mmap+write、sendfile、sendfile+DMA 收集、splice 等。

 

①mmap 方式

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

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

 

mmap 對大文件傳輸有一定優勢,但是小文件可能出現碎片,并且在多個進程同時操作文件時可能產生引發 coredump 的 signal。

②sendfile 方式

mmap+write 方式有一定改進,但是由系統調用引起的狀態切換并沒有減少。

sendfile 系統調用是在 Linux 內核 2.1 版本中被引入,它建立了兩個文件之間的傳輸通道。

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

 

從圖中可以看到,應用程序只需要調用 sendfile 函數即可完成,只有 2 次狀態切換、1 次 CPU 拷貝、2 次 DMA 拷貝。

但是 sendfile 在內核緩沖區和 socket 緩沖區仍然存在一次 CPU 拷貝,或許這個還可以優化。

③sendfile+DMA 收集

Linux 2.4 內核對 sendfile 系統調用進行優化,但是需要硬件 DMA 控制器的配合。

升級后的 sendfile 將內核空間緩沖區中對應的數據描述信息(文件描述符、地址偏移量等信息)記錄到 socket 緩沖區中。

DMA 控制器根據 socket 緩沖區中的地址和偏移量將數據從內核緩沖區拷貝到網卡中,從而省去了內核空間中僅剩 1 次 CPU 拷貝。

 

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

④splice 方式

splice 系統調用是 Linux 在 2.6 版本引入的,其不需要硬件支持,并且不再限定于 socket 上,實現兩個普通文件之間的數據零拷貝。

 

splice 系統調用可以在內核緩沖區和 socket 緩沖區之間建立管道來傳輸數據,避免了兩者之間的 CPU 拷貝操作。

 

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

小結

本文通過介紹數據交互的基本過程、傳統模式的缺點,進而介紹了零拷貝的一些實現方法。

零拷貝技術是非常底層且重要的讀寫優化,對于服務并發能力的提升有很大幫助,就這么多吧,下期再見!

作者:后端技術指南針

編輯:陶家龍

出處:轉載自公眾號后端技術指南針

 

責任編輯:武曉燕 來源: 后端技術指南針
相關推薦

2022-08-22 09:03:09

SpringbootRedis數據

2022-05-05 13:57:43

Buffer設備MYSQL

2020-07-06 15:10:05

Linux拷貝代碼

2020-07-23 15:40:54

Linux零拷貝文件

2020-11-16 18:45:52

騰訊月薪工資

2022-10-21 08:17:13

MongoDB查詢Document

2020-03-04 08:47:10

Kafka架構原理

2021-08-26 06:57:53

零拷貝技術磁盤

2022-09-27 13:34:49

splice零拷貝原理

2024-06-07 08:10:14

Netty操作系統零拷貝

2024-11-28 10:40:26

零拷貝技術系統

2021-03-12 13:57:13

零拷貝技術

2024-06-24 00:09:00

零拷貝技術MMapsendFile

2024-12-04 14:45:14

零拷貝技術CPU 拷貝Zero-copy

2019-09-23 08:46:04

零拷貝 CPU內存

2020-02-28 19:10:40

Linux零拷貝原理

2020-10-12 06:33:18

Zero-Copy零拷貝CPU

2023-07-29 13:45:30

了不起 Java極

2022-09-23 08:47:01

DMA網卡CPU

2019-08-01 11:04:10

Linux磁盤I
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一区不卡 | 日韩精品在线一区二区 | 色资源在线 | 欧美久久一区二区三区 | 99国产精品99久久久久久 | 99热在线观看精品 | 九九热视频这里只有精品 | 日韩一区二区黄色片 | 免费观看成人鲁鲁鲁鲁鲁视频 | 夜久久 | 黄色在线观看网址 | 日韩一区二区在线免费观看 | 成人av在线播放 | 日本久草视频 | 天天夜夜操 | a看片| 一区二区在线不卡 | 国产伊人精品 | 久久99视频 | 国产在线观看福利 | 亚洲欧美成人影院 | 精品三级在线观看 | 亚洲91精品 | 精品国产乱码久久久 | 91av在线视频观看 | av先锋资源 | 国产精品视频免费观看 | 一二区视频 | 91社区在线观看高清 | 亚洲人成人一区二区在线观看 | 亚洲精品一 | 国产精品日韩一区二区 | 国产农村妇女毛片精品久久麻豆 | 一区二区三区欧美在线 | 中文字幕在线网 | 自拍偷拍第一页 | 欧美激情区 | 日韩欧美高清dvd碟片 | 性欧美精品一区二区三区在线播放 | 噜啊噜在线 | 日韩国产高清在线观看 |