好文章 :https://juejin.cn/post/6844903955177144333
Zygote main 函數(shù)四件事,
1.注冊(cè)socket服務(wù)端
2.預(yù)加載資源
3.fork systemserver
4.runSelectLoop等待客戶端連接
參考:https://zhuanlan.zhihu.com/p/430557625
Linux下傳統(tǒng)通信原理。IPC
進(jìn)程空間分為:用戶空間 內(nèi)核空間。
用戶空間給上層應(yīng)用很實(shí)用,內(nèi)核空間給系統(tǒng)實(shí)用。當(dāng)用戶空間需要使用內(nèi)核空間的內(nèi)容時(shí),(例如文件讀寫(xiě),訪問(wèn)網(wǎng)絡(luò))就需要借助系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)任務(wù)處于內(nèi)核代碼執(zhí)行中,就會(huì)處于內(nèi)核運(yùn)行態(tài),此時(shí)處理器處于特權(quán)級(jí)。(當(dāng)前進(jìn)程使用內(nèi)核態(tài)時(shí),會(huì)使用當(dāng)前用戶態(tài)的進(jìn)程。)。當(dāng)使用IPC通訊時(shí),消息發(fā)送方會(huì)先把數(shù)據(jù)復(fù)制到內(nèi)核空間的一塊內(nèi)核緩存區(qū),然后內(nèi)核程序再將數(shù)據(jù)從內(nèi)核區(qū)域復(fù)制到消息接收方開(kāi)辟的一塊緩存區(qū)。完成通訊。(兩次copy)
Binder機(jī)制。
首先依賴于Linux的動(dòng)態(tài)內(nèi)核可加載模塊,android系統(tǒng)動(dòng)態(tài)的添加一個(gè)內(nèi)核模塊到內(nèi)核空間。這個(gè)內(nèi)核模塊就是BINDER驅(qū)動(dòng)。
Binder驅(qū)動(dòng)采用mmap內(nèi)存映射的方式,(就相當(dāng)于一個(gè)等價(jià),一邊修改,另一半也收的到改動(dòng)。)。當(dāng)使用BINDER跨進(jìn)程通訊時(shí),會(huì)在內(nèi)核態(tài)開(kāi)辟一個(gè)內(nèi)核緩存區(qū),還有一個(gè)數(shù)據(jù)緩存區(qū)域。在內(nèi)核態(tài)中,
binder機(jī)制:服務(wù)端會(huì)通過(guò)MMAP機(jī)制,將服務(wù)端空間跟內(nèi)核空間建立映射,當(dāng)修改其中一邊時(shí),另一邊都會(huì)感知。然后客戶端還是需要把數(shù)據(jù)復(fù)制到內(nèi)核空間。一次復(fù)制。
//https://mp.weixin.qq.com/s/S7lGxGZApgqFTuRCMIKhJA
Binder機(jī)制雖然是調(diào)用了mmap函數(shù),但它是只有服務(wù)端才會(huì)產(chǎn)生映射,客戶端仍然需要copy數(shù)據(jù)到內(nèi)核空間(Binder驅(qū)動(dòng))里,此時(shí)內(nèi)核空間和服務(wù)空間同時(shí)映射了一塊共享內(nèi)存區(qū)域,而這塊區(qū)域使用了mmap函數(shù),因?yàn)檫@塊區(qū)域跟物理內(nèi)存產(chǎn)生了映射,所以內(nèi)核空間和服務(wù)空間各自在這個(gè)區(qū)域做操作,雙方都會(huì)感知到,這樣服務(wù)端也就不用產(chǎn)生拷貝操作了。