【Android基礎回顧】一:Binder機制是什么?有什么用?

Android中的Binder機制是Android系統中最核心和最基礎的進程間通訊機制。

1 什么是進程間通訊機制(IPC)?

眾所周知,Android系統基于Linux開發,Linux系統里面本來就有進程間通訊機制。

1.1 Linux的IPC(Inter-Process Communication)概覽

它是不同進程之間交換數據和消息的一種手段。

但是進程之間默認地址空間是隔離的,有什么解決方案去做到不同進程之間交換信息嗎?答案是當然有。

下圖整理自AI。

類型示例特點說明
文件系統相關管道、命名管道(FIFO)簡單,適合父子進程或有命名路徑的通信
內存相關共享內存高效,速度快,但需自行同步(如用信號量)
消息傳遞消息隊列、信號、信號量安全、結構化,但效率略低
套接字通信本地 Socket、網絡 Socket靈活,可跨主機,適用于客戶端-服務器架構
高級通信機制DBus、ZeroMQ、gRPC、Binder等抽象層高,適合復雜或跨語言系統

對于這個列表,我們重點是需要關注這些方案的原理是什么。只有知道原理,我們才能解開現象背后的本質,對于很多技術難題,我們才能有思路舉一反三。

1.2 文件系統相關(管道、命名管道 FIFO)

這類IPC本質上是一個內核緩沖區,讀寫操作通過文件描述符來跟緩沖區進行交互。

寫端進程通過write寫入緩沖區,讀端進程通過read讀取數據。
這種屬于阻塞式通訊,讀和寫都需要等對方準備好,系統通過文件描述符來判斷是否可以進行讀和寫。

1.3 內存相關(共享內存)

這類IPC,在不同進程的虛擬地址空間通過映射的方式,比如mmap來映射到一段共同的物理內存頁來實現“共享”。

進程通過指針直接訪問內存中的數據結果,完全繞過了內核的讀寫接口,所以速度極快。俗稱“零拷貝”。這種機制是沒有內建鎖的,進程需要通過鎖機制等保證并發安全。

1.4 消息傳遞類(消息隊列、信號、信號量)

消息隊列:內核維護一個消息隊列結構體,發送進程通過系統調用把消息copy到內核隊列中(第一次拷貝)。接收方從隊列中獲取信息(第二次拷貝)。

信號:信號是系統內核或者進程向另一個進程發送的異步通知,用來通知某事件的發生。這是一種輕量級的IPC方式。

核心原理是內核使用位圖或者信號隊列標記進程收到的信號,調度器在合適的時候調用信號處理函數。

信號量:是一種同步原語。本質上是內核中的一個整數值結構 + 等待隊列,用于資源訪問同步。

P/V 操作中,P(等待)將信號量值減一,若 < 0 進程阻塞;V(釋放)加一,并喚醒等待隊列中的進程。

1.5 套接字通信(本地 / 網絡 Socket)

Linux 為每個 Socket 創建一個 socket 緩沖區結構(sk_buff),內核中維護雙向隊列。

本地 Socket 使用 UNIX Domain 協議族,數據在內核中傳輸,無需網絡協議棧處理。

網絡 Socket 走 TCP/IP 協議棧,數據被封包、路由、擁塞控制,完整鏈路層處理。

2 Android特有的IPC:Binder

2.1 Binder機制的有什么用?

Binder 是 Android 提供的一種高性能的 IPC 機制,用于實現:

  • 跨進程方法調用(如 A 應用調用系統服務中的方法)
  • 客戶端-服務端架構模型
  • 安全的權限校驗
  • 引用計數和生命周期管理

2.2 Binder機制為什么快?

可以先看下傳統的消息傳遞類IPC做法。

圖片來源:https://blog.csdn.net/carson_ho/article/details/73560642
在這里插入圖片描述

而binder通信機制基于內核 Binder 驅動,使用內核內存映射區(Binder Buffer)做 zero-copy 通信。來看下Binder的做法。

圖片來源:https://blog.csdn.net/carson_ho/article/details/73560642
來自網絡

他的通訊流程是:發送進程 ->內核緩沖區(第一次拷貝) ->映射到接收進程。

2.2 Binder機制由什么組成?

Binder 是一個 C/S 模型(客戶端/服務端),主要組成部分如下:

  1. ServiceManager
    系統服務注冊與發現的“電話簿”,所有服務通過它注冊和查找。

  2. Binder 驅動(Binder Driver)
    位于內核空間(/dev/binder),實現核心的 IPC 邏輯,如數據傳輸、線程調度、引用計數等。

  3. Binder 本地端(Client 端)
    通過代理類(Proxy)與服務端通信,通常由 AIDL 自動生成。

  4. Binder 服務端(Server 端)
    實現具體的業務邏輯,繼承 Binder 類并重寫方法。

  5. Binder線程池(Binder線程)
    服務端進程中專門處理來自 Binder 驅動的調用請求的線程(由 BinderThreadPool 管理)。

