重疊IO模型知識

  • 什麼是重疊IO

重疊模型是一種異步IO模型。多線程結構中就考慮到採用異步的方式進行設備讀寫操作,即我們告訴系統對設備的讀寫數據,而同時應用程序的其他代碼繼續執行,直到獲取設備操作完畢的系統通知。


  • 重疊IO的作用

我們在這裏做一下對使用重疊IO和非重疊IO的解釋:

非重疊IO的情況

在Windows中,我們通常使用CreateFile、WriteFile、ReadFile等函數對文件進行操作時,會讓我們覺得有些“慢”,那這是爲什麼呢?因爲這些函數的工作方式是等待輸入或輸出操作結束後纔會返回,並且對於這些IO設備來說,它們的讀寫效率是非常低下的,如果要等到這些設備執行完畢才往後執行的話,那你當前的程序豈不是等的花都謝了。如果頻繁的需要對文件進行讀寫操作的話,那可想而知效率會是多麼的低。對於這種方式,通常被Windows系統稱之爲“同步”的方式。

使用重疊IO的情況

那麼我們要如何提高效率呢?當然是用我們這裏提到的重疊IO來操作了。重疊IO是一種“異步”執行方式,所以當你調用一個IO函數後,該函數會立即返回,而你的當前程序就會繼續往下執行,所以你需要建立一個“可警告(alert able)”的線程來等待接收IO操作完成的通知,這樣調用IO函數與IO函數的完成返回就成了“異步”方式執行。對於調用者來說,它的目標就集中到了整個程序邏輯的合理性問題上,而不用去關心IO操作的結果。


  • 重疊IO詳解

重疊IO?爲什麼要叫重疊IO?叫異步IO不好嗎?可能這個名字恰恰顯示了這種IO操作方式的精髓“重疊”吧。我們來談談重疊這個概念:這裏假設我們有多個需要頻繁進行寫操作的日誌系統,那麼我們在對其中一個進行IO操作時,是否需要等待道這個IO操作的完成通知後再進行下一個日誌系統的寫入?其實不用的,這時我們可以直接調用下一個IO操作,而這些IO操作是不是就可以看做堆疊在一起呢,然後在等待線程中等待這些IO操作的完成。或許這就是所謂的重疊的意思吧!這些“重疊”在一起的IO操作,將按照一定的順序被完成,但是它們的完成通知並不是嚴格按照順序回調,尤其是在多線程環境中,回調基本是隨機的。調用順序,和完成回調順序是完全不同的兩個概念,這一點一定要區別清楚。

在Windows中有一個重疊結構——OVERLAPPED,通常在你調用的API參數中如果出現了改字眼,那麼你幾乎可以斷定這個操作用到了重疊IO的技術。

通常情況下我們在實際編程中喜歡把OVERLAPPED結構進行重新封裝,例如下面我在項目中用到的代碼:

typedef struct
{
	OVERLAPPED		Overlapped;
	CHAR			FileName[MAX_PATH];
	CHAR			FilePath[MAX_PATH];
	HANDLE			hFile;
}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;

像這裏,我將OVERLAPPED封裝到了結構體裏面,並將OVERLAPPED設置爲該結構體的第一個數據成員,其他的數據成員可任意由開發者編寫,你在重疊IO中需要傳輸什麼數據都可以通過該結構體進行傳輸。看下邊代碼:

LPPER_IO_OPERATION_DATA pOverlapped;

PostQueuedCompletionStatus(MonitorManager::GetInstance()->GetMonitorFolder()->GetIOCPHandle()
					, 0, READFILE_KEY, &(pOverlapped->Overlapped));

我在使用重疊IO時用pOverlapped->Overlapped指針的方式使用重疊結構,並在後續接收時強制轉換回封裝後的重疊結構,代碼如下

while (TRUE)
{
	if (GetQueuedCompletionStatus(pMonitorFolder->m_hIOCP, &dwTransCount, &CompletionKey, &pOverlapped, INFINITE))
	{
		switch (CompletionKey)
		{
		case READFILE_KEY:
		{
			pOverlappedInfo = (LPPER_IO_OPERATION_DATA)pOverlapped;
			// ...	操作
			break;
		}

		case WRITEFILE_KEY:
		{
			pOverlappedInfo = (LPPER_IO_OPERATION_DATA)pOverlapped;
			break;
		}

		default:
			break;
	        }
	}
}

通過上面的方式我們就可以在獲取到完成端口後使用重新定義的重疊結構裏面的其他參數了。


  • 參考文獻
https://www.cnblogs.com/carekee/articles/5437827.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章