同步io 非同步io apc 重疊io 完成埠

2021-06-05 08:47:30 字數 2901 閱讀 8308

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

**:

void ccompletionroutinedlg::ontest()

deletefile ( "a.txt" ) ;

deletefile ( "b.txt" ) ;

deletefile ( "c.txt" ) ;

}

執行後的效果如下(winxp+sp2+vc6.0):

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操作,也就是...