当前位置: 首页 > 面试题库 >

POSIX AIO和Linux上的libaio之间的区别?

廖臻
2023-03-14
问题内容

似乎 明白了:

POSIX AIOAPI已原型化,<aio.h>您将程序与librt(-lrt)链接,而libaioAPI中<libaio.h>和您的程序已与libaio(-laio)链接。

我不知道的是:

1.内核对这两种方法的处理方式是否不同?

2. O_DIRECT使用这两个标志是否强制性的?

正如提到的这个帖子,libaio的工作正常不O_DIRECT使用时libaio.Okay,理解,但:

据R.Love的 Linux的系统编程 的书,Linux支持 AIO (我假设是POSIX AIO)在常规文件上
如果打开了O_DIRECT。但一个小程序,我写的(使用aio.h,与-lrt链接)的呼叫aio_write上没有O_DIRECT标志打开的文件不会有问题。


问题答案:

在linux上,这两个AIO实现根本不同。

POSIX AIO是一种用户级别的实现,可以在多个线程中执行常规的阻塞I / O,因此给人一种I / O异步的错觉。这样做的主要原因是:

  1. 它适用于任何文件系统
  2. 它可以(基本上)在任何操作系统上工作(请记住,gnu的libc是可移植的)
  3. 它适用于启用了缓冲的文件(即未设置O_DIRECT标志)

主要缺点是队列深度(即实际上可以执行的未完成操作的数量)受您选择拥有的线程数量的限制,这也意味着一个磁盘上的慢速操作可能会阻止去往一个磁盘的操作。不同的磁盘。它还影响内核和磁盘调度程序看到哪些I
/ O(或多少)。

内核AIO(即io_submit()等)是内核对异步I /
O操作的支持,其中io请求实际上在内核中排队,按您拥有的任何磁盘调度程序排序,大概其中一些转发(以某种最佳的顺序(作为希望)对实际磁盘进行异步操作(使用TCQ或NCQ)。这种方法的主要限制是,并非所有文件系统都可以在异步I
/ O上很好地工作或根本无法工作(并且可能会退回到阻塞语义),因此必须使用O_DIRECT打开文件,这对O_DIRECT带来了很多其他限制。 I /
O请求。如果您无法使用O_DIRECT打开文件,它可能仍然可以“工作”,就像返回正确的数据一样,但是它可能不是异步完成的,而是会退回到阻塞语义上。

还请记住,在某些情况下,io_submit()实际上可以在磁盘上进行阻止。



 类似资料:
  • 本文向大家介绍Linux和Unix之间的区别,包括了Linux和Unix之间的区别的使用技巧和注意事项,需要的朋友参考一下 的Linux Linux是开源的多任务,多用户操作系统。它最初由Linus Torvalds于1991年开发。LinuxOS被广泛用于台式机,移动设备,大型机等。 的Unix Unix是多任务,多用户操作系统,但不是免费使用的也不是开源的。它是由AT&T贝尔实验室的Ken T

  • 问题内容: 这2个Linux错误之间有什么区别?23和24 我尝试了2个不同的站点,但无法理解两者之间的区别。 另外,我收到错误号24,套接字调用在974次失败。(UDP数据报套接字) 当我执行a时,我看到的值334076 ulimit -n显示1024 知道如何增加限制吗? 问题答案: 对于1)两个错误代码都与打开的文件过多的情况有关。EMFILE在您的进程中打开了太多文件。ENFILE是在整个

  • 问题内容: 我想知道Linux C 和Linux C 之间的区别。 经过一些搜索工作,我得出以下结论。您能帮我查看一下并纠正其中的任何错误吗?谢谢 属于C语言的标准I / O流;类型为FILE *并在stdio.h中定义 拥有int类型的,是在定义的。它是LINUX系统的文件描述符。在中,解释如下: 因此,我认为,属于系统级调用,并且在某种程度上类似于系统API。可用于描述系统中的任何设备。 在较

  • 问题内容: 在阅读了这个答案和Robert Love的“LinuxKernelDevelopment”之后,随后在系统调用中,我发现Linux中的进程和线程(几乎)与内核没有区别。它们之间有一些调整(在引用的SO问题中被讨论为“更多共享”或“更少共享”),但是我仍然有一些问题需要解答。 我最近开发了一个包含几个POSIX线程的程序,并决定在此前提下进行试验。在创建两个线程的进程中,所有线程当然都会

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。