Android-zygote进程通信为啥不使用Binder?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-zygote进程通信为啥不使用Binder?相关的知识,希望对你有一定的参考价值。

参考技术A 首先,zygote进程在创建之后,才会创建SystemServer进程,而SystemServer进程是由zygote进程fock自身得到的,在fock自身的过程中,首先会结束自身的其他子线程,这样一来除了自身线程以外,其他线程都会被结束然后GC,而Binder是多线程模型,如果使用Binder进行进程间通信的话,则Binder线程也会被结束,而使用Binder进行进程间通信就无法做到。在fork新进程后,启动Zygote的4个Daemon线程,java堆整理,引用队列,以及析构线程。而在zygote通过fock自身创建子进程之后,如果该进程不是zygote进程,则会调用ZygoteInit.zygoteInit方法

而在zygoteInit方法中,才会对新创建的进程进行运行环境初始化工作以及启动Binder线程池。
其实Binder线程池的启动,是在SystemServer进程创建过程启动的,而在启动SystemServer的过程中,就需要传入ZygoteServer这个Zygote作为Server端的Socket,所以Zygote进程并不能使用Binder进程进行通信,而只能使用Socket。

而且,Binder线程池是在zygote进程启动之后启动的SystemServer进程中启动的,而SystemServer进程是由zygote进程fock自身得到的,所以zygote进程在启动之后,循环等待SystemServer进程的消息的时候,其实还没有Binder线程池。而且fock只支持当前线程的fock,而不支持多线程的fock,但是Binder又是一个多线程模型,在fock的时候会杀死多余的线程,这样一来,binder线程也就会被杀死,这样就没办法使用binder与SystemServer进程进行进程间通信。

fork 的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度很快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的

为啥 BigQuery BI 引擎不使用所有预留?

【中文标题】为啥 BigQuery BI 引擎不使用所有预留?【英文标题】:Why BigQuery BI engine does not use all the reservation?为什么 BigQuery BI 引擎不使用所有预留? 【发布时间】:2020-03-03 06:15:24 【问题描述】:

我有一个连接到 BigQuery 表的仪表板,BI 引擎按预期工作,因为我正在使用日历过滤器,并且我的表按日期分区。 当我选择更长的日期范围时,BI 引擎停止处理此消息“表或数据量大于 BI 引擎此时支持的”,这是公平的。

请注意,我已经按分区过滤,但有时,我需要查看整个数据

为了解决这个问题,我创建了一个 BI 预留,我注意到无论大小为 1、2、4 GB,使用的内存总是 600MB?我收到了同样的信息,我在此处附上了屏幕截图,这是设计使然吗?

在这里报告错误:https://issuetracker.google.com/issues/150633500

【问题讨论】:

试试这个问题的答案***.com/q/58276712/132438 我当然试过了,几个月前我报告了这个错误:) 【参考方案1】:

原来这个错误与预留无关,而是因为BI引擎只支持500个分区,我的表有更多

https://cloud.google.com/bi-engine/docs/overview#limitations

解决方案不是每天分区,我会使用周或月之类的东西

【讨论】:

以上是关于Android-zygote进程通信为啥不使用Binder?的主要内容,如果未能解决你的问题,请参考以下文章

为啥与多个 Popen 子进程一起使用时会出现通信死锁?

管道通信为啥比共享内存效率低

Android进程通信之Messenger&AIDL使用详解

使用 socketpair 进行双向通信:挂起子进程的读取输出

为啥线程在进程间通信期间会破坏命名管道?

在 OS 中,为啥可加载内核模块 (LKM) 不需要调用消息传递来进行通信?