在windows中有乙個api
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》
當cpu執行你的**時遇上乙個i/o請求[諸如讀寫檔案之類的],系統產生乙個中斷,讓cpu去完成這個i/o請求,等到完成了以後,系統再次產生乙個中斷讓原先的程式繼續執行。也就說通過中斷保持這兩者間的同步。可以將終端理解為硬體化的訊號量。 這就是所謂的同步概念,乙個執行緒中只可能同時處理乙個i/o請求 你要知道,乙個i/o操作是非常耗時的,當你的**掛起後等待i/o完成的這段時間內,你的這個執行緒浪費了n個指令週期。 如果同時要反覆讀寫大檔案,用同步的效率是很低的。
為了解決這個問題,當cpu執行你的**時遇上乙個i/o請求後,系統這是為你開一根內部執行緒去處理i/o請求,並且你的執行緒並不掛起,但你可能會覺得如果i/o還沒完成,後續的**就算他讓我執行,我也執行不下去了嘛?
你想當你有這樣乙個請求,就是
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,當然系統內部優化以後肯定效能要比你的強,呵呵。
什麼是重疊I O
在windows中有乙個api叫readfile bool readfile handle hfile,handle to file lpvoid lpbuffer,data buffer dword nnumberofbytestoread,number of bytes to read lpdw...
重疊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請求...