传统进程间通讯
两次 copy 数据:管道 、 消息队列、信号 、 socket
管道 pipe
匿名管道,常常用于父进程和子进程之间通讯; 有名管道可以跨进程通讯
消息队列 messager
信号 signal 跟广播很像
套接字 socket
减少数据拷贝通信方式对比
共享内存
开辟一个内存区域,两个进程都可以访问,处理和控制复杂,需要处理并发的问题;
Parcel.java 可以作为 内存共享 和 Binder 的载体;
Binder
发送端 client 使用 binder 发送数据时在内核中获取 pid 放入到 copy 的数据包中, 然后给 server 进行身份识别;
-
所以每一个 binder 都会有 mmap 对应的内核空间和自己进程空间的映射,还有一个物理内存做为载体; 所以在拿数据不需要 copy;
-
发送数据时需要一次 copy 数据到指定 server binder 映射的内核空间区域;
传统IO
-
虚拟内存被操作系统分为两块:用户空间和内核空间,用户空间时用户程序代码运行的地方,
-
内核空间是内核代码运行的地方,内核空间由所有进程共享。 为了安全,他们是隔离;
传统 IO SharePrefence 使用方式: