好文章 :https://juejin.cn/post/6844903955177144333
Zygote main 函数四件事,
1.注册socket服务端
2.预加载资源
3.fork systemserver
4.runSelectLoop等待客户端连接
参考:https://zhuanlan.zhihu.com/p/430557625
Linux下传统通信原理。IPC
进程空间分为:用户空间 内核空间。
用户空间给上层应用很实用,内核空间给系统实用。当用户空间需要使用内核空间的内容时,(例如文件读写,访问网络)就需要借助系统调用来实现。当一个任务处于内核代码执行中,就会处于内核运行态,此时处理器处于特权级。(当前进程使用内核态时,会使用当前用户态的进程。)。当使用IPC通讯时,消息发送方会先把数据复制到内核空间的一块内核缓存区,然后内核程序再将数据从内核区域复制到消息接收方开辟的一块缓存区。完成通讯。(两次copy)
Binder机制。
首先依赖于Linux的动态内核可加载模块,android系统动态的添加一个内核模块到内核空间。这个内核模块就是BINDER驱动。
Binder驱动采用mmap内存映射的方式,(就相当于一个等价,一边修改,另一半也收的到改动。)。当使用BINDER跨进程通讯时,会在内核态开辟一个内核缓存区,还有一个数据缓存区域。在内核态中,
binder机制:服务端会通过MMAP机制,将服务端空间跟内核空间建立映射,当修改其中一边时,另一边都会感知。然后客户端还是需要把数据复制到内核空间。一次复制。
//https://mp.weixin.qq.com/s/S7lGxGZApgqFTuRCMIKhJA
Binder机制虽然是调用了mmap函数,但它是只有服务端才会产生映射,客户端仍然需要copy数据到内核空间(Binder驱动)里,此时内核空间和服务空间同时映射了一块共享内存区域,而这块区域使用了mmap函数,因为这块区域跟物理内存产生了映射,所以内核空间和服务空间各自在这个区域做操作,双方都会感知到,这样服务端也就不用产生拷贝操作了。