分配器
每个异步代理都有一个相关的分配器。代理的分配器是一个接口,供代理的异步操作获取每个操作的稳定内存资源(POSM)。这个名称表明内存是每操作专属的,因为内存只在该操作的生命周期内保留,并且是稳定的,因为在整个操作过程中保证该位置的内存可用。
异步操作可以通过多种不同方式使用POSM:
操作不需要任何POSM。例如,该操作封装了一个现有的API,该API执行自己的内存管理,或者将长期状态复制到现有内存中,例如循环缓冲区。
操作在整个执行期间使用一个固定大小的POSM。例如,操作将一些状态存储在链表中。
操作使用一个运行时大小(Runtime-Size)的POSM。例如,操作存储用户提供的缓冲区副本,或运行时大小的 iovec 结构数组。
操作同时使用多个POSM。例如,一个链表的固定大小POSM加上一个缓冲区的运行时大小POSM。
操作按顺序使用多个POSM,其大小可能不同。
相关的分配器允许用户将POSM优化视为异步操作组合的一个横切关注点。此外,使用分配器作为获取POSM的接口,为异步操作的实现者和用户提供了相当大的灵活性:
用户可以忽略分配器,接受应用程序采用的任何默认策略。
实现者可以忽略分配器,特别是当操作不被认为是性能敏感时。
用户可以将相关异步操作的POSM进行同址化处理,从而提高引用的局部性。
对于包含不同大小的串行POSM的组合,内存使用量只需与当前存在的POSM一样大。例如,考虑一个组合,其中包含使用大POSM的短期操作(如连接建立和握手),接着是使用小POSM的长期操作(如与对等方之间的数据传输)。
正如之前所提到的,在调用完成处理程序之前,所有资源都必须释放。这使得内存可以在代理内的后续异步操作中回收使用。这样,即使用户代码不了解相关的分配器,应用程序中长期存在的异步代理也可以避免热路径内存分配。
See Also
Last updated