1.进程间通讯的原因
目前操作系统都使用虚拟存储技术,管理内存。
假设是32位机器,0-3G是用户空间,3-4G是系统使用。虚拟内存和逻辑内存都按4K分页。这样虚拟内存和逻辑内存就存在对应关系。
一个进程只能操作自己的内存,无法直接访问其他的进程的物理页。
系统进程可以访问所有的物理应用空间。
进程通讯的本质是数据段交互。
2.进程间通讯的方式
操作系统提供一种共享内存的方式来进行通讯。
可以把2个进程的一块虚拟内存,映射为同一个物理地址,这样数据就可以交互,但是不同进程需要自己控制读写,管理起来很麻烦。
还有一种方式就是,共享同一块kernel内存,这样,通过这块kernel可以交互数据,于是我们把kernel当作数据交互的媒介。
3.用户和内核空间的通讯
1.系统调用:系统调用是内核提供给应用程序的接口。应用对底层硬件的操作大部分都是通过系统来完成的。
2.netlink,使用socket API就可以进行。
3.Procfs:是比较老的一种交互方式。
4.Sysctl:是一种用户应用来设置和获得运行时的内核配置参数的一种有效方式。
4.Android 进程间通信---binder
Why Binder?
常见的Linux的进程间通信机制。
1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限;
2. 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;
Android内核也是基于Linux的,难道那么多的linux社区优秀工程师没有想到binder这样一个优秀的系统吗?事实并非如此。
五个方面阐述android 使用binder机制原因。
1.数据拷贝:binder机制只要一次copy,其他机制需要2次copy,只有共享内存不需要copy内存。
2.稳定性:binder使用经典的C/S架构,client 和Server端相对独立,稳定性好。而共享内存实现方式复杂,同步方式系统不支持,需要自己开发。
3.安全性:linux的IPC机制,是无法指导UID/PID的。从而无法鉴别身份。Android为每个app分配UID。binder基于C/S架构,当client端连接server端的时候,server端回check权限,在android手机上,就会弹出权限确认的框。
4.语言层面:linux是基于C语言的,而andriod是基于面向对象的。binder恰恰是面向对象的,将进程间通信,转化为对另一个进程对象的引用。其独特之处,就是binder对象作为一个可以跨进程引用的对象,它的实体位于一个进程中,而它的引用遍布于各个进程中,大家使用同一个进度对象,就像面向对象的类一样,可以供各个系统使用。binder弱化了进程间通信概念,使得调用就像同一个进程一样。这就把进程间的通信演化为面向对象类的调用,所以binder是为android量身定制的。
5.公司战略考虑。 linux是GPL协议,Google巧妙的把这个协议围在内核层,使得用户层,手机厂商使用Apache-2.0协议,保护了厂商的利益。
一般来说,添加一个IPC机制,需要修改kernel代码,需要liunx分配新的系统编号。所以一般采用虚拟设备的方式,以驱动模块的方式,完成需要在内核完成的功能。
一般设计可以建立一个伪设备来作为应用与内核之间进行数据交换的渠道。最常用的做法是使用伪字符设备,然后通过icotl,mmap,open,read,write,close这些标准的系统调用和这个设备交互。
IPC(inter-process communication)概述:
所有的IPC本质上都是类似的,就是把client端的数据,通过内核空间,传递到另外一个进程Server端。
Binder IPC原理:
Binder回多一个ServiceManager(c++层)来管理所有的server端。所以server端都需要注册到smgr,而client端就需要从smgr获取server端的IBinder对象。
图中的Client,Server,ServiceManager都是通过binder机制进行通信的,所有也就有Client端 & Server端。
注册服务:Server 进程要先进行 注册到Smgr,该过程,Server是客户端,Smgr是服务端。(注册的是什么?)
获取服务:Client 进程要获取Server,需要获取相应的service。(获取的是什么?)该过程:Client端是客户端,Smgr是服务端。
使用服务:Client端得到与Server的信息,建立与Server的通路。这样Client就可以和Server进行通信。
C/S模式:
BpBinder: BpBinder,transact,发送事物信息。
BbBinder: BbBinder,onTransact,接收事物信息。
参考文献:
http://gityuan.com/2015/10/31/binder-prepare/