Android FrameWork (四)
binder &service_manager && ServiceManager
知識回顧:
init
ZygoteInit
Systemserver
源碼分析:
會比較麻煩的一個模塊:
橫跨我們應(yīng)用層- framework-驅(qū)動層 java- native-內(nèi)核
client binder server之間的關(guān)系圖:
SystemServer.java
ActivityManagerService.java
SystemServiceManager.java
ServiceManager.java
關(guān)系圖:
暫存
ServiceManager.rc:
service_manager.c:
總結(jié):
1扒吁,bind_open :打開了binder驅(qū)動 對Binder_version校驗 映射了內(nèi)存空間 大小是128k
2,調(diào)binder_becom_context_manager 設(shè)置 讓自己成為binder設(shè)備的上下文管理者
3脓规,調(diào)用binder_loop 讓service_manager進入死循環(huán)狀態(tài),binder設(shè)備進入loop的狀態(tài) ioctl(BINDER_WRITE_READ)
4蛇损,binder_parse客戶端數(shù)據(jù)進行解析润绵,并且進行回調(diào) svcmgr_handler處理
binder.c
總結(jié):
1,binder_init: 函數(shù) 注冊binder驅(qū)動(mmap open flush release)
2列粪,binder_open: 創(chuàng)建binder_proc,并且初始化進程信息福侈,pid todo wait
把binder_proc 添加到binder_procs
3酒来,binder_mmap: 開辟內(nèi)核空間128k 同時開辟物理內(nèi)存 把內(nèi)核空間和物理空間進行映射,讓他們兩個指向同一個地址
4肪凛,binder_ioctl: 對設(shè)備進行讀寫操作
servicemanager/binder.c
#######總結(jié):
一個串聯(lián)關(guān)系圖:
補充前提知識:
Binder傳統(tǒng)ipc怎么進行通信的堰汉?
系統(tǒng)里進程之間是相互隔離的,a進程無法直接訪問b進程伟墙,每個進程里分為用戶空間和內(nèi)核空間
sp:StrongPointer.h. 智能指針
拓展知識:
性能上:穩(wěn)定性: 安全:
Binder : 一次拷貝 c/s架構(gòu) 客戶端和服務(wù)端 穩(wěn)定 內(nèi)核層校驗系統(tǒng)來保證通信安全
共享內(nèi)存:0次 不穩(wěn)定會有同步問題和并發(fā)死鎖問題 自定義協(xié)議
管道pipe:需要兩次拷貝 單管道 效率低只能讀或者只能寫 自定義協(xié)議
Socket:兩次拷貝 c/s架構(gòu) 不好的地方消耗性能握手和揮手 自定義協(xié)議(拓展知識:ServiceManager.rc比我們的zygote更先執(zhí)行翘鸭,這里執(zhí)行文件的大小順序:core-> main->late_start)
面試題:
1,binder是什么戳葵?原理是什么就乓?
binder是一個虛擬的硬件設(shè)備,它是一個驅(qū)動程序拱烁,也是Android特有的一種通信方式生蚁,它的好處是一次拷貝效率高,把我們的用戶空間戏自,內(nèi)核空間邦投,物理內(nèi)存都映射在了一個地址,這樣它就少了一次拷貝擅笔,也可以參考前期講的集中通信方式管道 進行講講區(qū)別志衣,也可以講講幾個函數(shù)方法比如binder_open binder_mmap binder_ioctl幾個函數(shù)進行講解一下屯援。
2,binder是怎么進行工作的念脯?
這個話題比較大狞洋,參考流程圖進行分析。以命令流的方式進行講解 比如 client binder server之間的關(guān)系圖進行講解和二,如果更專業(yè)的方式就是代碼的調(diào)用流程圖更加的專業(yè)徘铝。
3耳胎,binder是給我們的每個應(yīng)用分配的內(nèi)存是多少惯吕?如果不夠用了怎么辦?
ProcessState.cpp:中會設(shè)置常量大小
binder_vm_size(1M-8k). 的大小怕午。默認給我們每個應(yīng)用是這些
service_manager 比較特殊是128k
如果不夠用了怎么辦废登?我們可以用其它方式的ipc機制,比如說共享內(nèi)存郁惜,socket堡距,可以展開講講幾種的區(qū)別
4,binder的線程數(shù)是多少兆蕉?
16個
5羽戒,其它?