0

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

4

1 回答 1

1

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

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

对于进程内通信,交换的数据量并不是一个真正的问题,因为您总是可以只传输数据的指针(并且约定发送线程正在malloc处理它,而接收线程free在消费后会处理它) .

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

我不确定内核是否可以优化消息传递以避免这种情况,copy_to_user因为它可能不知道何时是一个仅用于一个进程的队列(它无法预测mq_open以后没有其他进程会出现相同的队列)。

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

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

于 2013-04-23T04:59:34.020 回答