Linux中用于多核处理器的无锁IPC


9

我正在尝试找到一种在Linux上使用多核处理器在C语言下使用无锁IPC编写应用程序的方法。

假设我有进程1和进程2写入FIFO或共享内存。然后,进程3和进程4将从该共享内存或FIFO中读取。

使用无锁算法是否可能?

非常感谢您的指导。


您可以提供一些指示或参考一些有关无锁通信的外部文档吗?这个词的确切含义是什么?
乔治


如果我理解正确,那么问题就在于并发写入(1、2)和并发读取(3、4)。链接页面上描述的算法已经涵盖了作者和读者之间的同步。
乔治

Answers:


2

我已经看到使用环形缓冲区的参考,并控制访问位置指针以消除或减少对锁的需求。但是,这并不能消除等待的需要,只有在一个环形缓冲区有一个写入器和一个读取器的情况下,它才应该工作。在您的情况下,您至少需要两个缓冲区。

据我了解,该机制是:

  • 写入器等待,直到有一个空闲的插槽(最后+ 1!
  • writer将条目写入环形缓冲区。
  • 编写器更新最后一个条目指针。

  • 读取器将等待,直到环形缓冲区中有可用条目为止(最后一个=当前)。

  • 阅读器处理输入。
  • 阅读器增加当前指针。

根据使用的等待时间,这可以增加空队列中新项目的延迟,也可以在等待循环中消耗大量CPU周期。指针更新的顺序和严格的写访问权限分离对于此工作至关重要。仅允许写入器在递增指针使其对读取器可用之前写入环形缓冲区条目。


而且我在Wikipedia上也发现了这一点,看起来很有趣,尽管通过concurrencykit.org
聚合

1

是的,有可能。我们在项目中使用无锁队列的算法之一。但是这些算法确实并不明显。如果您想深入了解它们,则应该准备花费几个月的时间。


0

进程间通信不能无锁。仅线程间。据我所知。


我认为“无锁”是机制的属性,而不是用户的属性。当您将诸如共享内存之类的东西添加到混合中时,线程和进程之间的差异变得非常薄。
tylerl 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.