osx 上的 aio:它是在内核中实现还是通过用户线程实现?其他选择?

2024-05-02

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

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

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

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

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

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


您可以清楚地看到 AIO 在 OSX 上是如何实现的here http://www.opensource.apple.com/source/xnu/xnu-1504.9.37/bsd/kern/kern_aio.c.

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

osx 上的 aio:它是在内核中实现还是通过用户线程实现?其他选择? 的相关文章

随机推荐