mok*_*oka 3 io macos posix asynchronous aio
我正在使用小型c ++框架,并具有一个文件类,该文件类也应支持异步读写。除了在我发现的某些工作线程中使用同步文件I / O之外,唯一的解决方案是aio。无论如何,我环顾四周,在Linux上,aio甚至没有在内核中实现,而是通过用户线程实现。OSX是否也是如此?另一个问题是aio的回调功能,该功能必须为每个回调都产生一个额外的线程,因为您不能分配某个线程或线程池来解决该问题(信号不是我的选择)。因此,这是由此产生的问题:
aio是否在osx的内核中实现,因此最有可能比我自己的线程实现好吗?
回调系统-为每个回调生成一个线程-在实践中是否会成为瓶颈?
如果aio不值得在osx上使用,那么unix上还有其他替代方法吗?在可可中?在碳中?
还是我应该使用自己的线程池简单地模拟异步I / O?
您在这方面的经验是什么?
您可以在此处确切地了解如何在OSX上实现AIO 。
该实现使用内核线程,一个作业队列,每个线程根据每个请求的优先级(至少乍一看是这样)在优先级队列中弹出并以阻塞方式执行。
您可以使用来配置线程数和队列大小sysctl
。要查看这些选项和默认值,请运行sysctl -a | grep aio
kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4
Run Code Online (Sandbox Code Playgroud)
以我的经验,为了使使用AIO有意义,这些限制需要更高一些。
至于线程中的回调,我认为Mac OS X不支持。它仅通过信号进行完成通知(请参阅源)。
您可能可以在自己的线程池中完成出色的工作。您可以比当前的darwin实现更好的一件事是按磁盘上的物理位置对读取作业进行排序(请参阅fcntl
和F_LOG2PHYS
),这甚至可以给您带来优势。