欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中關于Binder常見面試問題小結

 更新時間:2022年06月29日 16:46:12   作者:攻城獅猿  
這篇文章主要介紹了Android中關于Binder幾個面試問題,binder是一種進程間通訊的機制,進程間通訊需要了解用戶空間和內核空間,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下

1.簡單介紹下binder

binder是一種進程間通訊的機制

進程間通訊需要了解用戶空間內核空間

每個進程擁有自己的獨立虛擬機,系統(tǒng)為他們分配的地址空間都是互相隔離的。 如兩個進程需要進行通訊,則需要使用到內核空間做載體,內核空間是所有進程共享的一塊內存區(qū)域。 而用戶空間切到內核空間需要使用到系統(tǒng)api ioctl進行通訊。內核獲取用戶的數(shù)據(jù)需要使用copy_from_user,內核將數(shù)據(jù)發(fā)送給其他進程需要使用copy_to_user,這兩個方法是有性能開銷的,對于socket就是使用的這種模式,為了減少這部分的開銷,內核提供了binder,binder只需要一次拷貝就可以實現(xiàn)進程通訊.

主要是使用mmap的原理:

內核空間用戶空間都開辟一塊虛擬內存區(qū)域同時指向一塊物理地址,這樣內核需要傳遞數(shù)據(jù)給用戶空間時,只需要將數(shù)據(jù)拷貝到對應的虛擬內存地址中,用戶可以通過虛擬內存映射關系,獲取到內核中的數(shù)據(jù),實現(xiàn)了一次拷貝通訊。

binder架構上面使用的是C/S架構:

binder中有三要素:
客戶端,服務端和ServiceManager

binder整體過程:

1.注冊服務 2.獲取服務 3.使用服務

2.Binder的定向制導,如何找到目標Binder,喚起進程或者線程?

數(shù)據(jù)結構流程:

1.server注冊過程 
      1.server傳入一個flat_binder_object給內核態(tài)。內核根據(jù)這個flat_binder_object創(chuàng)建binder_node節(jié)點,為每個進程服務,內部有個binder_proc.proc = server進程
      2.serviceManager在內核態(tài)創(chuàng)建binder_ref引用這個binder_node,內部有一項desc = 1,2,3..,在用戶態(tài)會創(chuàng)建一個服務鏈表{name ="server name",handle = "server handle"}
2.client獲取服務過程
      3.client向sm查詢服務,傳遞name
      4.sm返回handle給驅動程序
      5.驅動程序在sm的binder_ref_desc紅黑樹中根據(jù)handle找到binder_ref,再根據(jù)binder_ref.node找到binder_node,最后給client創(chuàng)建新的binder_ref指向這個binder_node,他的desc從1開始binder_ref{desc=1,node = binder_node},驅動返回desc給client,即handle總結:sm中的handle順序是根據(jù)服務注冊順序顯示,返回給client中的handle是根據(jù)服務獲取的順序顯示的
3.client使用handle過程
      6.:驅動里面根據(jù)handle找到找到binder_ref,根據(jù)binder_ref找到binder_node,根據(jù)binder_node找到進程server

注:

flat_binder_object{
    type:是binder實體還是引用,只有需要注冊的服務可以傳binder實體,其他只能傳handle引用
    flag(聯(lián)合體)
    binder(實體:處理函數(shù))/handle(引用:服務的引用):
    cookie
}

數(shù)據(jù)傳輸過程(進程切換):

數(shù)據(jù)如何復制:

3.Binder中的紅黑樹,為什么會有兩棵binder_ref紅黑樹

  • refs_by_desc主要是通過desc來查找對應的binder_ref
  • refs_by_node主要是通過node來查找對應的binder_ref

查找方式不一樣

4.Binder一次拷貝原理

傳統(tǒng)的數(shù)據(jù)拷貝方式如socket

用戶空間---->內核空間:`copy_from_user `
內核空間---->用戶空間:`copy_to_user`

而binder使用mmap機制

在內核空間和用戶空間中間使用物理地址開辟了一個映射關系
內核空間調用copy_from_user會直接將數(shù)據(jù)拷貝到內核空間并反饋到映射后的物理地址上,
由于用戶空間和物理地址也有個映射關系,用戶空間可以直接通過映射的虛擬地址指針訪問到寫入物理地址的數(shù)據(jù)。
這就是binder一次拷貝的原理

5.Binder傳輸數(shù)據(jù)的大小限制?

對于內核可以傳輸?shù)氖?code>4M,但是應用層限制在1M-8K范圍內,這就是在進程間傳輸過大的數(shù)據(jù)會導致崩潰的原因

6.系統(tǒng)服務與bindService等啟動的服務的區(qū)別

系統(tǒng)服務需要將服務注冊到ServiceManager,使用的時候需要通過服務名稱去ServiceManger中獲取服務的引用,

bindService等啟動的服務是將服務注冊到AMS中的ServiceMap中,所有的服務的生命周期都由AMS控制。啟動服務的進程如果需要使用IPC通訊,都是和獲取AMS的代理類進行通訊,AMS也是在SystemServer啟動的時候一個注冊到ServiceManager的系統(tǒng)服務。

