我使用epoll/devpoll/kqueue/poll/select(包括windows-select)爲異步套接字IO設計事件循環。異步事件循環設計和問題
我有表演的兩個選項,IO操作:在EAGAIN
非阻塞模式,調查
- 設置套接字非阻塞模式。
- 讀/寫入套接字。
- 如果操作成功,則向事件循環發佈完成通知。
- 如果我得到EAGAIN,將套接字添加到「選擇列表」並輪詢套接字。
輪詢方式:輪詢,然後執行
- 添加插座選擇列表和輪詢它。在正常模式下使用時
- 等待通知,這是可讀可寫的
- 讀/寫
- 後完成通知sucseeds的事件循環
對我來說,它看起來像第一次將需要更少的系統調用, 尤其適用於寫入套接字(緩衝區相當大)。 此外,它看起來可以減少「select」 執行次數的開銷,特別是當你沒有可以很好地擴展爲epoll/devpoll/kqueue的東西 時更是如此。
問題:
- 有沒有第二個方法的任何好處?
- 在Linux,FreeBSD,Solaris,MacOSX,Windows等衆多操作系統上,套接字/文件描述符上的非阻塞操作是否存在可移植性問題。
注:請不要建議使用現有的事件環/插座-API實現
我看不出有什麼理由不能等待分配內存直到需要使用第一種方法。我錯過了什麼嗎? – Ioan 2010-05-10 18:47:59
我想是這樣,但實際上並沒有這樣實現。在第一種情況下,您需要步驟2-4中提供的緩衝區,在第二種情況下,您只需要在步驟3中使用緩衝區。 – karunski 2010-05-16 19:14:43