Zircon 内核 IPC 限制

简介

Zircon API 在发送和接收方面是异步的。它要求内核代表发送方缓冲数据,直到接收器能够排空数据。如果发送数据的总速率大于在较长时间内读取数据的速率,那么系统甚至可能会耗尽内核缓冲区来处理关键任务。

经验是,对于(在极少数情况下)返回错误代码(如“重试”)的异步系统,应用处理代码很少是正确的;这些路径很难测试,也很难正确处理:特别是简单的循环重试方法,会将异步服务转换为同步服务,从而导致活锁和死锁。

相反,在针对 Zircon 进行编程时,开发者应假设在运行状况良好的系统中以合理的速率发送 IPC 消息总会成功。反过来,内核会对可以缓冲的数据量实施一些限制,当超过该限制时,调用线程中会针对以下系统调用引发政策异常

确切的限制是按内核对象的每个实例强制执行的,而不是以常量的形式披露给应用,以防止代码依赖这些限制;这些限制可因产品特定考虑因素进一步修改。

应用或库不会处理异常;在大多数情况下,应该执行让异常传播到崩溃分析服务的适当操作。

规避 IPC 限制的策略

概括来讲,主要策略是让每对消耗方和生产方添加和排空缓冲区的速率相等。有许多可能的方案,例如流控制、请求/响应、请求过期、辅助信息文件 VMO 等。最合适的方法取决于服务的性质。