7.Binder多線程

binder線程池默認提供了15個線程進行處理進程間并發(fā)事件,如果服務端線程不夠用,則驅動會發(fā)出一個信號,應用層收到這個信號調用Register_Thread,這樣驅動層就可以使用這個新建出來的子線程進行數(shù)據(jù)的處理

8.Android APP進程天生支持Binder通信的原理是什么?

Android APP進程都是由Zygote進程孵化出來的。

常見場景

點擊桌面icon啟動APP,或者startActivity啟動一個新進程里面的Activity,最終都會由AMS去調用Process.start()方法去向Zygote進程發(fā)送請求,讓Zygotefork一個新進程,Zygote收到請求后會調用Zygote.forkAndSpecialize()fork出新進程,之后會通過RuntimeInit.nativeZygoteInit來初始化Andriod APP運行需要的一些環(huán)境,而binder線程就是在這個時候新建啟動的

virtual void onZygoteInit()
{
    sp proc = ProcessState::self();
    //啟動新binder線程loop
    proc->startThreadPool();
}

9.同一個線程的請求必定是順序執(zhí)行,即使是異步請求(oneway)

一般而言,Client同步阻塞請求Service,直到Service提供完服務后才返回,不過,也有特殊的,比如請求用ONE_WAY方式,這種場景一般主要是用來通知,至于通知被誰消費,是否被消費壓根不會關心。 拿ContentService服務為例子,它是一個全局的通知中心,負責轉發(fā)通知,而且,一般是群發(fā),由于在轉發(fā)的時候,ContentService被看做Client,如果這個時候采用普通的同步阻塞勢必會造成通知的延時發(fā)送送,所以這里的Client采用了oneway,異步。

到此這篇關于Android中關于Binder常見面試問題小結的文章就介紹到這了,更多相關Android Binder面試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android使用Opengl錄像時添加水印

    Android使用Opengl錄像時添加水印

    這篇文章主要為大家詳細介紹了Android使用Opengl錄像時添加水印,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • listview與SQLite結合實現(xiàn)記事本功能

    listview與SQLite結合實現(xiàn)記事本功能

    這篇文章主要為大家詳細介紹了listview與SQLite結合實現(xiàn)記事本功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android?App頁面滑動標題欄顏色漸變詳解

    Android?App頁面滑動標題欄顏色漸變詳解

    這篇文章主要為大家詳細介紹了Android?App頁面滑動標題欄顏色漸變,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android實現(xiàn)底部彈出的對話框功能

    Android實現(xiàn)底部彈出的對話框功能

    這篇文章主要介紹了Android實現(xiàn)底部彈出的對話框功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Android 沉浸式狀態(tài)欄與隱藏導航欄實例詳解

    Android 沉浸式狀態(tài)欄與隱藏導航欄實例詳解

    沉浸式狀態(tài)欄是指狀態(tài)欄與ActionBar顏色相匹配,隱藏導航欄,就是將導航欄隱藏,去掉下面的黑條。下面通過實例給大家詳解android沉浸式狀態(tài)欄與隱藏導航欄,感興趣的朋友一起看看
    2017-07-07
  • flutter直接上傳文件到阿里云oss

    flutter直接上傳文件到阿里云oss

    上傳視頻到oss,之前是走后端上傳到oss,會有一個問題就是我要先上傳給后端,后端再上傳給oss就會導致上傳多次,消耗時間過長影響用戶體驗,所以我參考文檔寫了直接上傳到阿里云oss獲取到文件訪問路徑。
    2021-05-05
  • Android表格圖標庫制作

    Android表格圖標庫制作

    本篇文章主要給大家分享了在Android平臺上制作一個含有表格的圖標庫實例,對此有興趣的朋友參考下吧。
    2018-01-01
  • Android編程實現(xiàn)鬧鐘的方法詳解

    Android編程實現(xiàn)鬧鐘的方法詳解

    這篇文章主要介紹了Android編程實現(xiàn)鬧鐘的方法,結合實例形式較為詳細的分析了Android鬧鐘的原理、布局、權限控制及相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Android開發(fā)實現(xiàn)的圓角按鈕、文字陰影按鈕效果示例

    Android開發(fā)實現(xiàn)的圓角按鈕、文字陰影按鈕效果示例

    這篇文章主要介紹了Android開發(fā)實現(xiàn)的圓角按鈕、文字陰影按鈕效果,涉及Android界面布局與屬性設置相關操作技巧,需要的朋友可以參考下
    2019-04-04
  • Flutter開發(fā)之Shortcuts快捷鍵組件的用法詳解

    Flutter開發(fā)之Shortcuts快捷鍵組件的用法詳解

    在桌面端的開發(fā)中,鍵盤快捷鍵是非常常見而必要的,F(xiàn)lutter?既然可以開發(fā)桌面端應用,那必然要提供自定義快捷鍵,所以本文就來和大家講講Shortcuts組件的簡單使用吧
    2023-05-05

最新評論