Binder 理解 专栏 (一):Linux内存基础

118 阅读3分钟

一、进程通信本质

不同App之间在内存中申请的内存是相互隔离的,要想App之间数据交互必须要进行进程间通信

image.png

二、 Linux常用的通信机制

image.png

  • 管道通信:A进程-copy from user->管道Linux内核->copy to user->B进程。发生两次拷贝效率不高,点对点通信比较安全。 image.png
  • 共享内存:A、B进程共享一块Linux内核。效率高速度快,不安全。

image.png

  • Socket通信:Client-Service 需要用户和内核cpu状态切换,需要进行两次拷贝,基于端口套接字传输。效率最低

  • File通信文件磁盘通信。不安全

  • Binder通信:一次拷贝的安全通信机制 A,B 进程通过内核进行数据传输,内存不共享,并且需要验证appid。安全高效 1700360089222.png

  • 各种通信优缺点 image.png

三、Binder通信

image.png

内核空间、用户空间

区分的意义:内核是系统代码,是需要长期稳定运行,不能因为用户空间崩溃导致整个系统崩溃,必须进行隔离。

image.png

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关系

image.png

  • MMU 运行原理
  • 一页 4K
  • MMU 将mmap 开辟的物理地址转换成虚拟地址进行对应
  • binder进程通信1M-8K 原因 1、需要头部信息:进程信息等需要留8k左右出来,剩下的才能用来进行进程交互 2、binder只是用来进行进程间交互的不许哟啊开辟太大空间
  • 三种状态:未分配、未缓存、已缓存
  • 未分配 有效位为0 并且物理页号为null 此时需要使用mmap从磁盘进行开辟物理空间写入并且写入物理页中,
  • 未缓存 mmap开辟了物理空间还未将数据缓存到内存中,此时需要做的就是进行数据缓存
  • 以缓存 有效位标志为1 此时表示已经将代码数据缓存到内存 可以直接进行操作,并且内存与磁盘建立好了链接

image.png

image.png