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

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

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

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

那么,Binder 的“一次拷貝”是如何實現的?本文將結合 流程圖 + 代碼解析,帶你徹底搞懂這個關鍵技術!??

1.Binder 通信數據拷貝流程

通常,進程間通信需要經歷 發送進程 → 內核 → 接收進程 這樣一個傳輸鏈路。我們先看一下常見的 兩次拷貝 方式,再看看 Binder 如何優化為“一次拷貝”。

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

在 Socket 或管道等傳統 IPC 方式中,數據需要 兩次拷貝:

1?? 發送進程 → 內核態緩沖區(第一次拷貝)

2?? 內核態緩沖區 → 目標進程(第二次拷貝)

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

圖片圖片

 缺點:數據需要 兩次拷貝,會產生額外的 CPU 及內存開銷

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

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

Binder 發送進程(Client) 向 接收進程(Server) 發送數據,數據 僅拷貝一次,避免傳統 IPC 的 兩次拷貝(用戶態 ? 內核態 ? 用戶態)。

??Step 1:發送進程 mmap 共享內存

發送進程(Client) 通過 mmap() 在自己的用戶空間創建 Binder Buffer,這塊內存由 Binder 驅動管理。

??Step 2:發送進程向 Binder 驅動發起請求

?? 發送進程(Client)向 Binder 驅動提交數據:

數據寫入 mmap 共享內存

Binder 驅動解析目標進程

Binder 驅動查找 Server 的 mmap 共享區域

??Step 3:Binder 驅動將數據拷貝到目標進程的 mmap 共享區

?? 關鍵點:

Binder 驅動查找 Server 進程的 mmap 共享內存

Binder 直接將數據拷貝到 Server 進程的共享 Buffer

Server 進程 直接 讀取共享 Buffer

?? 示意圖:

圖片圖片

?? 優化點:

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

Server 進程 無需額外拷貝,直接在 mmap 共享內存中讀取數據

??Step 4:Server 讀取數據

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

2.一次拷貝的關鍵技術:Binder Buffer

Binder 之所以能做到“一次拷貝”,關鍵在于 Binder Buffer 機制。

?? 核心技術點:

? mmap 映射共享內存:Binder 通過 mmap 預先在用戶空間 分配一塊共享緩沖區(Binder Buffer),讓數據可以在進程間直接拷貝。

? 物理頁共享:Binder 驅動在內核中管理物理頁,把這塊緩沖區映射到不同進程的地址空間,實現跨進程訪問。

? 用戶態拷貝數據:數據直接從 發送進程 拷貝到 接收進程的映射緩沖區,不再經過內核緩沖區。

mmap 共享緩沖區示意圖

圖片圖片

作用:這塊 mmap 共享內存 讓多個進程能共享相同的物理內存頁,避免了不必要的數據拷貝

關鍵點:數據不會進入內核緩沖區,而是直接 從發送進程拷貝到接收進程

3.一次拷貝的核心實現(代碼解析)

Binder Buffer 的實現,主要涉及 mmap 共享內存映射 + copy_from_user() 數據拷貝。

?? (1) 發送進程:申請 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);

通過 mmap() 分配一塊共享緩沖區,這塊緩沖區由 Binder 驅動管理

?? (2) 發送數據時:數據直接拷貝到目標進程的映射內存

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 結構體用于 指向共享緩沖區,內核直接操作這個地址進行數據傳輸

?? (3) 內核拷貝數據到目標進程(一次拷貝實現)

copy_from_user(mapped_buffer, user_buffer, size);

copy_from_user() 直接拷貝數據到目標進程的映射區域

4.總結:Binder 為什么比傳統 IPC 高效?

圖片

? Binder 通過 mmap 共享內存,避免兩次拷貝,提升 IPC 速度

? Binder 通過物理頁映射,讓數據直接在用戶空間共享

? 相比傳統 IPC(Socket、管道),Binder 傳輸大塊數據時更加高效

本文轉載自微信公眾號「 快樂程序猿」,可以通過以下二維碼關注。轉載本文請聯系快樂程序猿公眾號。

責任編輯:武曉燕 來源: 快樂程序猿
相關推薦

2019-11-27 18:33:32

Docker架構數據

2017-07-07 11:28:24

大數據大數據技術

2023-10-09 08:24:54

IPC機制Binder

2019-04-18 10:55:00

故障演練流量

2010-03-04 09:46:51

Android Bin

2017-12-12 16:17:55

微服務系統運維

2011-11-09 15:49:52

API

2019-07-25 13:13:25

AndroidHandler消費機制

2017-05-15 19:40:40

AndroidIPC機制

2009-11-20 11:37:11

Oracle完全卸載

2010-03-30 10:44:05

Nginx啟動

2024-12-04 13:52:30

2021-05-24 10:55:05

Netty單機并發

2022-09-09 08:41:43

Netty服務端驅動

2019-08-08 10:18:15

運維架構技術

2016-01-08 10:03:07

硅谷通吃互聯網

2013-12-17 10:06:40

2018-01-12 15:17:40

數據庫水平分庫數據遷移

2016-06-15 11:06:27

云計算AWS

2010-05-20 17:29:02

IIS安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九一级片 | www.久久久久久久久 | 国产精品久久精品 | 在线观看黄视频 | 九一国产精品 | 国产99久久精品一区二区永久免费 | 色在线看 | 中文字幕免费 | 一区二区三区电影在线观看 | 免费在线色 | 日韩在线视频一区 | 在线播放中文字幕 | av黄色免费在线观看 | 日韩在线欧美 | 日韩欧美一级片 | 九九九视频精品 | 亚洲精品视频免费 | 人人种亚洲 | 国产精品久久久久久久久久久久久 | 成人一区二区三区在线观看 | 欧美精选一区二区 | 精久久久| 99这里只有精品视频 | 二区视频 | 亚洲一区二区三区四区在线观看 | 国产精品久久国产精品 | 日本黄色一级片视频 | 亚洲一区二区三区四区av | 久久久久国产精品午夜一区 | 91久久北条麻妃一区二区三区 | 欧美久久一级特黄毛片 | 免费视频一区二区 | 天天舔天天 | 国产激情视频网 | 日韩影院在线观看 | 久久久精品 | 国产a爽一区二区久久久 | 亚洲精品视频在线观看视频 | 一区二区免费 | 日韩一区二区三区在线视频 | 91亚洲国产成人久久精品网站 |