3

我正在研究我的小型 c++ 框架,并且有一个文件类,它也应该支持异步读写。除了在我发现的一些工作线程中使用同步文件 i/o 之外,唯一的解决方案是 aio。无论如何,我环顾四周并在某处阅读,在 Linux 中,aio 甚至没有在内核中实现,而是在用户线程中实现。OSX 也一样吗?另一个问题是 aio 的回调功能,它必须为每个回调生成一个额外的线程,因为您不能分配某个线程或线程池来处理它(信号不是我的选择)。因此,以下是由此产生的问题:

  • aio 是否在 osx 的内核中实现,因此很可能比我自己的线程实现更好?

  • 回调系统 - 为每个回调生成一个线程 - 会成为实践中的瓶颈吗?

  • 如果 aio 不值得在 osx 上使用,在 unix 上还有其他选择吗?在可可?在碳?

  • 或者我应该简单地用我自己的线程池模拟异步 i/o?

你在这个问题上的经验是什么?

4

2 回答 2

5

您可以在此处准确了解 AIO 是如何在 OSX 上实现的。

该实现使用内核线程,一个作业队列,每个线程弹出并根据每个请求的优先级在优先级队列中以阻塞方式执行(至少乍一看是这样)。

您可以使用 配置线程数和队列大小sysctl。要查看这些选项和默认值,请运行sysctl -a | grep aio

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

根据我的经验,为了让使用 AIO 有意义,这些限制需要更高。

至于线程中的回调,我不相信 Mac OS X 支持。它只通过信号发出完成通知(参见源代码)。

您可能可以在自己的线程池中完成同样出色的工作。您可以比当前的 darwin 实现做得更好的一件事是按磁盘上的物理位置对读取作业进行排序(请参阅fcntlF_LOG2PHYS),这甚至可能会给您带来优势。

于 2011-05-12T04:58:06.470 回答
0

@Moka:很抱歉,您在 linux 实现上错了,从内核 2.6 开始,有一个 AIO 的内核实现,它来自 libaio (libaio.h)

不使用内核线程而是使用用户线程的实现是 POSIX.1 AIO,它这样做是为了使其更具可移植性,因为并非所有基于 unix 的操作系统都支持内核级别的完成事件。

于 2013-06-24T21:27:29.757 回答