Zygote进程通信为什么用Socket而不是Binder?(3)
导读:Zygote进程通信为什么用Socket而不是Binder,Binder是一种基于内核驱动的进程间通信机制,它通过驱动程序实现进程间的数据传输。Binder使用C/S架构,包括服务端和客户端,通过Binder驱动在内核空间中
Zygote进程通信为什么用Socket而不是Binder
- Socket适用于网络通信场景,可以在不同设备或同一设备的不同进程之间进行通信。常见的应用包括网络传输、远程过程调用(RPC)等。
- Binder适用于Android系统内部的进程间通信场景,主要用于应用程序组件之间的通信,如Activity与Service之间的通信、跨进程的数据共享等。
- Socket通信的性能相对较高,但在跨设备通信时需要考虑网络延迟和带宽等因素。同时,Socket通信需要进行网络权限的申请和管理,可能存在一定的安全风险。
- Binder通信的性能相对较低,但在同一设备内部的进程间通信时具有较高的效率。同时,Binder通信在Android系统中有较好的安全性,可以通过权限控制和进程隔离来保护系统的安全性。
综上所述,Socket适用于网络通信场景,而Binder适用于Android系统内部的进程间通信场景。在选择通信机制时,需要根据具体的应用场景和需求进行选择。
Zygote进程为什么用Socket而不是Binder?
- 先后时序问题:Binder驱动是早于init进程加载的。而init进程是安卓系统启动的第一个进程。安卓中一般使用的Binder引用,都是保存在ServiceManager进程中的,而如果想从ServiceManager中获取到对应的Binder引用,前提是需要注册。init进程是先创建ServiceManager,后创建Zygote进程的。虽然Zygote更晚创建,但是也不能保证Zygote进程去注册binder的时候,ServiceManager已经初始化好了。注册时间点无法保证,AMS无法获取到Zygote的binder引用。
- 多线程问题:Linux中fork进程是不推荐fork一个多线程的进程的,因为如果存在锁的情况下,会导致锁异常。而如果自身作为Binder机制的接收者,就会创建一个额外的线程来进行处理(发送者进程是无影响的)。所以,如果使用Binder机制,就会导致去fork一个多线程的进程。
- 效率问题:AMS和Zygote之间使用的LocalSocket,相对于网络Socket,减少了数据验证等环节,所以其实效率相对于正常的网络Socket会大幅的提升。虽然还是要经过两次拷贝,但是由于数据量并不大,所以其实影响并不明显。
- Binder拷贝问题:如果使用Binder机制的话,从Zygote中fork出子进程会拷贝Zygote中Binder对象。从而多占用了一块无用的内存区域。而Binder对象不能释放。Binder的特殊性在于其是成对存在的,其分为Client端对象和Server端对象。假设我们使用Binder,如果要释放掉Server端Binder引用对象,就必须释放掉AMS中的Client端Binder对象,那这样就会导致AMS失去Binder从而无法正常向Zygote发送消息。而使用Socket通讯的话,fork出APP进程之后,APP进程会去主动的关闭掉这个Socket,从而释放这块区域。使用Binder会造成额外的内存占用。
相关阅读
-
企业公司网站如何建立 注册公司网上申请入口
今天介绍企业公司网站如何建立和注册公司网上申请入口的教程内容,接下来IT袋带大家一起了解。 公司想要建设一个网站,但是不知道具体要怎么做,需要准备什么资料,针对这个问题,I
-
网络技术之接入层特点以及典型设备
全面的为大家介绍网络技术之接入层特点以及典型设备的介绍,接下来小编为网友介绍。 接入层(也称为边缘层)是网络的最外层,它负责连接终端用户设备,如电脑、手机和其他网络设备。
-
web动态网页设计步骤 web前端网页设计代码
本文为您带来的是web动态网页设计步骤和web前端网页设计代码方面的知识,请看下面详细的介绍。 每天我们打开电脑,看到各种各样的web前端页面。你知道他们是如何制作的吗?为了让页面更
-
首选dns的服务器地址是多少 手动设置IP地址和DNS
一篇IT技术小知识,为您介绍首选dns的服务器地址是多少和手动设置IP地址和DNS方面的知识,一起跟随小编看看吧! 现在IPV6现在离我们越来越近了,我们很多地方的网络运营商已经提供IPv6的网


