目录
一 Binder框架
参考文章:
Binder的具体机制和原理按看上面两篇文章就差不多了(我们可以多站在大佬们的肩膀上少重复造轮子)在这里我精炼提取一些点做以记录
1.进程隔离:
用户空间和内核空间(虚拟内存)
【这个点很有意思,在32位的app上很容易出现虚拟内存OOM】
2.为什么用binder
前面两篇文章提到过,主要是性能和安全性两方面的考虑.其中性能主要是指Binder只需要一次数据拷贝,比socket这些传统IPC方式的两次拷贝效率高,共享内存虽然不需要拷贝数据,但实现方式又比较复杂
3.主要角色:
Client,Server,ServiceManager,Binder驱动
二 Chromium的IPC机制
这里我先简单介绍一下Chromium的ipc通信机制,以此和Binder可以做一个更好的对比。Chromium虽然只是一个应用,但它却拥有一套自己的IPC机制。
这是为啥呢?因为Chromium是一个多进程应用,其中主要有Browser,Render,GPU等进程。Browser进程可以理解为主进程,而Render负责网页的解析渲染排版啥的。抽象来说Render代表一个tab标签页,即是说你多开一个标签就多起一个Render进程。
Chromium作为一个跨平台的应用(个人觉得它是目前见过的最牛逼的应用,一套代码,可以编译出windows,Android,mac,linux等版本,并且是各种网页浏览的基石),每个平台系统有一套自己的IPC机制,为了规避这些差异,所以Chromium自己本身内部就采用了一套基于Socket的IPC机制。
通过前面的介绍我们大致可以了解到Chromium的一些特点,作为一个APP级别的应用,内部却自成小体系。而Android作为一个系统,Android需要管理很多应用(理论无上限),那么进程数也可以无上限计算,这么多进程的通信效率要求就更高了。
所以回过头来看Binder的架构设计,底层的核心数据传输采用的是 一次拷贝+mmap的数据传输方式,架构上采用C/S模式,所有的进程信息都由ServiceManager来管理,负责地址中转。这样的架构方式就很合理