我正在研究我的小型c ++框架,并且有一个文件类,它也应该支持异步读写。除了在我发现的一些工作线程中使用同步文件i / o之外,唯一的解决方案是aio。无论如何我在四处寻找并在某处阅读,在Linux中,aio甚至没有在内核中实现,而是在用户线程中实现。 OSX也是如此吗?另一个问题是aio的回调功能,它必须为每个回调产生一个额外的线程,因为你不能指定一个特定的线程或线程池来处理它(信号对我来说不是一个选项)。以下是由此产生的问题:
aio是否在osx的内核中实现,因此很可能比我自己的线程实现更好?
回调系统 - 为每次回调设置一个线程 - 是否会成为实践中的瓶颈?
如果aio不值得在osx上使用,unix上还有其他选择吗?在可可?在碳?
或者我应该只使用自己的线程池模拟异步i / o?
您对此主题的体验是什么?
答案 0 :(得分:5)
您可以在OSX右侧here确切了解AIO的实施方式。
该实现使用内核线程,一个作业队列,每个线程根据每个请求的优先级以优先级队列的方式以阻塞方式弹出并执行(至少乍一看是这样)。
您可以使用sysctl
配置线程数和队列大小。要查看这些选项和默认值,请运行sysctl -a | grep aio
kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4
根据我的经验,为了使用AIO有任何意义,这些限制需要更高。
至于线程中的回调,我不相信Mac OS X支持这一点。它只通过信号完成通知(参见来源)。
你可以在自己的线程池中做好工作。你可以做的最好的事情就是当前的darwin实现是按照磁盘上的物理位置对你的读取作业进行排序(参见fcntl
和F_LOG2PHYS
),这甚至可能给你带来优势。
答案 1 :(得分:0)
@Moka :很抱歉说你的linux实现错了,从内核2.6开始,有一个AIO的内核实现,它来自libaio(libaio.h)
不使用内核线程但是使用用户线程的实现是POSIX.1 AIO,它以这种方式使其更具可移植性,因为并非所有基于unix的OS都支持内核级别的完成事件。