windows系統程式設計之非同步i/o和完成埠
【作者】北極星2003
【**】看雪技術論壇(bbs.pediy.com)
【時間】2023年7月1日
一、 同步i/o和非同步i/o
在介紹這部分內容之前先來認識下「非同步i/o」。
說起非同步io,很容易聯想到同步i/o,對於同乙個i/o物件控制代碼在同一時刻只允許乙個i/o操作,其原理如下圖所示:
顯然,當核心真正處理i/o的時間段(t2~t4),使用者執行緒是處於等待狀態的,如果這個時間段比較段的話,沒有什麼影響;倘若這個時間段很長的話,執行緒就會長時間處於掛起狀態。事實上,該執行緒完全可以利用這段時間用處理其他事務。
非同步i/o恰好可以解決同步i/o中的問題,而且支援對同乙個i/o物件的並行處理,其原理如下圖所示:
// 由於此時hevent=null,所以同步物件為hfile,下面兩句的效果一樣
waitforsingleobject ( hfile, infinite ) ;
**:dword nreadbyte ;
byte bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;
readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;
readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;
readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;
//假設三個i/o處理的時間比較長,到這裡還沒有結束
**:dword nreadbyte ;
byte bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;
handle hevent1 = createevent ( null, false, false, null ) ;
handle hevent2 = createevent ( null, false, false, null ) ;
handle hevent3 = createevent ( null, false, false, null ) ;
readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;
readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;
readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;
//此時3個i/o操作的同步物件分別為hevent1,hevent2,hevent3
執行後的效果如下(winxp+sp2+vc6.0):**:void ccompletionroutinedlg::ontest()
deletefile ( "a.txt" ) ;
deletefile ( "b.txt" ) ;
deletefile ( "c.txt" ) ;
}
4、 心得體會
每當乙個io操作結束時會產生乙個完成資訊,如果該io操作有完成例程的話就新增到完成例程佇列。一旦呼叫執行緒進入可變等待狀態,就會依次執行佇列中的完成例程。
在這個示例中還有乙個問題,如果把這個軟體放在系統分割槽的檔案目錄下可以正常執行,而放在其他碟符下就會出現問題,執行結果就不同,真是奇怪了。
四、使用完成埠(iocp)
例項二、使用iocp的非同步i/o示例
1、設計目標
體會完成埠的非同步i/o實現原理及過程。
2、 問題的分析與設計
說明:每個客戶端與乙個管道進行互動,而在互動過程中i/o操作結束後產生的完成包就會進入「i/o完成包佇列」。完成埠的執行緒佇列中的執行緒使用getqueuedcompletionstatus來檢測「i/o完成包佇列」中是否有完成包資訊。
3、詳細設計(關鍵**如下,具體見附件中的原始碼)
**:uint serverthread ( lpvoid lpparameter )
return 0 ;
}void cmydlg::onstart()
// 建立執行緒
for ( i = 0; i < nmaxthread; i++ )
……}void cmydlg::onstop()
for ( i = 0; i < nmaxpipe; i++ )
……}
同步IO和非同步IO
同步io和非同步io 簡單的說 同步在程式設計裡,一般是指某個io操作執行完後,才可以執行後面的操作。非同步則是,將某個操作給系統,主線程去忙別的事情,等核心完成操作後通知主線程非同步操作已經完成。i windows同步i o與非同步i o 執行後的效果如下 winxp sp2 vc6.0 4 心得...
同步IO和非同步IO
同步io和非同步io 有兩種型別的檔案io同步 同步檔案io和非同步檔案io。非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而 非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請...
同步IO與非同步IO
非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請求後,將會通知執行緒io操作完成了。同步io在同一時刻只允許乙個io操作,也就是...