2010-09-13 62 views
4

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

看起来write()函数在字符串长度增加时需要较长的时间写入文件,但aio_write()仍然保持大致相同的时间。

这是为什么? NONBLOCK和异步之间有什么区别?

感谢

回答

11

随着O_NONBLOCK写(),写()调用会接受(即复制到一个内核缓冲区)所有,部分,或没有你传递给它的数据(如果一些字节被接受,write()的返回值将表明它接受了多少字节......如果没有被接受,write()将返回-1,errno将被设置为EWOULDBLOCK)。 write()接受的字节数将取决于它目前在内核缓冲区中有多少可用空间。在write()返回后,您有责任记住它接受了多少字节,然后调用select()(或poll()或其他机制),以便在缓冲区中有更多可用空间时通知您。当有更多的空间可用时(即在将来的某个时间),你可以再次调用write()来将更多的字节传递给缓冲区。另一方面,aio_write()将“接管”您传递给函数的数据,并在稍后写出数据时通知您。使用aio_write(),您不必担心只接受部分数据缓冲区的调用;它会接受整个事情,或者出错。这将使你的应用程序的I/O逻辑在这方面更简单一些;不过我认为异步I/O有它自己的一些复杂因素,所以它可能并不总是赢。 (我自己并没有使用aio _ *(),所以我不能详细说明)

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

+0

总结:如果内核缓冲区中有足够的空间,则没有区别。如果没有,'O_NONBLOCK'将会失败,''aio_write'会稍后从线程外部执行。 – 2010-09-13 03:53:31

+1

这是一个很好的总结,除了O_NONBLOCK不一定会失败之外......它可能只是采用一些您提供的数据,剩下的部分则不会。 – 2010-09-13 17:35:22

相关问题