自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:說說零拷貝和多路復(fù)用?

存儲 數(shù)據(jù)管理
多路復(fù)用技術(shù)則是一種讓單個進(jìn)程(或線程)能夠同時監(jiān)視多個描述符(如文件描述符、socket描述符)的技術(shù),當(dāng)其中任何一個描述符準(zhǔn)備好進(jìn)行讀、寫或者異常操作時,就會通知該進(jìn)程。

零拷貝技術(shù)和多路復(fù)用技術(shù)是現(xiàn)代計算機(jī)系統(tǒng)和網(wǎng)絡(luò)編程中兩項重要的優(yōu)化手段,旨在提高數(shù)據(jù)處理和傳輸?shù)男?。如高性能框?Netty 中,即使用了零拷貝技術(shù)又使用了多路復(fù)用技術(shù),同時來保證 Netty 框架的高性能運(yùn)行。

1.零拷貝技術(shù)

零拷貝(Zero-copy)技術(shù)是一種計算機(jī)操作系統(tǒng)中用于提高數(shù)據(jù)傳輸效率的優(yōu)化策略。在傳統(tǒng)的數(shù)據(jù)傳輸過程中,需要將數(shù)據(jù)從一個緩沖區(qū)拷貝到另一個緩沖區(qū),然后再傳輸給目標(biāo)。這涉及到多次的 CPU 和內(nèi)存之間的數(shù)據(jù)拷貝操作,會消耗 CPU 的時間和內(nèi)存帶寬。而零拷貝技術(shù)通過直接共享數(shù)據(jù)的內(nèi)存地址,避免了中間的拷貝過程,從而提高了數(shù)據(jù)傳輸?shù)男省?/span>

1.1 傳統(tǒng)IO

要搞明白零拷貝技術(shù)就要先搞清楚傳統(tǒng) IO 的執(zhí)行流程,傳統(tǒng)的 IO 的執(zhí)行流程如下:

圖片圖片

① 用戶態(tài) VS 內(nèi)核態(tài)

操作系統(tǒng)有用戶態(tài)和內(nèi)核態(tài)之分,這是因為計算機(jī)體系結(jié)構(gòu)中的操作系統(tǒng)設(shè)計了兩個不同的執(zhí)行環(huán)境,以提供不同的功能和特權(quán)級別。

  • 用戶態(tài)(User Mode)是指應(yīng)用程序運(yùn)行時的執(zhí)行環(huán)境。在用戶態(tài)下,應(yīng)用程序只能訪問受限資源,如應(yīng)用程序自身的內(nèi)存空間、CPU 寄存器等,并且不能直接訪問操作系統(tǒng)的底層資源和硬件設(shè)備。
  • 內(nèi)核態(tài)(Kernel Mode)是指操作系統(tǒng)內(nèi)核運(yùn)行時的執(zhí)行環(huán)境。在內(nèi)核態(tài)下,操作系統(tǒng)具有更高的權(quán)限,可以直接訪問系統(tǒng)的硬件和底層資源,如 CPU、內(nèi)存、設(shè)備驅(qū)動程序等。

② DMA技術(shù)

DMA(Direct Memory Access,直接內(nèi)存訪問)技術(shù),繞過 CPU,直接在內(nèi)存和外設(shè)之間進(jìn)行數(shù)據(jù)傳輸。這樣可以減少 CPU 的參與,提高數(shù)據(jù)傳輸?shù)男省?/span>

1.2 零拷貝技術(shù)

零拷貝技術(shù)可以利用 Linux 下的 MMap、sendFile 等手段來實現(xiàn),使得數(shù)據(jù)能夠直接從磁盤映射到內(nèi)核緩沖區(qū),然后通過 DMA 傳輸?shù)骄W(wǎng)卡緩存,整個過程中 CPU 只負(fù)責(zé)管理和調(diào)度,而無需執(zhí)行實際的數(shù)據(jù)復(fù)制指令。

① MMap

MMap(Memory Map)是 Linux 操作系統(tǒng)中提供的一種將文件映射到進(jìn)程地址空間的一種機(jī)制,通過 MMap 進(jìn)程可以像訪問內(nèi)存一樣訪問文件,而無需顯式的復(fù)制操作。

使用 MMap 可以把 IO 執(zhí)行流程優(yōu)化成以下執(zhí)行步驟:

圖片圖片

傳統(tǒng)的 IO 需要四次拷貝和四次上下文(用戶態(tài)和內(nèi)核態(tài))切換,而 MMap 只需要三次拷貝和四次上下文切換,從而能夠提升程序整體的執(zhí)行效率,并且節(jié)省了程序的內(nèi)存空間。

② senFile 方法