下面是一個App調用系統AMS的一個例子:

在這里插入圖片描述

3 常見問題

3.1 如果超過16個進程同時在使用AIDL進行通訊,會發生什么?

首先,16 并不是硬性限制,“16個進程”來源于 Android Binder 線程池默認上限,它是一個服務端并發處理能力的限制,而不是進程數量的限制。

Android 中,服務端 Binder 對象默認最多有 16 個 Binder 線程(可通過 android.os.Binder.setThreadPoolMaxThreadCount(int) 設置)。

而這個限制影響的是,服務端一次性能并發處理的 Binder 請求線程數。

并不是說客戶端數量最多 16 個,而是服務端的同時“處理線程”是 16。

那么如果超過 16 個進程同時通過 AIDL 訪問一個服務,會發生什么呢?

  1. 請求不會失敗,但需要排隊等待,如果服務端的 16 個 Binder 線程都在處理請求,第 17 個及之后的請求將進入等待隊列。

  2. 客戶端 transact() 系統調用會阻塞,直到服務端有空閑線程。

  3. 服務響應變慢(可觀的延遲)。隨著并發請求數增加,響應時間線性上升,尤其是服務端執行耗時任務時。比如,圖像處理、數據庫查詢等在主線程處理會導致嚴重卡頓。

  4. 線程池飽和后,部分請求可能被拒絕(極端情況)。如果服務端主動設置了最大等待隊列長度(如基于 ThreadPoolExecutor),也可能在高負載時拒絕新請求(拋出 RejectedExecutionException)。但這取決于服務的實現方式,Binder 驅動本身仍是隊列化的。

  5. 主線程阻塞風險,如果服務端是 onTransact() 或處理邏輯運行在主線程上,那么并發調用容易造成 ANR(應用無響應)。Google 明確建議服務端操作應放到 HandlerThread / BinderThreadPool / JobScheduler 等后臺線程。

后續繼續補充。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83711.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言爬蟲系列教程5:HTML解析技術以及第三方庫選擇

Go語言爬蟲系列教程5&#xff1a;HTML解析技術以及第三方庫選擇 在上一章中&#xff0c;我們使用正則表達式提取網頁內容&#xff0c;但這種方法有局限性。對于復雜的HTML結構&#xff0c;我們需要使用專門的HTML解析庫。在這一章中&#xff0c;我們將介紹HTML解析技術以及如何…

AtCoder 第408?場初級競賽 A~E題解

A Timeout 【題目鏈接】 原題鏈接:A - Timeout 【考點】 模擬 【題目大意】 長老會在 s 秒后睡去,進過 n 次叫醒,長老最后能否是保持清醒。 【解析】 模擬每一次拍擊叫醒的過程,查看本次時間距上次時間是否大于 s。注意:第一次拍擊叫醒應和 0 秒相減。 【難度】 …

Unity VR/MR開發-VR設備與適用場景分析

視頻講解鏈接&#xff1a;【XR馬斯維】VR/MR設備與適用場景分析&#xff1f;【UnityVR/MR開發教程--入門】_游戲熱門視頻

MyBatis 查詢功能實現全流程

一、創建maven項目 配置好相應的jdk 二、在數據庫建立相應的表格 1.因為Mybatis實際是對sql表的一系列操作&#xff0c;所以我們新建一個數據庫 2.在查詢界面運行下面指令創建一個user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp協議概述 傳輸層協議基本概念 傳輸層協議建立在網絡層和會話層之間&#xff0c;為應用層實體提供端到端的通信功能&#xff0c;確保數據包的順序傳送及數據的完整性。它利用網絡層提供的服務&#xff0c;并通過傳輸層地址&#xff08;端口號&#xff09;提供給高層用戶…

k8s集群安裝坑點匯總

前言 由于使用最新的Rocky9.5,導致kubekey一鍵安裝用不了&#xff0c;退回Rocky8麻煩機器都建好了&#xff0c;決定手動安裝k8s&#xff0c;結果手動安裝過程中遇到各種坑&#xff0c;這里記錄下&#xff1b; k8s安裝 k8s具體安裝過程可自行搜索&#xff0c;或者deepseek; 也…

深入解析 Dotnet-Boxed.Framework:提升 .NET 開發效率的利器

在現代 .NET 開發中&#xff0c;框架和工具的選擇對項目的開發效率和長期維護至關重要。Dotnet-Boxed.Framework 是一個開源框架&#xff0c;旨在簡化開發流程&#xff0c;提高生產力。它通過一組實用的工具和自動化功能&#xff0c;幫助開發者快速構建高質量的應用程序。本文將…

如何輕松地將文件從 PC 傳輸到 iPhone?

