一、进程通信本质
不同App之间在内存中申请的内存是相互隔离的,要想App之间数据交互必须要进行进程间通信
二、 Linux常用的通信机制
- 管道通信:A进程-copy from user->管道Linux内核->copy to user->B进程。发生两次拷贝效率不高,点对点通信比较安全。
- 共享内存:A、B进程共享一块Linux内核。效率高速度快,不安全。
-
Socket通信:Client-Service 需要用户和内核cpu状态切换,需要进行两次拷贝,基于端口套接字传输。效率最低
-
File通信文件磁盘通信。不安全
-
Binder通信:一次拷贝的安全通信机制 A,B 进程通过内核进行数据传输,内存不共享,并且需要验证appid。安全高效
-
各种通信优缺点
三、Binder通信
内核空间、用户空间
区分的意义:内核是系统代码,是需要长期稳定运行,不能因为用户空间崩溃导致整个系统崩溃,必须进行隔离。
1、内核空间
- 进程号为0的进程,一个系统只有一个内核进程
- 系统、内核、驱动等运行的空间。
- android 蓝屏少的原因是,所有的驱动都是出场后由厂商已经定制好了不像window随混装,常见的驱动 蓝牙驱动、Binder驱动、屏幕驱动 ...
- 查看方式 adb shell --> ps
2、用户空间
- 用户App 运行空间,App崩溃不会导致整个系统崩溃
三、物理地址与虚拟地址
- 系统内存有限 :512M、1G、2G、4G、8G 无法达到无法同时加载很多应用。如同时运行100个应用 ,每个500M.
- 程序运行有局部性原则,活跃代码(某一很小时间段只有很少一部分代码会被cpu执行)很少,如500M的程序,当前正在运行代码量可能只有1M。
- 提高CUP同时运行App的利用率,需要使用虚拟内存去对物理内存进行管理,变相使CPU认为程序被整个加载到内存单元
- MMU管理本质:本应该加入到内存中而因非活跃而没有加入到内存中的代码,当CPU需要运行的时候,先经过MMU判断是否被加载到内存,没加入到磁盘中寻找并加入到内存中。
- 磁盘有高速缓存,因此磁盘和内存交互并不慢
- 物理地址、虚拟地址、MMU关系
- MMU 运行原理
- 一页 4K
- MMU 将mmap 开辟的物理地址转换成虚拟地址进行对应
- binder进程通信1M-8K 原因 1、需要头部信息:进程信息等需要留8k左右出来,剩下的才能用来进行进程交互 2、binder只是用来进行进程间交互的不许哟啊开辟太大空间
- 三种状态:未分配、未缓存、已缓存
- 未分配 有效位为0 并且物理页号为null 此时需要使用mmap从磁盘进行开辟物理空间写入并且写入物理页中,
- 未缓存 mmap开辟了物理空间还未将数据缓存到内存中,此时需要做的就是进行数据缓存
- 以缓存 有效位标志为1 此时表示已经将代码数据缓存到内存 可以直接进行操作,并且内存与磁盘建立好了链接