aio_write()和O_NONBLOCK write()之間的區別是什麼? 此外,我使用O_NONBLOCK函數使用文件描述符將write()寫入文本文件,並通過在函數前後放置一個計時器來比較性能與aio_write()。aio_write()和O_NONBLOCK write()之間的區別
看起來write()函數在字符串長度增加時需要較長的時間寫入文件,但aio_write()仍然保持大致相同的時間。
這是爲什麼? NONBLOCK和異步之間有什麼區別?
感謝
aio_write()和O_NONBLOCK write()之間的區別是什麼? 此外,我使用O_NONBLOCK函數使用文件描述符將write()寫入文本文件,並通過在函數前後放置一個計時器來比較性能與aio_write()。aio_write()和O_NONBLOCK write()之間的區別
看起來write()函數在字符串長度增加時需要較長的時間寫入文件,但aio_write()仍然保持大致相同的時間。
這是爲什麼? NONBLOCK和異步之間有什麼區別?
感謝
隨着O_NONBLOCK寫(),寫()調用會接受(即複製到一個內核緩衝區)所有,部分,或沒有你傳遞給它的數據(如果一些字節被接受,write()的返回值將表明它接受了多少字節......如果沒有被接受,write()將返回-1,errno將被設置爲EWOULDBLOCK)。 write()接受的字節數將取決於它目前在內核緩衝區中有多少可用空間。在write()返回後,您有責任記住它接受了多少字節,然後調用select()(或poll()或其他機制),以便在緩衝區中有更多可用空間時通知您。當有更多的空間可用時(即在將來的某個時間),你可以再次調用write()來將更多的字節傳遞給緩衝區。另一方面,aio_write()將「接管」您傳遞給函數的數據,並在稍後寫出數據時通知您。使用aio_write(),您不必擔心只接受部分數據緩衝區的調用;它會接受整個事情,或者出錯。這將使你的應用程序的I/O邏輯在這方面更簡單一些;不過我認爲異步I/O有它自己的一些複雜因素,所以它可能並不總是贏。 (我自己並沒有使用aio _ *(),所以我不能詳細說明)
至於write()函數爲什麼似乎沒有花費更多時間來寫入數據的長度。這是因爲非阻塞write()只會將傳遞給它的數據(無,或部分或全部)複製到緩衝區中,然後立即返回;它實際上並不等待數據進入磁盤。將應用程序緩衝區中的(相對較小的)字節序列複製到內核緩衝區時總是很快,並且複製的字節數永遠不會大於內核緩衝區中當前可用的空閒空間量,因此甚至每寫()複製的字節數也是有限/小的。
總結:如果內核緩衝區中有足夠的空間,則沒有區別。如果沒有,'O_NONBLOCK'將會失敗,''aio_write'會稍後從線程外部執行。 – 2010-09-13 03:53:31
這是一個很好的總結,除了O_NONBLOCK不一定會失敗之外......它可能只是採用一些您提供的數據,剩下的部分則不會。 – 2010-09-13 17:35:22