在 Linux 操作系統(tǒng)中 sendFile() 是一個系統(tǒng)調(diào)用函數(shù),用于高效地將文件數(shù)據(jù)從內(nèi)核空間直接傳輸?shù)骄W(wǎng)絡(luò)套接字(Socket)上,從而實現(xiàn)零拷貝技術(shù)。這個函數(shù)的主要目的是減少 CPU 上下文切換以及內(nèi)存復(fù)制操作,提高文件傳輸性能。

使用 sendFile() 可以把 IO 執(zhí)行流程優(yōu)化成以下執(zhí)行步驟:

圖片圖片

1.3 零拷貝技術(shù)應(yīng)用

在 Java 中,以下幾個地方使用了零拷貝技術(shù):

  1. NIO(New I/O)通道:java.nio.channels.FileChannel 提供了 transferTo() 和 transferFrom() 方法,可以直接將數(shù)據(jù)從一個通道傳輸?shù)搅硪粋€通道,例如從文件通道直接傳輸?shù)?Socket 通道,整個過程無需將數(shù)據(jù)復(fù)制到用戶空間緩沖區(qū),從而實現(xiàn)了零拷貝。
  2. Socket Direct Buffer:在 JDK 1.4 及更高版本中,Java NIO 支持使用直接緩沖區(qū)(DirectBuffer),這類緩沖區(qū)是在系統(tǒng)堆外分配的,可以直接由網(wǎng)卡硬件進(jìn)行 DMA 操作,減少數(shù)據(jù)在用戶態(tài)與內(nèi)核態(tài)之間復(fù)制次數(shù) ,提高網(wǎng)絡(luò)數(shù)據(jù)發(fā)送效率。
  3. Apache Kafka 或者 Netty 等高性能框架:這些框架在底層實現(xiàn)上通常會利用 Java NIO 的上述特性來優(yōu)化數(shù)據(jù)傳輸,如 Kafka 生產(chǎn)者和消費(fèi)者在傳輸消息時會用到零拷貝技術(shù)以提升性能。

2.多路復(fù)用技術(shù)

多路復(fù)用技術(shù)則是一種讓單個進(jìn)程(或線程)能夠同時監(jiān)視多個描述符(如文件描述符、socket描述符)的技術(shù),當(dāng)其中任何一個描述符準(zhǔn)備好進(jìn)行讀、寫或者異常操作時,就會通知該進(jìn)程。這種方式可以顯著提高并發(fā)處理能力,減少系統(tǒng)開銷,特別是在處理大量并發(fā)連接時。 主要的多路復(fù)用技術(shù)包括:

  1. select:最基礎(chǔ)的多路復(fù)用接口,但受限于最大文件描述符數(shù)量,且每次調(diào)用都需要重新傳入所有待檢查的描述符集合。
  2. poll:相對于 select 有所改進(jìn),使用鏈表管理描述符,解決了文件描述符數(shù)量限制問題,但仍存在效率問題。
  3. epoll:提供了更高效的事件通知機(jī)制,僅關(guān)注發(fā)生變化的文件描述符,避免了無謂的遍歷,特別適用于高并發(fā)場景。

在 Java 中,可以通過 NIO(非阻塞 I/O)庫中的 Selector 實現(xiàn)多路復(fù)用,結(jié)合諸如 FileChannel.transferTo() 等方法實現(xiàn)零拷貝,從而在開發(fā)高性能網(wǎng)絡(luò)應(yīng)用和服務(wù)時顯著提升數(shù)據(jù)處理和傳輸?shù)男省?/span>

責(zé)任編輯:武曉燕 來源: Java和磊哥
相關(guān)推薦

2024-07-31 08:28:37

DMAIOMMap

2024-09-20 08:36:43

零拷貝數(shù)據(jù)傳輸DMA

2024-03-22 06:56:24

零拷貝技術(shù)數(shù)據(jù)傳輸數(shù)據(jù)拷貝

2024-09-26 16:01:52

2024-12-04 14:45:14

零拷貝技術(shù)CPU 拷貝Zero-copy

2024-09-27 15:43:52

零拷貝DMAIO

2024-10-24 16:14:43

數(shù)據(jù)傳輸CPU零拷貝

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構(gòu)

2023-01-09 10:04:47

IO多路復(fù)用模型

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-06-24 00:09:00

零拷貝技術(shù)MMapsendFile

2024-11-19 15:13:02

2024-08-29 16:30:27

2023-12-27 18:16:39

MVCC隔離級別幻讀

2024-08-12 17:36:54

2025-04-16 00:00:01

JWT客戶端存儲加密令

2025-04-08 00:00:00

@AsyncSpring異步

2011-12-08 10:51:25

JavaNIO
點贊
收藏

51CTO技術(shù)棧公眾號