在对齐的内存缓冲区中为capnp FlatArrayMessageReader接收zmq消息

问题描述 投票:1回答:1

我正在使用PUB/SUB序列化tcp://消息后,使用capnp传输类通道通过ZeroMQ capnp::messageToFlatArray原型发送消息。在接收方,我以zmq_msg_t消息的形式接收全部内容。但是zmq_msg_data(&message)返回的存储位置未对齐capnp::word。因此,FlatArrayMessageReader引发了内存未对齐的异常。

简化的代码看起来像这样:

    zmq_msg_t message;
    zmq_msg_init(&message);

    zmq_msg_recv(&message, socket, flags);

    size_t size = zmq_msg_size(&message);
    auto data = zmq_msg_data(&message);
    auto pdata = kj::arrayPtr((const capnp::word*)data, size / sizeof(capnp::word));
    capnp::FlatArrayMessageReader msg = capnp::FlatArrayMessageReader(pdata);  // exception

什么是在不复制整个缓冲区的情况下对齐数据的好方法?还是有没有办法在字对齐的内存中接收消息而不会降低性能-例如在zmq中禁用零复制?

尝试使用Capnp版本0.7.0,zeromq版本4.3.2和gcc 7.4.0的ubuntu 18.04。

c++ zeromq capnproto
1个回答
0
投票

Q什么是在不复制整个缓冲区的情况下获取数据aligned的好方法?

好吧,鉴于ZeroMQ(按原样)是基于自主运行的Context()实例引擎,出于相同的性能动机,它已经保证了消息的零复制权,即出于消息的存储位置由Context()内部策略确定,该内部策略不“看到”,capnp首选项的“服从”程度越小。

除非一个人重构不仅[zmq_msg_init() per-se,还要重构ZeroMQ内部所有与性能相关的内部动机,以便从外部“强制”和“保持”某种形式的(这里capnp为动机,导致示例性的[[“利益冲突”] >>)更高级别的灌输内存管理(对齐分配,重用和释放策略),希望能够从已经成熟,聪明,苗条(按原样)且尺寸合适,功能恰到好处的工具中获得预期的零机会,该工具旨在提供快速,最小延迟但几乎线性的可扩展消息传递/信号工具。

Q

有没有一种方法可以在字对齐的内存中接收消息而不会降低性能-像disabling zmq中的零副本?

[AFAIK,从来没有在发布的API上实现过这样的配置

(自v2。+到2020年1月的v4.3,直到v4.3)]]。[可以尝试使用注释来扫描源代码,在这些注释中似乎已经放置了任何此类技巧。

© www.soinside.com 2019 - 2024. All rights reserved.