About IPC

IPC : Interprocess Communication 进程间通信

linux 现有的IPC方式:

  1. 管道: 就是一个缓冲区,在创建时分配一个page(4k)的内存,存入后一次性读取,读完即释放,会阻塞,本质是文件结构

  2. 消息队列:A进程向队列带有类型的数据块,B进程从队列里取该类型的数据块,可以有选择的接收,存在信息复制,有额外的CPU消耗,不适合大信息流通信

  3. 共享内存:两个进程都能访问的内存空间,存在同步问题

  4. 套接字: 传输效率低

  5. 信号量 :一种锁机制,也可以看成是IPC

  6. 信号 :不适用于信息交换, 就是个信号,比如 杀死某个进程

以上通信都不不同程度的缺点和不适应性, android 进程间通信 需要高效、稳定、安全:所以衍生了Binder
(1)从性能的角度 数据拷贝次数:Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅次于共享内存
(2)稳定性 角度: Binder是基于C/S架构的,Client端有什么需求,直接发送给Server端去完成,架构清晰明朗,共享内存实现方式复杂,没有客户与服务端之别, 需要充分考虑到访问临界资源的并发同步问题
(3)传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,通知时候也不知道对面进程是干啥的,就不安全,只有识别出消息来源,才能作权限控制,Android系统中对外只暴露Client端,Client端将任务发送给Server端,Server端会根据权限控制策略,判断UID/PID是否满足访问权限,目前权限控制很多时候是通过弹出权限询问对话框,让用户选择是否运行
(4) 语言层面:Linux是用C写的,面向过程,而Android是 基于Java的面向对象, 故而 通过 Binder绑定了一个进程对象,就可以在别处使用该对象的引用,这样只要权限匹配, 就相当于模糊了进程的边界,更使用于服务间的相互调用。

事实上,android中存在多种IPC机制,比如在Android OS中的Zygote进程的IPC采用的是Socket(套接字)机制,Android中的Kill Process采用的signal(信号)机制等等,Binder多用于系统级的服务与上层APP进程的通信间,既方便调用,符合面向对象习惯,又能控制权限,提高安全性。


Android 常用的IPC方式

  1. Bundle /Intent
  2. 文件: 注意同步
  3. Messager 对象, 基于AIDL实现,通过IBinder 通信,还可通过handler处理数据
  4. AIDL :
  5. ContentProvider :自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的
  6. Socket

android开启多进程的方式就是在四大组件的menifest里加
android: process = ":remote" 或者 android: process = "com.package.name.remote",其中 加 冒号**:表示 该进程是当前应用的私有进程**,其他应用无法与其运行在同一个进程中, 如果不是,可以通过ShareUID的方式, 使其他应用与其运行在同一个进程中.


Serializable中 serialVerisonUID的作用 : 如果不手动指定,系统会根据当前类的成员变量,构造函数等生成一个 string,当进行反序列化时, 会将反序列化得到的id 与这个值进行比对,如果你修改了这个类的成员变量, 那得到的值就不一样了, 就会引发crash, 所以,如果我们指定了这个值,即使你修改了这个类, 反序列化就不会crash了.


AIDL 本质上 是实现Binder的一种工具, android 会把aidl文件翻译成一个java文件, 增加一些模板代码, 如为每个接口分配一个id, 进行序列化的相关操作, 所以AIDL并不是必须的, 只是系统为了
方便使用提供的以一种方式, 我们也可以自己写java文件实现Binder. 而 Messager 又是对AIDL做了一层封装, 使用更加方便而已


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值