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

ash*_*ley 4 c++ linux

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

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

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

谢谢

Jer*_*ner 11

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

另一方面,aio_write()将"获取"您传入函数的数据的所有权,并在以后通知您何时完成数据写入.使用aio_write(),您不必担心调用仅接受部分数据缓冲区; 它要么接受整个事情要么接受错误.这将使您的应用程序的I/O逻辑在这方面更简单一些; 但我认为异步i/o有其自身的一系列复杂因素,所以它可能并不总是一个胜利.(我自己没有用过aio _*(),所以我不能透露细节)

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

  • 这是一个很好的总结,只是 O_NONBLOCK 不一定会失败......它可能只获取您提供的一些数据并保留其余数据。 (2认同)