對於核心程式來說,同步和非同步是經常用來處理某些請求的。。。
他們的區別在於執行的效率以及執行的方法上。。。
對於應用層上的實現,可以有三個函式吧:
1:readfiel()
2:writefile()
3:deviceiocontrol()
他們都可以來設定不同還是非同步的方式,之前的帖子又說道過這個,不過是在核心程式下實現的,現在來說說應用層它是怎麼來執行的。
還是以deviceiocontrol 為 例子吧:
1:同步的時候:
當函式得到 irp 後, 它會將irp 傳到核心, 也就是 irp_mj_device_control 請求。。
然後核心就回相應這個事件,而這個函式就回等待這個事件被底層完成,並且返回,它才回去做其他的處理,
在這期間,底層的iocompleterequest(), 會去呼叫 waitforobjectrequset(), 這個函式,
從這裡,可見請求的處理方式,以及核心程式的強大。。。
2:非同步處理:
顧名思義吧,就是各幹各的,當我把請求發給你之後,我就不再對你負責了,就像兩個物件,分手了,誰還去對你負責呀。。。
比喻而已,呵呵。。。之後,當請求完成時,底層會通知上層這個請求完成。。。
在非同步處理的過程中,如果不使用iocompleterequest(),那麼一定要將此 irp 出於掛起狀態,也就是標記未決,在鍵盤過濾中
有這樣的使用。。。函式是 iomarkpending(irp);
從上邊可以容易的看出,非同步對於對執行緒的支援比較強大,效率也是比較高的。。。
同樣,在之前對 磁碟還原, 虛擬磁碟的設計,以及 鍵盤,usb 等的過濾驅動的學習,我感覺,完成函式在處理非同步的請求方面
有著非常大的作用。。。
對於這些發到底層的請求,核心程式會怎麼樣去處理呢?
一般來說可以有三種處理方法:
1:首先,我來說一下過濾驅動的處理方法吧,畢竟我對這方面是比較感興趣的。。。
對於過濾驅動而言,攔截時他的首要任務,對於它關係的請求,他當然是不會放過的哦。。。
1)我們可以得到放送下來的請求,然後決定是繼續發往下層裝置,讓底層裝置處理,2)當然,我們同樣可以直接的返回請求,
那麼底層就不知道這回事了,也就達到了過濾,3)我們還可以更改請求資訊,達到某些目的,加密,或者對資料進行處理,
防火牆,殺軟。。。。他們都是這麼做的。。。
應用層上的同步問題(3)
由於,現在的程式多執行在多執行緒的環境中,資料的處理的順序一下子就變得重要了起來,我們知道,在核心中,我們可以使用 事件,自選鎖,或者互斥體等方式來達到同步的處理,防止操作被搶占,他們的幾乎都是使用提高中斷級的方式來達到的,也就是 windows 是乙個基於 可搶占模式的系統,只要你的 或者中斷級足...
應用層協議 原理
應用層協議的實現,只需要寫出能夠執行在不同的端系統 伺服器 手機 電腦等 和通過網路彼此通訊的程式。因為網路核心裝置 路由器 交換機等,不包括端系統裝置 並不在應用層上起作用,只在網路層及下面層次起作用,所以不需要為網路核心裝置寫對應的應用程式,即開發應用程式的時候只需要考慮適配端系統,不需要考慮網...
應用層學習筆記一 應用層協議原理
研究網路應用程式的核心是寫出能夠執行在不同的端系統和通過網路彼此通訊的程式。客戶 伺服器體系 客戶與伺服器程序 程序與計算機網路之間的介面 程序定址 標識接收程序需要兩種資訊,主機的位址以及定義在目的主機中的接收程序的識別符號。主機由ip位址標識。目的地埠號用於標識目的主機的接收程序。從四個方面對應...