2010-07-06 90 views
5

我正在從一個複雜的多線程實現過渡到使用狀態機來跟蹤連接的會話狀態的單線程/單進程實現的TFTP實現。 TFTP非常簡單,並且併發會話的數量足夠小,除了大規模的代碼大小複雜性節省之外,真正對軟件沒有影響。Posix AIO Bad/Broken?

當然,我不能只在其他人連接時阻止一個會話。爲了解決這個問題,我首先想到的是POSIX AIO,雖然一些研究後,我讀了它的

  • 記錄不完整,而不是完成
  • 只能對磁盤I/O和不支持插座,或適用於套接字,但僅用於讀/寫 - 不適用於收聽。

一個例子包含在這個鏈接(http://davmac.org/davpage/linux/async-io.html),但我也發現了其他人。從08年起,在之前的一個stackoverflow帖子(What is the status of POSIX asynchronous I/O (AIO)?)中給出了一些額外的觀點。

對於C開發人員來說,AIO仍然像人們聲稱的那樣壞了嗎?人們是否真的不使用AIO,並主要堅持輪詢/選擇或有限大小的線程池?

+0

這似乎只是我早期問題的一個副本。除了「那仍然有效」之外,你還有什麼想知道的嗎? – Glyph 2012-09-20 18:44:52

回答

0

對於跨平臺異步套接字庫,您可能會考慮使用Boost.Asio。它有很好的例子,並被廣泛記錄。

+0

謝謝,但不幸的是,軟件本身是用C編寫的,並且可能不會改變(它將通過認證,Level D航空電子軟件 - 我公司的編碼標準要求使用C)。我想我有點不小心使用了「C/C++」引用。 – Bob 2010-07-06 17:36:34

+0

@羅伯特太糟糕了。您可能想要刪除問題中的C++標誌。 – 2010-07-06 19:38:53

0

我不能回答你關於POSIX AIO的問題,但我用libev事件。小巧,快速,簡單。爲IO提供了一個很好的包裝來代替輪詢/選擇。

1

記錄不當肯定是這種情況。

大多數人棍子poll()/select(),只是因爲這些都是很好理解的,經過嚴格測試的,記錄和大力支持。如果我是你,我會使用select(),除非你有一個令人信服的理由不要。

+0

根據http://stackoverflow.com/a/7957716/309483,POSIX AIO有很好的文檔 – 2014-02-08 14:21:27

0

aio的問題取決於平臺,因此您的決定的很大一部分是您的目標平臺。質量差異很大,在某些情況下,它以輪詢/選擇類型呼叫的形式實施。

人們不傾向於使用像KEVENT/kqueue的或epoll的調查/選擇或類似的接口,這種事情在Unix平臺上。

沒有與AIO接口問題,並添加像aio_waitcomplete()和AIO kqueues的整合有差別。

許多用於處理大量I/O的線程並不是一個好方法。

0

磁盤,你爲什麼要有AIO,而不只是緩衝的讀/寫,除非你想1)使用自己的緩存2)控制在髒頁的影響,或3)使用IO重點是什麼?

因爲如果你的目標只是代碼重構,那麼你可能會通過當前版本的緩存。從緩衝IO變爲直接IO是一個巨大的變化。

例如,在用的RAM 1,5G EXT3/SSD /空操作,僅有3線程做300MB的流寫入餓死小的寫入和讀取。切換違規者以指導IO修復,但寫入現在需要永久。