android Binder的优点
Linux进程间通信的方式:
管道(Pipe)
信号(Signal)
消息队列(Message)
共享内存(Share Memory)
套接字(Socket)
中断
Binder
Binder 介绍:
Binder 通信机制是在OpenBinder的基础上实现的,采用CS通信方式。 OpenBinder是一种进程间通信机制,它最初是由Be公司开发的,后来由Palm公司接手开发和维护,最后Google公司对其进行改造,并应用在Android系统中
1、系统服务是用过getSystemService获取的服务,应用程序服务是通过继承Service,程序员自己创建的
2、Android的SDK中提供了aidl工具,该工具可以讲aidl文件转换为一个java类文件;例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。
3、前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口
4、前台进程实际上市通过Proxy实现的IServer接口方法,将方法名、参数传递给后台服务进程。
5、我们还需要继承Service,创建自己的后台服务进程,并且在其中实现IServer接口类,提供IServer的具体服务。并实现Service的onBind方法。
优点:
1、安全,传统的IPC(套接字、管道、消息队列)的安全机制依赖上层协议;例如:
a、Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。
b、传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。
c、使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用,故可靠的身份标记只有由IPC机制本身在内核中添加。
d、其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system V的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
2、性能高:传统的IPC(套接字、管道、消息队列)需要拷贝两次内存、Binder只需要拷贝一次内存、共享内存不需要拷贝内存。
信号:
1、信号在最早的Unix系统中引入,用于在用户态进程间通信;内核也用信号通知进程系统所发生的事件。
2、信号是很短的消息。
3、信号可以发送到一个进程活着一组进程。
4、信号通常是由前缀SIG的宏标识的数字
使用信号的目的:
1、让进程知道已经发生了一个特定的事件
2、强迫进程执行它自己代码中的信号处理程序。(例如:子进程终止时发送给父进程的信号SIGCHLD)
消息队列:
1、分为System V IPC 消息队列和POSIX 消息队列
2、基于文件的应用接口(mqueue的特殊文件系统,一个队列对应一个索引节点)
3、完全支持消息优先级
4、完全支持消息到达的异步通知,通过信号或者线程创建实现
5、用于阻塞发送与接收操作的超时机制。
6、小块数据
管道:
1、所有Linux系统都愿意提供的一种进程间通信机制
2、是进程之间的单向数据流;从一个进程写入的所有数据,由内核定向到另一个进程读取;例如(ls | more === ls >temp ; more < temp)前者使用管道,后者使用临时文件
3、被看作打开文件,在文件系统中没有相应的映像。
4、半双工的;PS:Unix系统支持全双工的管道
5、父进程的管道可以通过fork给子进程使用
6、缺点是,除非是同一个父进程创建的管道,否则两个进程无法共享同一个管道。即:无法打开一个已经存在的管道。
7、为了解决上述6中的问题,采用了命名管道
FIFO:
1、先进先出,先写入文件的字节总是被最先读出;
2、使用特殊的文件类型,在文件系统中不拥有磁盘块,打开的FIFO总是与内核缓冲区关联(存放多个进程之间交换的数据)。
3、Linux2.6 中 FIFO和管道基本相同,使用相同的数据结构(pipe_inode_info)
区别:
1、FIFO索引节点出现在系统目录树上,而不是pipefs特殊文件系统
2、FIFO是一种双向通信管道;即可以以读、些模式打开一个FIFO,而管道时单向的
共享内存:
1、
套接字:
1、android zygote 创建App进程,就是通过监听本地Socket,接收服务进程的命令来实现的
2、使用特殊的文件
3、双向通信
4、不依赖父进程,只要知道套接字名称,就可以使用
中断:
1、是一个事件,对应CPU芯片内外部硬件电路产生的电信号。
2、分为同步中断(指令执行结束,CPU控制单元产生并且发出的中断)、异步中断(其他硬件设备按照CPU时钟信号随机产生)
3、分为上半步(接收中断)、下半步(处理中断,比较费时);