<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **在Code 的世界里,兩個對象能直接相互訪問的前提是這兩個對象都存在于相同的內存地址空間中**,如果**兩個對象分別存在于兩個不同的進程中**,比如上面我們說到的ActivityManager 和ActivityManagerService,那么**這兩個對象是不能直接相互調用的,這時我們就需要使用到一種跨進程通信技術,使存在于兩個不同進程的對象能夠互訪**。 **傳統的跨進程通信方式**有很多,**比如Socket 、信號量、管道、內存共享、消息隊列等**,這些傳統的跨進程通信方式在Linux 中都存在,**大家知道Android 是基于Linux的,按理來說其使用現成的跨進程通信方式是理所應當,那么為什么還要大費周張地自己設計一個新的通信機制呢**?這只能**說明Binder 具有其他通信方式無可比擬的優勢,傳統的跨進程通信機制,比如Socket,開銷大且效率不高,而管道和l 隊列拷貝次數多,更重要的是,對于移動設備來說,安全性相當重要,而傳統的通信機制安全性低,大部分情況下接收方無法得到發送方進程的可信PID/UID ,難以對其身份現別。而Binder 在設計的時候就考慮到了以上各種缺點,在確保傳輸性能的同時又提高了安全性。** **Binder 所涉及的4 個主要模塊** * Binder Client * Binder Server * ServerManager * Binder Driver 這4 者之間的關系類似于網絡訪問 * Binder Client 相當于我們的客戶端PC * Binder Server 相當于服務器 * ServerManager相當于DNS 服務器 * Binder Driver 則相當于一個路由器 它們的關系如圖18-3 所示。 ![](https://box.kancloud.cn/359847af18988a2fc77db29cd89bbb49_703x247.png) 其中**Binder Driver實現在內核空間**中,而**其余的3 者Binder Client 、Binder Server、ServerManager實現在用戶空間中**。 **Binder Driver 位于內核空間中**, 其以字符設備中的misc 類型注冊,用戶可以從`/dev/binder `設備文件節點上,通過open 和ioctl 文件操作函數與Binder Driver 進行通信,其**主要負責Binder 通信的建立,以及其在進程間的傳遞和Binder 引用計數管理/數據包的傳輸等**。而Binder Client 與BinderServer 之間的跨進程通信則統一通過Binder Driver 處理轉發,對于Binder Client 來說, 其只需要知道自己要使用的Binder 的名字以及該Binder 實體在ServerManager 中的0 號引用即可,訪問的原理也比較簡單, Binder Client 先是通過0 號引用去訪問SeiverManager 獲取該Binder 的引用,得到引用后就可以像普通方法調用那樣調用Binder 實體的方法。最后我們的ServerManager 則用來管理Binder Server, Binder Client 可以通過它來查詢Binder Server 接口,剛才我們說到Binder Client 可以通過ServerManager 來獲取Binder 的引用,這個Binder 的引用就是由ServerManager 來轉換的,這里與其說轉換不如說映射更直接, Binder Server 在生成一個Binder 實體的同時會為其綁定一個名字并將這個名字封裝成一個數據包傳遞給Binder Driver, Binder Driver 接收到這個數據包后,如果發現這個Binder 是新傳遞來的,那么就會為其在內核空間中創建相應的Binder 實體節點和一個對該實體節點的引用,這個實體節點在相應的源碼中叫做Binder node 而其引用則叫做Binder ref,創建完畢后, Binder Driver 就會將該引用傳遞給ServerManager, ServerManager 收到后就會從中取出該Binder 的名字和引用插入一張數據表中,這跟DNS 中存儲的域名到E 地址的映射原理類似,而對于網絡訪問來說,而DNS 服務器也并不一定對每一個IP 地址都有域名映射的記錄,我們常常也會碰到直接通過田地址訪問服務器的情況,而Binder 也一樣并非一定要在ServerManager 中有記錄,很多時候Binder Server 會將一個Binder 實體封裝進數據包傳遞給Binder Client ,而此時BinderServer 會在該數據包中標注Binder 實體的位置, Binder Driver 則會為該匿名的Binder 生成實體節點和實體引用,并將該引用傳遞給Binder Client,那么有人可能會有疑問,既然ServerManager 的作用類似于DNS 服務器,那么其本質是不是應該是一個Binder Server 才對呢?答案是肯定的,ServerManager 就是一個標準的Binder Server,并且在Android 中約定其在Binder 通信的過程中唯一標識(類似于四地址)永遠是0。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看