基于驅動程序的協議棧設計
基于驅動程序的協議棧設計,相比于傳統的基于任務的協議棧設計來說有兩點好處:(1)效率更高;(2)對于有多個協議棧的系統來說,有更大的兼容性。
1 基于任務的方式
在我們比較兩種設計方式的技術細節之前,我們必須了解它們。傳統的設計方式包括將協議棧置于實時操作系統或內核之上,但是大多數實時操作系統不提供網絡互連的框架。所以,協議棧的設計者們不得不利用實時操作系統提供的機制――Task。圖1說明了如何利用任務來實現一個三層間通信的協議。每一層被作為一個單獨的任務,外加任務間通信機制負責傳送數據和控制包上下通過協議棧,程序設計者負責定義層與層之間的接口和一個應用程序接口(API),以利于應用程序員傳送和接收數據。
在這里存在幾個效率不高的來源:首先,正如圖1中點線所說明的,當包在應用程序、上層的通信協議,以及網絡接口的設備驅動程序之間交換時,下層的操作系統正忙于上下文切換,每一次實時操作系統掛起其中一個任務,恢復執行另一個任務,時間都浪費在存取任務上下文中,考慮到每一個包無論是發還是收,都要通過協議棧的每一層,上下文切換的確造成了巨大的浪費。另外,當數據和控制包在應用程序任務和網絡接口之間流動時,包含此類信息的緩沖區必然重復在任務間通信隊列加入或刪除。然而,這個系統開銷是很大的,這本身是由于系統在隊列操作時必然包括需與中斷和上下文切換隔離的臨界區。因此,不僅時間浪費于隊列操作,而且整個系統對一些重要的事件例如中斷的響應變得延遲。
2 基于驅動程序的方法
另外一種選擇是將協議棧各層置于實時操作系統之中,圖2說明了基于此種方案,同樣的三層間通信協議是如何實施的。兩者之間的顯著區別在于:各個協議層是作為驅動程序模塊,而不是任務來實現的。
另外一個改變在于:協議棧之上還有一個網絡服務模塊。加入這個模塊的目的在于將與協議無關的網絡特性抽象化。也就是說,它將應用程序設計者用來在協議棧間收發數據的應用程序接口(API)標準化,例如:你的嵌入式系統可能需要同時支持基于調制解調器接口的PPP連到一臺遠程計算機和一個紅外接口用來與本地計算機通信。然而程序設計者不必為兩個事件各自編程,它只需用網絡服務模塊提供API與其它計算機進行通信,唯一的區別在于通過哪個網絡接口而已。
基于驅動程序方式的一個顯著優點就在于上下文切換的次數僅僅是基于控制臺應用程序的函數,并不基于協議層的數量。這樣一來就可以減少實時操作系統保存和恢復任務上下文的次數,因而空出時間作更有意義的事,例如執行應用程序代碼。
另一個好處在于,數據和控制信息更簡單的在層與層之間傳輸,因為所有的協議層都處于同一個上下文中,所以相關的數據結構自動地為上下層所接受,結果你不必把他們在任務間隊列中傳送,由此產生的是,同時也避免了那些臨界區系統由此可改進中斷和優先級任務的響應時間。
3 緩沖區拷貝
緩沖區拷貝效率不高的第一個潛在因素在于:當數據在層與層之間傳輸時,數據緩沖區的分配、拷貝和釋放,這與協議棧的結構無關,僅與緩沖區本身的結構有關。
評論