偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android Binder 如何做到 IPC 只拷貝一次?mmap 機(jī)制全解!

移動(dòng)開(kāi)發(fā) Android
在 Android 進(jìn)程間通信(IPC)中,Binder 之所以比傳統(tǒng)的 Socket、管道、共享內(nèi)存 更高效,主要得益于其 “一次拷貝” 機(jī)制。相比傳統(tǒng)的 兩次拷貝(用戶態(tài) ? 內(nèi)核態(tài) ? 用戶態(tài)),Binder 通過(guò)內(nèi)存映射(mmap) 技術(shù),減少了一次數(shù)據(jù)復(fù)制,從而提高了 IPC 傳輸效率。

在 Android 進(jìn)程間通信(IPC)中,Binder 之所以比傳統(tǒng)的 Socket、管道、共享內(nèi)存 更高效,主要得益于其 “一次拷貝” 機(jī)制。相比傳統(tǒng)的 兩次拷貝(用戶態(tài) ? 內(nèi)核態(tài) ? 用戶態(tài)),Binder 通過(guò)內(nèi)存映射(mmap) 技術(shù),減少了一次數(shù)據(jù)復(fù)制,從而提高了 IPC 傳輸效率。

那么,Binder 的“一次拷貝”是如何實(shí)現(xiàn)的?本文將結(jié)合 流程圖 + 代碼解析,帶你徹底搞懂這個(gè)關(guān)鍵技術(shù)!??

1.Binder 通信數(shù)據(jù)拷貝流程

通常,進(jìn)程間通信需要經(jīng)歷 發(fā)送進(jìn)程 → 內(nèi)核 → 接收進(jìn)程 這樣一個(gè)傳輸鏈路。我們先看一下常見(jiàn)的 兩次拷貝 方式,再看看 Binder 如何優(yōu)化為“一次拷貝”。

(1) 傳統(tǒng) IPC 的“兩次拷貝”

在 Socket 或管道等傳統(tǒng) IPC 方式中,數(shù)據(jù)需要 兩次拷貝:

1?? 發(fā)送進(jìn)程 → 內(nèi)核態(tài)緩沖區(qū)(第一次拷貝)

2?? 內(nèi)核態(tài)緩沖區(qū) → 目標(biāo)進(jìn)程(第二次拷貝)

?? 數(shù)據(jù)傳輸流程圖(兩次拷貝)

圖片圖片

 缺點(diǎn):數(shù)據(jù)需要 兩次拷貝,會(huì)產(chǎn)生額外的 CPU 及內(nèi)存開(kāi)銷(xiāo)

問(wèn)題:如何減少一次拷貝,提高 IPC 傳輸效率?

(2) Binder 的“一次拷貝”優(yōu)化

Binder 發(fā)送進(jìn)程(Client) 向 接收進(jìn)程(Server) 發(fā)送數(shù)據(jù),數(shù)據(jù) 僅拷貝一次,避免傳統(tǒng) IPC 的 兩次拷貝(用戶態(tài) ? 內(nèi)核態(tài) ? 用戶態(tài))。

??Step 1:發(fā)送進(jìn)程 mmap 共享內(nèi)存

發(fā)送進(jìn)程(Client) 通過(guò) mmap() 在自己的用戶空間創(chuàng)建 Binder Buffer,這塊內(nèi)存由 Binder 驅(qū)動(dòng)管理。

??Step 2:發(fā)送進(jìn)程向 Binder 驅(qū)動(dòng)發(fā)起請(qǐng)求

?? 發(fā)送進(jìn)程(Client)向 Binder 驅(qū)動(dòng)提交數(shù)據(jù):

數(shù)據(jù)寫(xiě)入 mmap 共享內(nèi)存

Binder 驅(qū)動(dòng)解析目標(biāo)進(jìn)程

Binder 驅(qū)動(dòng)查找 Server 的 mmap 共享區(qū)域

??Step 3:Binder 驅(qū)動(dòng)將數(shù)據(jù)拷貝到目標(biāo)進(jìn)程的 mmap 共享區(qū)

?? 關(guān)鍵點(diǎn):

Binder 驅(qū)動(dòng)查找 Server 進(jìn)程的 mmap 共享內(nèi)存

Binder 直接將數(shù)據(jù)拷貝到 Server 進(jìn)程的共享 Buffer

Server 進(jìn)程 直接 讀取共享 Buffer

?? 示意圖:

圖片圖片

?? 優(yōu)化點(diǎn):

只拷貝一次(Client → Server mmap),避免傳統(tǒng) IPC 需要兩次拷貝

Server 進(jìn)程 無(wú)需額外拷貝,直接在 mmap 共享內(nèi)存中讀取數(shù)據(jù)

??Step 4:Server 讀取數(shù)據(jù)

?? Server 進(jìn)程直接讀取 mmap 共享 Buffer,不需要額外拷貝:

2.一次拷貝的關(guān)鍵技術(shù):Binder Buffer

Binder 之所以能做到“一次拷貝”,關(guān)鍵在于 Binder Buffer 機(jī)制。

