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

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

  • 回调系统-为每个回调产生一个线程-在实践中是否会成为瓶颈?

  • 如果aio不值得在osx上使用,那么unix上还有其他替代方法吗?在可可中?在碳中?

  • 还是我应该使用自己的线程池简单地模拟异步I / O?

    您在这个问题上有什么经验?

有帮助吗?

解决方案

此处

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

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

以我的经验,为了使使用AIO有意义,这些限制必须更高。

至于线程中的回调,我认为Mac OS X不支持。它仅通过信号进行完成通知(请参阅源代码)。

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top