如何做商业推广网站,表格里怎么做链接网站,如何让做的网站自动适应浏览器,常州微信网站制作一#xff0c;zygote通信为什么用socket#xff0c;而不是binder?
1#xff0c;binder通信依赖用户空间进程Servicemanager#xff0c;socket通信不依赖用户空间进程。zygote与servicemanager, surfaceflinger等都是通过各自init.rc文件被init进程解析加载#xff0c;时…一zygote通信为什么用socket而不是binder?
1binder通信依赖用户空间进程Servicemanagersocket通信不依赖用户空间进程。zygote与servicemanager, surfaceflinger等都是通过各自init.rc文件被init进程解析加载时序上无法保证zygote启动时候servicemanager一定加载好了。
2Linux不推荐fork一个多线程的进程的。因为在存在锁的情况下fork容易导致锁异常。如果zygote使用binder作为binder服务端至少有一个线程池要考虑死锁问题。
3如果zygote使用binder通讯机制的话从Zygote中fork出的子进程也会有一块mmap的内存。这块内存无用。socket是使用时候copy_from_user 再copy_to_user虽然两次拷贝但是中间不会产生额外内存。
4如果通信从socket改成binder, 则binder组件需要设计逻辑清理fork出来子进程的服务端实例。除了要修改封装的libbinder库可能binder驱动要增加一套ioctl逻辑。而使用socket就简单了直接在子进程中关闭server socket的句柄, 不影响父进程的server socket。
5framework的确有很多模块从以前的socket换成了binder, 比如lmkd模块。但是zygote逻辑已经稳定了没必要再换。 二为什么system_server需要在zygote中启动而不是由init直接启动
1对于native层面程序的 init.rc 文件里面只要不是one shot 或者disable标签则默认可以在crash后重新启动。而system_server是JAVA代码linux表示看不懂JAVA代码。
2zygote是加载java虚拟机的native进程加载了很多java需要用到的soJAVA环境。如果直接init来启动system_server那么system_server还需要先进行加载java虚拟机的过程。即必要的工作并不会减少那何不在两个进程独立做自己的事情。
3相对来说system_server容易出现watch dog, crash等异常。在它crash之后可以由zygote重新拉起。 三为什么要专门使用zygote进程来孵化应用进程而不是让system_server来进行孵化呢
1Linux不推荐fork一个多线程的进程的。因为如果存在锁的情况下fork会导致锁异常。system_server的线程池不是32就是64, 很容易出问题。
2zygote比较小孵化的子进程有java虚拟机最基本的资源加载。如果JAVA进程是system_server孵化则孵化后的进程都跟system_server一样大臃肿且浪费。
3子进程需要考虑许多父子进程关系的代码逻辑。AMS, PMS等各种服务基本上只能让父system_server进程注册。子进程中这些fork出来的对象要想办法关闭自己并释放内存以免跟父进程各种模块冲突。而zygote fork出来的子进程只要记得关闭server socket即可其他的组件可以根据自己的代码逻辑慢慢创建。