【问题标题】:Difference between aio_write() and O_NONBLOCK write()aio_write() 和 O_NONBLOCK write() 的区别
【发布时间】:2010-09-13 03:28:54
【问题描述】:

aio_write() 和 O_NONBLOCK write() 有什么区别? 此外,我使用 O_NONBLOCK 函数使用文件描述符将 write() 用于文本文件,并通过在函数前后放置一个计时器来比较 aio_write() 的性能。

当字符串的长度增加时,write() 函数似乎需要更长的时间来写入文件,但 aio_write() 仍然保持大约相同的时间。

为什么会这样? NONBLOCK和异步有什么区别?

谢谢

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    使用 O_NONBLOCK write(),write() 调用将接受(即复制到内核缓冲区)您传递给它的所有数据、部分数据或不接受任何数据(如果接受了某些字节,请写入() 的返回值将指示它接受了多少字节...如果没有接受,write() 将返回 -1 并且 errno 将设置为 EWOULDBLOCK)。 write() 接受的字节数取决于它目前在内核缓冲区中有多少可用空间。在 write() 返回后,您有责任记住它接受了多少字节,然后调用 select()(或 poll() 或其他一些机制),以便在缓冲区中有更多可用空间时通知您.当更多空间可用时(即在未来某个时间),您可以再次调用 write() 以将更多字节传递到缓冲区。

    另一方面,aio_write() 将“取得”您传递给函数的数据的所有权,并在它完成写出数据后通知您。使用 aio_write(),您不必担心调用只接受部分数据缓冲区;它要么接受整个事情,要么出错。这将使您的应用程序的 I/O 逻辑在这方面更简单一些;但是我认为异步 i/o 有其自己的一组复杂因素,因此它可能并不总是一个胜利。 (我自己没用过aio_*(),所以不能详述)

    至于为什么 write() 函数似乎没有随着写入数据长度的增加而花费更多时间......那是因为非阻塞 write() 只复制(无,或部分,或全部)将传递给它的数据放入缓冲区,然后立即返回;它实际上并不等待数据进入磁盘。将(相对较小的)字节序列从应用程序的缓冲区复制到内核缓冲区总是很快,并且复制的字节数永远不会大于内核缓冲区中当前可用的空白空间量,所以甚至每次 write() 复制的字节数也是有限的/很小的。

    【讨论】:

    • 总结一下:如果内核缓冲区有足够的空间,则没有区别。如果没有,O_NONBLOCK 将失败,aio_write 稍后会从您的线程外部执行。
    • 这是一个很好的总结,除了 O_NONBLOCK 不一定会失败......它可能只是取走您提供的一些数据并留下其余数据。
    • aio_write使用的缓冲区中的数据是否也被内核缓冲了?似乎不是POSIX。 pubs.opengroup.org/onlinepubs/9699919799 搜索无缓冲。
    猜你喜欢
    • 2015-04-21
    • 2014-01-31
    • 2011-10-22
    • 2013-06-20
    • 1970-01-01
    • 2021-04-25
    • 2019-02-04
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多