我是靠谱客的博主 激昂鸡,最近开发中收集的这篇文章主要介绍聊聊ZeroMQ的专业术语“零拷贝“,以及内存泄漏处理、消息丢失处理一、ØMQ的零拷贝二、内存泄漏处理三、消息丢失处理,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、ØMQ的零拷贝
- 零拷贝:ØMQ的消息API可让你直接从应用程序缓冲区发送和接收消息,而不用复制数据。我们称之为“零拷贝”,并且可以在某些应用程序中用它来提高性能
- 零拷贝使用zmq_msg_init_data()来实现,一般不建议使用该函数,因为使用不好可能会带来内存泄漏
- zmq_msg_init()函数介绍参阅:https://blog.csdn.net/qq_41453285/article/details/106794294
- zmq_msg_init()演示案例:要做到零拷贝,你可以使用zmq_msg_init_data()创建一个消息,它指向在堆上分配的内存块,之后你可以调用zmq_msg_send()将数据发送出去。当你使用zmq_msg_init_data()创建消息时可以在第四个参数传递一个函数,用来释放堆上分配的内存块。代码如下:
void my_free(void *data, void *hint)
{
free(data);
}
char *buffer = (char*)malloc(1000);
zmq_msg_t msg;
zmq_msg_init_data(&msg, buffer, 1000, my_free, NULL);
zmq_msg_send(socket, &msg, 0);
- 在接收时无法做到零拷贝:ØMQ传递给你一个缓冲区,你可以一直在其中存储数据,但它不会将数据直接写入应用程序的额缓冲区
- 在写入方面,ØMQ的多部分消息能与零拷贝很好地合作:
- 在传统的消息传递中(非ØMQ技术下),你就需要调度各个不同的缓冲区,将它们一起放入一个你可以发送的缓冲区。这意味着需要复制数据
- 使用ØMQ,你可以将不同来源的多个缓冲区作为单独的消息帧发送(多部分消息),每个字段作为一个用长度分隔的帧发送。对于应用程序,它看起来像一系列的发送和接收调用,但在内部,多个部分是使用单个系统调用写入到网络上并读回的,所以它是非常高效的
二、内存泄漏处理
- 如果你的ØMQ程序是使用C/C++程序编写的,那么就可能存在内存泄漏的情况
- 在这里推荐一个内存泄漏的工具valgrind,详细可以参阅:https://blog.csdn.net/qq_41453285/article/details/106845520
三、消息丢失处理
- 在使用ØMQ编写应用程序时,你会不止一次地遇到这问题:你期望得到的消息丢失了
- 我们用下面一张图来遍历产生这种情况的最常见的原因:
- 如果你在失败要付出昂贵代价的上下文中使用ØMQ,那么要好好规划以避免失败的发生:
- 首先,构建一个让你学习和测试你的设计的不同方面的原型。对它们施加压力,直到它们崩溃,以让你知道你的设计究竟有多强大
- 第二,投资于测试。这意味着建立测试框架,以确保你能够获得具有足够计算能力的逼真设置,并抽出宝贵的时间,或借助其他力量,来严肃地进行实际测试。理想的情况是,一个团队写代码,另一个团队努力破坏它
- 最后,务必让你的组织联系iMatix来讨论问题,并且如果它们出故障了,能够迅速被修复
- 总之,如果你还没有证明某个框架能在现实条件下工作,那么它很可能会在最糟糕的时候崩溃。
- 我是小董,V公众点击"笔记白嫖"解锁更多【ZeroMQ】资料内容。
最后
以上就是激昂鸡为你收集整理的聊聊ZeroMQ的专业术语“零拷贝“,以及内存泄漏处理、消息丢失处理一、ØMQ的零拷贝二、内存泄漏处理三、消息丢失处理的全部内容,希望文章能够帮你解决聊聊ZeroMQ的专业术语“零拷贝“,以及内存泄漏处理、消息丢失处理一、ØMQ的零拷贝二、内存泄漏处理三、消息丢失处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复