进程隔离:
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据 为了保证系统的安全,用户空间和内核空间是天然隔离的 每个进程有自己的虚拟内存空间,为了安全,每个进程只能操作自己的虚拟内存空间,只有操作系统才有权限操作物理内存空间

Binder的一次拷贝发生在用户空间拷贝到内核空间;
用户空间: App进程运行的内存空间;
内核空间: 系统驱动、和硬件相关的代码运行的内存空间,也就是进程ID为0的进程运行的空间;
程序局部性原则: 只加载少量代码;应用没有运行的代码放在磁盘中,运行时高速缓冲区进行加载要运行的代码;默认一次加载一个页(4K),若不够4K就用0补齐;
MMU:内存管理单元;
给CPU提供虚拟地址;
当对变量操作赋值时:


页命中:CPU读取变量时,MMU在物理内存的页表中找到了这个地址;
页未命中:CPU读取变量时,MMU在物理内存的页表中没有找到了这个地址,此时会触发MMU去磁盘读取变量并存到物理内存中;
普通的二次拷贝:
应用A拷贝到服务端:coay_from_user
从服务端拷贝到应用B:coay_to_user
mmap():
共享内存进程通信:
角色:Server端A、Client端B、Binder驱动、内核空间、物理内存

Activity跳转时,最多携带1M-8k(1兆减去8K)的数据量;
真实数据大小为:1M内存-两页的请求头数据=1M-8K;
应用A直接将数据拷贝到应用B的物理内存空间中,数据量不能超过1M-8K;拷贝次数少了一次,少了从服务端拷贝到用户;
IPC通信机制:
以下为简单的主进程和子进程通信:
1、服务注册: 缓存中心中有三张表(暂时理解为三个HashMap,Binder用的是native的红黑树):
类的方法集合:key-value;
key:方法签名:“方法名” 有参数时用 “方法名-参数类型-参数类型-参数类型…”;
value: 方法本身;
注册后,服务若没被调用则一直处于沉默状态,不会占用内存,这种情况只是指用户进程里自己创建的服务,不适用于AMS这种;
2、服务发现: 当被查询到时,要被初始化;
3、服务调用:
AIDL: BpBinder:数据发送角色 BbBinder:数据接收角色

编译器生成的AIDL的java接口.Stub.proxy.transact()为数据发送处;
发送的数据包含:数据+方法code+方法参数等等;
发送时调用了Linux的驱动
调用copy_from_user()拷贝用户发送的数据到内核空间
拷贝成功后又进行了一次请求头的拷贝:copy_from_user()
也就是把一次的数据分为两次拷贝
请求头:包含了目的进程、大小等等参数,这些参数占了8K
编译器生成的AIDL的java接口.Stub.onTransact()为数据接收处;
Binder中的IPC机制:
ServiceManager维持了Binder这套通信框架;
OOM。
Android进程是运行在系统分配的虚拟地址空间,虚拟地址空间分为用户空间和内核空间。多进程间,用户空间不共享,内核空间共享,进程间通过共享的内核空间通信。
1.传统的IPC方式:socket,内存共享。
2.Android特有的方式:Binder。
Binder相对其他IPC方式优点/为什么使用Binder?
1.性能:
A.Socket传输数据的过程:两次拷贝

B.Binder传输数据的过程:一次拷贝

内存映射:MMAP(memory map)
虚拟内存和物理内存
虚拟内存映射到物理内存,物理内存存储数据。
2.易用性
3.安全性
Android C/S通信机制
Binder机制的关键概念
Binder在Android CS通信机制中起到的作用



AIDL和Binder的关系? AIDL封装了Binder,AIDL调用Binder
Android 面试题锦:https://qr18.cn/CKV8OZ
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo