windows重疊IO和IOCP簡介

產生重疊IO的原因:

對於阻塞IO的讀寫操作都是需要阻塞等待IO完成的,大大的浪費用戶的進程的時間片,降低了程序的性能。所以系統開個後門,悄悄地給你開個後門,開個線程去幫你請求IO,等到IO操作完成之後再通知你,你就可一再接着處理就好了,那麼在IO完成之前你就可以放心的做其他的了。

重疊IO的重要數據結構:
typedef struct _WSAOVERLAPPED {
  DWORD    Internal;
  DWORD    InternalHigh;
  DWORD    Offset;
  DWORD    OffsetHigh;
  WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;

詳細請見msdn

WSAEVENT hEvent是連接完成事件和用戶程序的橋樑,我們可以通過可愛的waitformultipleobjects和waitforsingleobject來接受通知,進而處理完成事件。

那麼,IOCP又是怎麼一肥事呢?

需要知道,重疊IO解放勞動力的同時,也是有代價的,如果1000個請求同時發生就需要系統內部開啓1000個線程去處理IO,那麼負載實在太大了,所以需要池化,爲用戶進程開線程池去優化IO請求咯。

注意:

使用重疊IO或者IOCP之前IO句柄或者Socket創建的時候需要置位WSA_FLAG_OVERLAPPED標誌。
socket默認置位WSA_FLAG_OVERLAPPED。
重疊IO應該默認使用WSA前綴函數族。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章