傳統上&#xff0c;您可以使用 iTunes 將文件從 PC 傳輸到 iPhone&#xff0c;但現在&#xff0c;使用 iTunes 已不再是唯一的選擇。現在有多種不同且有效的方法可以幫助您傳輸文件。在今天的指南中&#xff0c;您可以找到 8 種使用或不使用 iTunes 傳輸文件的方法&#xff0c;…

Kafka深度解析與原理剖析

文章目錄 一、Kafka核心架構原理1. **分布式協調與選舉**2. **ISR、OSR與HW機制**3. **高性能存儲設計**4. **刷盤機制 (Flush)**5. **消息壓縮算法**二、高可用與消息可靠性保障1. **數據高可用策略**2. **消息丟失場景與規避**3. **順序消費保證**三、Kafka高頻面試題精析1. …

【教學類】20250605立體紙盤(3邊形-22邊形,角度5、10……40,45)

背景需求 在《自助餐》活動中&#xff0c; 【教學類-53-01】20240918自助餐餐盤-CSDN博客文章瀏覽閱讀984次&#xff0c;點贊29次&#xff0c;收藏11次。【教學類-53-01】20240918自助餐餐盤https://blog.csdn.net/reasonsummer/article/details/142340542?spm1011.2415.300…

GC1809:高性能24bit/192kHz音頻接收芯片解析

1. 芯片概述 GC1809 是數字音頻接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等協議&#xff0c;集成8選1輸入切換、低抖動時鐘恢復和24bit DAC&#xff0c;適用于家庭影院、汽車音響等高保真場景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;動態范圍105dB&…

Next.js 中間件鑒權繞過漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一個影響 Next.js 的嚴重漏洞&#xff0c;源于開發者信任了客戶端請求中攜帶的 X-Middleware-Rewrite 頭部字段。攻擊者可以手動構造該頭部&#xff0c;實現繞過中間件邏輯&#xff0c;訪問本應受保護的資源或 API。 影響版本&#xff1a;Next.js < …

第1章 數據分析簡介

第1章 數據分析簡介 1.1 數據分析 當今世界對信息技術依賴日深,每天產生和存儲海量數據,來源于自動檢測系統、傳感器、科學儀器,以及銀行取錢、買東西、寫博客、發微博等日常行為。 數據與信息在形式上不同:數據是無形式可言的字節流,難理解其本質;信息是對數據集處理后…

邊緣計算網關賦能沸石轉輪運行故障智能診斷的配置實例

一、項目背景 在環保行業&#xff0c;隨著國家對大氣污染治理要求的不斷提高&#xff0c;VOCs廢氣處理成為了眾多企業的重要任務。沸石轉輪作為一種高效的VOCs治理設備&#xff0c;被廣泛應用于石油化工、汽車制造、印刷包裝等主流行業。這些行業生產規模大、廢氣排放量多&…

20250602在Ubuntu20.04.6下修改壓縮包的日期和時間

rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…

windows無法安裝到這個磁盤,選中的磁盤采用gpt分區儀式

解決辦法&#xff1a; 我才用的是一個網友分享的微軟官方解決辦法&#xff0c;成功了&#xff0c;但是不知道會不會i有什么影響。將所有分區刪掉&#xff0c;這時磁盤變成為分配的空間。我個人是兩塊固態&#xff0c;一塊m.2&#xff0c;一塊sata&#xff1b;所以我直接將500g…

使用Composer創建公共類庫

概述 如果多個項目中存在使用相同類庫、模塊的情況&#xff0c;此時可以考慮將類庫或者模塊單獨抽取出來&#xff0c;形成獨立類庫&#xff0c;通過composer 來進行依賴管理&#xff0c;這樣可以更方便維護&#xff0c;大大提升開發效率。 優勢 可以對特定模塊進行統一維護和…

Ubuntu中TFTP服務器安裝使用

TFTP服務器 在 Ubuntu 下使用 TFTP&#xff08;Trivial File Transfer Protocol&#xff09; 服務&#xff0c;通常用于簡單的文件傳輸&#xff08;如網絡設備固件更新、嵌入式開發等&#xff09;。 1 TFTP服務器安裝 sudo apt-get install tftp-hpa sudo apt-get install…

前端面試總結

1.請做下自我介紹 技術棧 工作經歷 2.挑一個項目詳細講一下 介紹了一個項目的業務&#xff0c;重點講了一個動態表單的實現&#xff0c;從業務、擴展性、可維護性、性能提升 3.場景題&#xff1a;問答怎么做&#xff0c;表單之間關聯&#xff0c;回答不同問題跳轉到不同的下一個…

Python訓練打卡Day38

Dataset和Dataloader類 知識點回顧&#xff1a; Dataset類的__getitem__和__len__方法&#xff08;本質是python的特殊方法&#xff09;Dataloader類minist手寫數據集的了解 在遇到大規模數據集時&#xff0c;顯存常常無法一次性存儲所有數據&#xff0c;所以需要使用分批訓練的…