前言
binder是Android的一套進程間通信框架,用來跨進程發(fā)送消息构舟,同步和共享內(nèi)存灰追。
1.進程間通信
進程間通信IPC,Inter-process communication狗超。目前已有的進程間通信方式弹澎,
(圖源https://blog.csdn.net/u013309870/article/details/105328743)
進程間通信方式
1.Socket: 使用套接字,使用網(wǎng)絡(luò)方式進行進程間通信努咐,性能較差苦蒿,存在讀取阻塞
2.File文件系統(tǒng):存在io問題
3.共享內(nèi)存:存在不安全問題
4.管道Pipe: 每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數(shù)據(jù)必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進程A把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進程B再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機制稱為進程間通信渗稍。
不同進程間的通信本質(zhì):進程之間可以看到一份公共資源佩迟;而提供這份資源的形式或者提供者不同,造成了通信方式不同竿屹,而 pipe就是提供這份公共資源的形式的一種报强。
2. Binder的原理
Binder是一種特殊的管道。
傳統(tǒng)的管道模型中拱燃,數(shù)據(jù)需要從進程1中秉溉,拷貝到內(nèi)核當中,再從內(nèi)核中拷貝到進程2中,存在兩次拷貝操作坚嗜。
而Binder在管道模型上更加優(yōu)化夯膀,只進行一次拷貝。
https://mubu.com/doc/explore/21079
在服務(wù)端service苍蔬,在內(nèi)核空間和用戶空間的數(shù)據(jù)緩存之間做了一層內(nèi)存映射诱建,減少了一次拷貝。這種映射是通過MMAP來實現(xiàn)的碟绑。