posix队列vs自定义0复制队列,用于进程内线程通信

时间:2013-04-23 04:16:06

标签: c linux queue kernel posix

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

1 个答案:

答案 0 :(得分:1)

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

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

对于进程内通信,交换的数据量实际上并不是一个问题,因为你总是可以传输数据的指针(并且具有发送线程为malloc的约定 - 同时消费后接收线程将free

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

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

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

但你真的需要基准测试。我不确定这是一个大问题。