裝置I O之OVERLAPPED IO重疊

2021-06-17 17:26:56 字數 2216 閱讀 5770

**:

似乎在win32的programming中沒有這個概念呀?要討論這個問題就要追溯到對裝置i/o的訪問中.

在win32中,使用者不能象以前那樣直接對硬體進行訪問,使得這一層

對開發者而言是個"黑盒",而是提供了一組對應的api的介面.讓開發者

基於提供的介面進行開發,而把低層的訪問交給了driver或者核心.

在win32中,裝置的概念已經遠遠超過了moniter,printer等的範圍,大概

可以包括檔案,目錄,串列埠,並口,管道以及控制台等.很自然的,當我們要

訪問這個裝置的時候,我們的第一步就是開啟這個裝置,其中win32 api

提供的是createfile,具體的使用可以參考msdn,其中包括的一些

引數表明了是否這個裝置已經存在(dwcreationdisposition),

是否以獨佔的方式(dwsharemode)開啟等等.

這裡大家可能已經產生了這個想法:呀,既然是跟裝置打交道,

那麼裝置的速度這麼慢,而cpu的速度這麼快,這兩者應該怎麼

協調好呢?舉個例子說,我要訪問軟盤上的資料,哪怕它是一秒

後就讀出來了,那其實對cpu也是一種很大的浪費呀.是的,的確

會有這個問題,既然有問題,我們就要解決,而microsoft

這個字元到底是什麼含義呢?其實它的意思就是當程式在等待

裝置操作的時候,可以繼續往下做而不必阻塞到那個地方等待

裝置操作的返回,這就造成了程式執行和裝置操作時間上的

重疊.是的,是這樣的,神奇吧,那麼程式該怎麼知道裝置操作

什麼時候做完了返回了呢...

講到這個地方,我們又要引入多執行緒的概念了.其實

相信大家對多執行緒都有了一定的了解,其實多執行緒主要

就是乙個同步的問題,如何協調好這些"跑起來就不羈"

的執行緒,win32提供給我們的是waitforsingleobject

和waitformultiobject這兩個函式,而win32中提供了

一組專門用來同步的物件包括critical section,

mutex,semaphore,event等,這其中的絕大多數都

屬於核心物件(kernal object),其中這些物件與

一般物件的最大區別就是他們是屬於系統核心維護

的一塊資料結構.程式不能直接訪問他們.這些物件

都具備兩種形態,這裡我們不妨稱之為:有訊號的和

無訊號的.這樣當我們使用wait函式的時候,就可以

根據訊號的有無來使得程式是否阻塞在wait的地方,

簡單的說,就是當我們呼叫乙個函式:waiforsingobject(event a);

的時候,如果a事件有訊號,那麼程式就往下跑,如果是

無訊號的,那麼程式就阻塞在當前位置,等待其變為

有訊號的.舉個形象的粒子,比如執行緒是個在高速公路

上跑的汽車,wait函式的作用就是讓這輛汽車開到

乙個十字路口,等待路口的訊號燈是否為綠色的,如果

是那麼汽車接著往下跑,否則對不起,請等在那邊等

訊號燈變為綠色..

在這裡,我使用下來最方便的就是event這個物件了,

因為我們可以很方便的對它進行操作,比如setevent

使的它變為有訊號的,而resetevent使得它變為無訊號的,

當然其他的一些比如mutex在使得程式不能重複

載入等地方也很方便..

標誌,然後在讀寫操作(對應的是writefile和readfile)

的時候同樣使用這個標誌即可...

看看下面這段:

1處        以重疊方式接收指定字元,看函式是否讀取成功

freadstat=readfile(hcom,lpblock,dwlength,&dwlength,&osread);

if(!freadstat)

else dwlength=0;//異常情況

}這樣當程式在用非同步的方式讀取資料的時候,不管

裝置有沒有操作完,程式會立即往下跑而不用等待其返回(

如果是同步的那執行緒就會阻塞在這個地方).這樣我們

在2處的地方就可以自己做自己的事情而不用去管裝置(這樣

也就實現了時間上的重疊),直到我們需要等待3處資料

進來後再做進一步的處理的時候,我們才會用上

那句waitfor等待裝置..

這樣的操作無疑提高了效率,使得程式和裝置

新開了執行緒來處理,這是毫無疑問的...

參考文獻:  advanced windows

linux核心之裝置I O塊

為了優化定址操作,核心既不會簡單的按請求接收次序,也不會立即將請求提交給磁碟。相反,核心在提交前,先執行名為合併與排序的預操作,這種預操作可以極大的提高系統的整體效能。在核心中負責提交i o請求的子系統統稱為i o排程程式。i o排程程式將磁碟i o資源分配給系統中掛起的塊i o請求。具體的說,這種...

同步裝置IO

檔案裝置 createfile 可以指定是同步還是非同步,失敗返回invalid handle value而不是null,非同步裝置開啟成功函式getlaseerror返回error io pending錯誤碼 getfilesizeex 獲取檔案的邏輯大小 setendoffile 設定檔案尾,可...

IO虛擬化之裝置透傳

io虛擬化實現的方式有很多種,有軟體模擬 半虛擬化 裝置直接分配 單根io虛擬化。pci裝置直接分配 裝置直接分配 device assignment 也稱為 device pass through。就是將宿主機host中的物理 pci 裝置直接分配給客戶機guest使用,虛擬機器獨佔這個pci裝置...