多进程优点
- App内存扩展
- 风险隔离
进程间通信方式比较
Linux 进程间通信包括: 管道、信号量、socket、共享内存
| Binder | 共享内存 | socket | |
|---|---|---|---|
| 性能 | 需要拷贝一次内存 | 无需拷贝 | 需要拷贝两次内存 |
| 特点 | 基于C/S架构 易用性高 | 控制复杂、易用性差 | 基于C/S架构、传输效率低,开销大 |
| 安全性 | 为每个app分配UID 同时支持实名和匿名 | 依赖上层协议 访问接入点是开放的不安全 | 依赖上层协议 访问接入点是开放的不安全 |
内存拷贝解释
一般的进程间通信:
Binder进程间通信:
mmap
一种内存映射文件的方法。将一个文件或其他对象映射为进程的地址空间,实现文件磁盘地址和进程虚拟内存地址的一一对应关系。
实现这样的映射之后,进程既可以采用指针方式去操作这段内存空间即可,无需再调用read write系统函数去操作磁盘,系统会自动回写脏页面到对应磁盘上。相应的,内核空间对该区域的修改也可以直接反映到用户空间。
简而言之:mmap将磁盘文件映射到进程内存空间中,进程可以直接通过操作内存来操作文件。内存中对数据的修改,磁盘中对应文件也会同步修改;相反磁盘文件内容修改,内存中数据也会有相应修改。不同进程mmap映射到同一个文件时,就可以实现进程间通信。
优点:
1、对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。 (正常的文件操作需要两次数据拷贝,1.用户空间copy至内核空间 2.内核空间copy至磁盘)
2、实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。
3、提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。
4、可用于实现高效的大规模数据传输。内存空间不足,是制约大数据操作的一个方面,解决方案往往是借助硬盘空间协助操作,补充内存的不足。但是进一步会造成大量的文件I/O操作,极大影响效率。这个问题可以通过mmap映射很好的解决。换句话说,但凡是需要用磁盘空间代替内存的时候,mmap都可以发挥其功效。