什麼是重疊I O

2021-06-20 04:42:06 字數 1555 閱讀 9443

**:

在windows中有乙個api叫readfile  

bool   readfile(  

handle   hfile,  

//   handle   to   file  

lpvoid   lpbuffer,  

//   data   buffer  

dword   nnumberofbytestoread,  

//   number   of   bytes   to   read  

lpdword   lpnumberofbytesread,   //   number   of   bytes   read  

);  

基本上就這樣,。不知道你清楚了沒有,,,  

至於socket裡的重疊io,和這個差不錯,不同的是readfile   writefile被wsarecv和wsasend所代替了。這其中牽涉到的東西很多,其實有關windows的非同步io機制,是很高深的,所以開始我才推薦你去看《windows2000程式設計內幕》,也可以去看《inside   windows2000》  

發表者:nonocast

當cpu執行你的**時遇上乙個i/o請求[諸如讀寫檔案之類的],系統產生乙個中斷,讓cpu去完成這個i/o請求,等到完成了以後,系統再次產生乙個中斷讓原先的程式繼續執行。也就說通過中斷保持這兩者間的同步。可以將終端理解為硬體化的訊號量。  

這就是所謂的同步概念,乙個執行緒中只可能同時處理乙個i/o請求  

你要知道,乙個i/o操作是非常耗時的,當你的**掛起後等待i/o完成的這段時間內,你的這個執行緒浪費了n個指令週期。  

如果同時要反覆讀寫大檔案,用同步的效率是很低的。  

為了解決這個問題,當cpu執行你的**時遇上乙個i/o請求後,系統這是為你開一根內部執行緒去處理i/o請求,並且你的執行緒並不掛起,但你可能會覺得如果i/o還沒完成,後續的**就算他讓我執行,我也執行不下去了嘛?  

但如果後續的**和這個i/o操作無關,你就可以以更快的速度之行下去了,而無需等待io請求的完成了  

這也就是非同步了  

你想當你有這樣乙個請求,就是  

readfile(...)  

-1  

writefile(...)  

-2  

readfile(...)  

-3  

你在程式中如果使用同步的話,那只有當你完成1以後2才會繼續執行,2執行完以後3才會繼續執行。這就是同步。  

當如果使用非同步的話,當系統遇到1時,ok,開一線程給它去完成該io請求,然後系統繼續執行2,3,分別開兩線程。  

1-2-3如果是比較耗時的操作,尤其是運用在網路上,那麼1-2-3這三個io請求是並行的,也就是重疊的。  

重疊i/o就是能夠同時以多個執行緒處理多個i/o,其實你自己開多個執行緒也可以處理多個i/o,當然系統內部優化以後肯定效能要比你的強,呵呵。  

最後提一下重疊模型的缺點,他為每乙個io請求都開了一根執行緒,當同時有1000個請求發生,那麼系統處理執行緒上下文[context]切換也是非常耗時的,所以這也就引發了完成埠模型iocp,用執行緒池來解決這個問題,我就不多說了。   

什麼是重疊I O

在windows中有乙個api bool readfile handle hfile,handle to file lpvoid lpbuffer,data buffer dword nnumberofbytestoread,number of bytes to read lpdword lpnum...

重疊I O詳解

在windows中有乙個api叫readfile bool readfile handle hfile,handle to file lpvoid lpbuffer,data buffer dword nnumberofbytestoread,number of bytes to read lpdw...

什麼是IO(二) IO模型

這部分的東西在網路程式設計經常能看到,不過在所有io處理中都是類似的。io請求的兩個階段 使用資源階段 真正進行資料接收和發生。舉例說就是排隊和服務。在等待資源階段,io分為阻塞io和非阻塞io。阻塞io 資源不可用時,io請求一直阻塞,直到反饋結果 有資源或超時 非阻塞io 資源不可用時,io請求...