POSIX AIO和FreeBSD AIO之间有什么区别?

3

能否有人解释一下posix AIO和freebsd AIO的区别?看起来函数是相同的,aio_read/aio_write。

我知道Linux本机AIO仅适用于Linux,并使用io_setup/io_submit等方法。


1
FreeBSD的aio_read、 aio_write、aio_cancel等手册页面都有一个STANDARDS部分,其声明类似于“<function-name>()系统调用应符合IEEE Std 1003.1-2001(“ POSIX.1”)”。为什么你认为它们不同?另外对于Linux,如果需要POSIX AIO,则需要确保使用提供它们的C库。Glibc> = v2.1和musl> = v1.1.7应符合要求,但目前uClibc,uClibc-ng,dietlibc或Bionic(Android)根本未实现POSIX AIO。对于这些C库,请使用类似io_setup(kernel> = v2.5)的Linux特定系统调用。 - MemReflect
那么,它是基于线程的 AIO 吗? - vego
1
什么是基于线程的? - arrowd
POSIX AIO是一种用户级别的实现,它在多个线程中执行正常的阻塞I/O,从而给出了I/O异步的假象。 - vego
虽然Linux本地AIO不是基于线程的,但它是在内核中完成的。因此,我想知道FreeBSD是否与POSIX AIO相同基于线程的? - vego
1个回答

1

FreeBSD AIO也是基于内核的,这意味着它不会尝试通过生成用户模式线程并在那里运行IO操作来模拟异步操作。

正如man页面所说:

调用线程调用一个系统调用来请求异步I/O操作。


1
作为额外的纯信息,BSD使用内核线程池实现异步文件I/O,除非句柄是O_DIRECT。因此,虽然比Linux上的情况要好,但它并不像Linux上的io_uring或Windows上的OVERLAPPED那样是“真正的通用异步”。此外,由于设计不良,POSIX aio的扩展性非常差。除非您通过BSD kqueues使用它,否则它通常都是一个糟糕的选择,而在这种情况下,它实际上相当不错。 - Niall Douglas
@NiallDouglas 我很好奇,你提到POSIX aio接口是一个糟糕的设计。然而,当这个接口由BSD kqueues支持时,它实际上是相当不错的。对我来说,这听起来像是设计本身还不错,只是没有太多好的实现?我真的很想知道在接口中限制了什么好/可扩展的实现。希望你能分享一下。 - safl
@safl kqueue/kevent 机制可以操作不同类型的描述符。Niall 的意思是,您可以将 aio_sigevent 字段作为 kevent 的参数传递,以便在 AIO 操作完成时获得通知。因此,这不是关于“备份”,而是“协同工作”。 - arrowd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接