c - 用于进程内线程通信的posix队列与自定义0复制队列

标签 c linux queue kernel posix

这是一个设计问题。通常,Posix 队列优于任何自定义队列,因为它们经过全面测试,并提供优先级队列等高级功能,这可能是开发的关键。但是,如果我们从INTRA进程通信的角度来分析,如果只是在同一个进程的多个线程共享数据之间使用,那该有多好。一旦识别出发送方和接收方共享相同的地址空间,POSIX 队列是否通过删除不必要的 copy_to_user 和 copy_from_user 来优化其消息传递?

最佳答案

您的队列有两个作用:在线程之间交换数据并同步它们。

显然,您的替代方案是 posix 队列或您自己的队列(使用 pthread 互斥体和用于锁定和同步的条件变量)。

对于进程内通信,交换的数据量并不是真正的问题,因为您总是可以只传输数据的指针(并且约定发送线程是 malloc-接收线程将在消费后释放它。

我猜想(但你必须测量)Posix 队列可能会稍微慢一些,因为它们可能涉及每个操作的系统调用。相比之下,pthread 操作涉及系统调用 ( futex(2) ) 仅用于争用(在非阻塞操作的常见情况下,互斥锁不执行系统调用)。

我不确定内核是否可以优化消息传递以避免 copy_to_user 因为它可能不知道什么时候只有一个进程的队列(它无法预测没有其他进程会 mq_open 相同的队列)。

您还可以在流程内部使用管道(在接收方使用poll)。

但您确实必须进行基准测试。我不确定这是一个大问题。

关于c - 用于进程内线程通信的posix队列与自定义0复制队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160839/

相关文章:

c++ - 我可以在一个程序中混合使用 C 和 C++吗

c# - 寻找 C# 的 System.Text.ASCIIEncoding() 的替代方案

linux - Linux 脚本中 while/case 语句的问题

linux - MySQL 从远程转储到 tar.gz,无需 shell 访问

大小为 1 的 Java BlockingQueue?

c - 开源还是免费软件 C 代码度量工具?

c - 用于进程间通信的 ZeroMQ 套接字类型是什么?

linux - 汇编:为什么跳转到通过 ret 返回的标签会导致段错误?

C++ - 输出语句的顺序不一致

python - 批处理迭代如何在 Tensorflow 中工作?