android binder 處理序間通訊機制3-Binder 對象生死

來源:互聯網
上載者:User

標籤:android   io   使用   資料   on   cti   ad   工作   ef   

以下概述Binder通訊過程中涉及到的四個對象:Binder本機物件、Binder實體物件、Binder引用對象、Binder代理對象的生死。

1、Binder通訊的互動過程

  1.Client 進程發出處理序間通訊請求,具體由Client進程中的代理對象通過Binder驅動程式向Server進程中的Binder本機物件發起請求。

  2.Binder驅動程式根據Client進程傳遞過來的Binder代理對象的控制代碼值找到Binder驅動程式內的Binder引用對象。

  3.根據Binder引用對象找到Binder實體物件。同時為本次請求建立一個binder_transaction結構(事務)來描述本次處理序間通訊過程。

  4.Binder驅動程式根據找到的Binder實體物件找到運行在Server進程中的Binder本機物件,並將Client進程發來的資料發給他。

  5.Server進程處理完成後,將處理結果返回給Binder驅動程式,驅動程式將結果寫入前面建立的binder_transaction中

  6.Binder驅動程式通過儲存在binder_transaction中的Client資訊,找到Client進程,將通訊結果返回給對應的Binder代理對象處理。

2、由以上過程可知:binder代理對象依賴於binder引用對象,binder引用對象依賴於binder實體物件,binder實體物件依賴於binder本機物件。一下介紹這些被依賴的對象是如何保證粗活的:

binder 引用對象和binder實體物件在核心空間Binder驅動程式內部維護。實際上分別是binder_ref和binder_node結構體。

binder 代理對象在使用者空間Client進程內維護。是一個BpBinder對象。

binder 本機物件在使用者空間Server進程內維護。是一個BBinder對象。

  1.Binder本機物件的生命週期。

    在被驅動程式實體物件引用時,應該保證本機物件的引用計數不為0。在Server進程將一個Binder本機物件註冊到ServerManager時,Binder驅動程式會為他建立對應的實體物件(binder_node)。當有Cient進程查詢Binder本機物件的代理對象介面時,binder_node 中的有關引用計數的值會發生改變。Binder驅動通過函數:

  binder_thread_read

  使用協議BR_INCREFS,BR_ACQUIRE,BR_DECREFS,BR_RELEASE與Server進程通訊。通訊資料會寫入Server進程的一個使用者空間緩衝區中。

  Server進程的IPCThreadState的成員函數executeCommand從取出協議命令並執行,增減本機物件的強弱引用計數實現生命週期管理。

  另:BBinder繼承自RefBase,在使用者空間的引用可自動管理。

  2.Binder實體物件的生命週期。

  當Binder引用對象建立或銷毀時,由於引用對象會引用實體物件,需要對應的增減Binder實體物件的引用計數。因為同在核心空間,調用binder_inc_node和binder_dec_node操作實體物件的引用,具體規則參考源碼binder.c的這兩個函數實現。

  3.Binder引用對象的生命週期。

  類似本機物件的生命週期,在Binder驅動程式內使用函數binder_thread_write,讀取由Client寫入使用者空間緩衝區的BC_ACQUIRE,BC_INCREFS,BC_RELEASE,BC_DECREFS四個協議增減Binder引用對象的強弱引用計數。

  這個過程是通過Client進程傳進來的控制代碼值找到對應的引用對象的。

  4.Binder代理對象的生命週期。

3.Binder對象死亡通知機制:

  過程一:

  1.定義死亡接收通知,DeathRecipient

  2.調用代理對象BpBinder的linkToDeath註冊。註冊的最後會調用IPCThreadState::flushCommands()將註冊死亡通知協議儘快通知給Binder驅動程式

  3.Binder驅動程式在binder_thread_write中處理註冊請求。

  過程二:

  1.發送死亡通知:本機物件死亡會出發關閉/dev/binder裝置,binder_release會被調用,binder驅動程式會在其中檢查Binder本機物件是否死亡,該過程會調用binder_deferred_release 執行。如死亡會在binder_thread_read中檢測到BINDER_WORK_DEAD_BINDER的工作項目。就會發出死亡通知。

  2.接收死亡通知:Client進程會在IPCThreadState::executeCommand函數中處理到BR_DEAD_BINDER協議了。

  過程三:

  1.登出接收死亡通知:代理對象調用BpBinder::unlinkToDeath。

  

android binder 處理序間通訊機制3-Binder 對象生死

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.