?? 核心技術(shù)點(diǎn):

? mmap 映射共享內(nèi)存:Binder 通過(guò) mmap 預(yù)先在用戶空間 分配一塊共享緩沖區(qū)(Binder Buffer),讓數(shù)據(jù)可以在進(jìn)程間直接拷貝。

? 物理頁(yè)共享:Binder 驅(qū)動(dòng)在內(nèi)核中管理物理頁(yè),把這塊緩沖區(qū)映射到不同進(jìn)程的地址空間,實(shí)現(xiàn)跨進(jìn)程訪問(wèn)。

? 用戶態(tài)拷貝數(shù)據(jù):數(shù)據(jù)直接從 發(fā)送進(jìn)程 拷貝到 接收進(jìn)程的映射緩沖區(qū),不再經(jīng)過(guò)內(nèi)核緩沖區(qū)。

mmap 共享緩沖區(qū)示意圖

圖片圖片

作用:這塊 mmap 共享內(nèi)存 讓多個(gè)進(jìn)程能共享相同的物理內(nèi)存頁(yè),避免了不必要的數(shù)據(jù)拷貝

關(guān)鍵點(diǎn):數(shù)據(jù)不會(huì)進(jìn)入內(nèi)核緩沖區(qū),而是直接 從發(fā)送進(jìn)程拷貝到接收進(jìn)程

3.一次拷貝的核心實(shí)現(xiàn)(代碼解析)

Binder Buffer 的實(shí)現(xiàn),主要涉及 mmap 共享內(nèi)存映射 + copy_from_user() 數(shù)據(jù)拷貝。

?? (1) 發(fā)送進(jìn)程:申請(qǐng) Binder Buffer

int binder_fd = open("/dev/binder", O_RDWR);
size_t buffer_size = 128 * 1024; // 128 KB
mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, binder_fd, 0);

通過(guò) mmap() 分配一塊共享緩沖區(qū),這塊緩沖區(qū)由 Binder 驅(qū)動(dòng)管理

?? (2) 發(fā)送數(shù)據(jù)時(shí):數(shù)據(jù)直接拷貝到目標(biāo)進(jìn)程的映射內(nèi)存

void binder_transact(int binder_fd, void* data, size_t len) {
    struct binder_write_read bwr;
    bwr.write_size = len;
    bwr.write_buffer = (uintptr_t)data;
    ioctl(binder_fd, BINDER_WRITE_READ, &bwr);
}

binder_write_read 結(jié)構(gòu)體用于 指向共享緩沖區(qū),內(nèi)核直接操作這個(gè)地址進(jìn)行數(shù)據(jù)傳輸

?? (3) 內(nèi)核拷貝數(shù)據(jù)到目標(biāo)進(jìn)程(一次拷貝實(shí)現(xiàn))

copy_from_user(mapped_buffer, user_buffer, size);

copy_from_user() 直接拷貝數(shù)據(jù)到目標(biāo)進(jìn)程的映射區(qū)域

4.總結(jié):Binder 為什么比傳統(tǒng) IPC 高效?

圖片

? Binder 通過(guò) mmap 共享內(nèi)存,避免兩次拷貝,提升 IPC 速度

? Binder 通過(guò)物理頁(yè)映射,讓數(shù)據(jù)直接在用戶空間共享

? 相比傳統(tǒng) IPC(Socket、管道),Binder 傳輸大塊數(shù)據(jù)時(shí)更加高效

本文轉(zhuǎn)載自微信公眾號(hào)「 快樂(lè)程序猿」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系快樂(lè)程序猿公眾號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 快樂(lè)程序猿
相關(guān)推薦

2019-11-27 18:33:32

Docker架構(gòu)數(shù)據(jù)

2017-07-07 11:28:24

大數(shù)據(jù)大數(shù)據(jù)技術(shù)

2023-10-09 08:24:54

IPC機(jī)制Binder

2019-04-18 10:55:00

故障演練流量

2010-03-04 09:46:51

Android Bin

2011-11-09 15:49:52

API

2017-12-12 16:17:55

微服務(wù)系統(tǒng)運(yùn)維

2019-07-25 13:13:25

AndroidHandler消費(fèi)機(jī)制

2017-05-15 19:40:40

AndroidIPC機(jī)制

2009-11-20 11:37:11

Oracle完全卸載

2022-09-09 08:41:43

Netty服務(wù)端驅(qū)動(dòng)

2010-03-30 10:44:05

Nginx啟動(dòng)

2021-05-24 10:55:05

Netty單機(jī)并發(fā)

2024-12-04 13:52:30

2016-01-08 10:03:07

硅谷通吃互聯(lián)網(wǎng)

2019-08-08 10:18:15

運(yùn)維架構(gòu)技術(shù)

2013-12-17 10:06:40

2019-07-01 15:40:53

大數(shù)據(jù)架構(gòu)流處理

2016-06-15 11:06:27

云計(jì)算AWS

2010-05-20 17:29:02

IIS安全
點(diǎn)贊
收藏

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