aio_write()和O_NONBLOCK write()之间的区别

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

当string长度增加时,write()函数似乎需要较长时间才能写入文件,但aio_write()仍然保持大致相同的时间。

为什么这样? NONBLOCK和asynchronous有什么区别?

谢谢

使用O_NONBLOCK write(),write()调用将接受(也就是复制到内核缓冲区中)传递给它的所有,部分或全部数据(如果接受了一些字节,write() s的返回值将指示它接受了多少字节…如果没有被接受,write()将返回-1,errno将被设置为EWOULDBLOCK)。 write()接受的字节数将取决于此时它在内核缓冲区中有多少可用空间。 在write()返回之后,你有责任记住它接受了多少字节,然后调用select()(或poll()或其他一些机制),这样当缓冲区中有更多可用空间时, 。 当更多的空间变得可用时(即在将来的某个时候),你可以再次调用write()来将更多的字节传递给缓冲区。

另一方面,aio_write()会将您传递给函数的数据“取得所有权”,并在稍后写出数据时通知您。 使用aio_write(),您不必担心只接受部分数据缓冲区的调用; 它会接受整个事情,或者出错。 这将使您的应用程序的I / O逻辑在这方面更简单一些; 不过,我认为异步I / O有自己的一套复杂因素,所以它可能并不总是一个胜利。 (我自己并没有使用aio _ *(),所以我不能详细说明)

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