應用DCOM技術在遠程教育中實現組件化的網絡虛擬實驗室探討
佚名
摘要:為了使虛擬實驗室適合遠程網絡教學的需要,使它能夠在網絡上工作,利用DCOM技術以C/S方式實現了組件化的虛擬實驗室。將模擬計算部分作為服務器端,界面輸入/輸出作為客戶端。在多用戶的情況下DCOM沒有提供分布式策略,則利用調度對象來平衡負載,從而引入分布式處理方式。
關鍵詞:遠程教育;DCOM;虛擬實驗室;客戶/服務器(C/S)
Abstract: In order to make the virtual laboratory for teaching the need for long-distance network to enable it to work on the network, the use of DCOM technology to C / S achieved the components of the virtual laboratory. The simulation as part of the server-side, the interface I / O as a client. In many cases, users did not provide DCOM Distributed strategy, the use of targeted scheduling to balance the load, so the introduction of distributed processing way.
Key words: distance education; DCOM; virtual laboratory; client / server (C / S)
前言
隨著Internet的不斷擴大,日益增多的計算機正在連接到互聯網上,以共享資源。于是遠程教育作為一種新的教育模式被提上了議事日程,現代計算機技術和網絡技術為遠程教育的發展提供了強有力的技術保障。尤其是WWW瀏覽器技術和數據庫技術的發展,使得教學活動不再受地域和時間上的限制,利用Internet就能進行實時或非實時的教與學,從而實現了跨越時空的學習。然而,大學實驗室里許多實驗課,在遠程教育的網上學習中將會有許多困難。如何在網絡課件中解決好這個問題,對于進一步辦好遠程教育是具有重要實際意義的。本文利用DCOM(Distributed Component Object Module)技術,將單機板的虛擬電路實驗系統升級為網絡版的虛擬電路實驗系統。
虛擬電路實驗系統是一個用于仿真電子線路實驗的軟件。用戶通過界面在計算機屏幕上選用各種元器件搭建電路,測試波形,得到實驗數據等結果,以模擬真實實驗的方式使用戶掌握有關電路方面的知識。從功能上講,虛擬實驗室系統分為兩個模塊:一個是仿真計算部分,它是整個系統的核心部分,負責輸入數據的處理、大量的模擬計算,并向輸出界面部分傳送結果;另一個則包括輸入界面和輸出界面兩部分。輸入部分完成用戶電路搭建時的界面處理,從某種角度來講,它完成了數據的采集。同樣,輸出界面完成結果的輸出,如波形輸出、數據輸出等。
為了滿足遠程教學的需要,必須將單機虛擬實驗系統改造為可在網絡上運行的系統。從通信的開銷上來講,Socket是最合適的。但是Socket本身是面向通信的,有復雜的通信細節需要處理。而且,Socket服務器對于客戶來說,很難提供穩定的應用程序接口,一旦服務器發生了變化,客戶必須相應地變化,不利于客戶和服務器單獨開發和維護。另外一種則是文本采用的COM(Component Object Module)技術。
1 組件對象模型(COM)
現代的軟件開發都以模塊方式進行。每個模塊均有自己的功能,并與其它模塊以接口進行通信。于是,復雜的軟件系統就可以用搭積木的方式進行。這就是組件軟件的基本思想。COM就是實現軟件組件化的一種努力。
實際上,COM是一種規定了組件之間的接口標準。COM還引入了面向對象的思想,COM對象是一個能完成一定功能的軟件模塊。COM對象是組件的基本構成,它以接口的方式向其它對象或軟件提供服務。通常情況下,對象的服務與被服務都是客戶/服務器的關系。COM對象不同于C++對象。C++對象是類的實例。C++是面向對象的編程語言,是人們在源碼級試圖實現軟件模塊化的一種努力。COM對象是二進制的規范。換言之,C++在源碼級提供了代碼重用的便利,而COM是在二進制級提供了可重用性。COM的二進制級重用是通過COM對象工作來實現的。它主要有兩種方式:(1)包容,一個對象通過利用另一對象的功能實現同樣的接口。(2)聚合,一個對象直接將另一對象的接口提供給客戶。
由于COM的實現是在二進制級,而不是源碼級,于是決定了COM與語言的無關性。一個用C或C++實現的COM可以與一個用BASIC實現的客戶正常地通信。因此,整個軟件的一部分可以用一種語言開發,而另一部分可以使用其它語言。這給軟件開發者在根據性能的要求做出編程語言選擇時提供了方便。COM的另一個特性是進程的透明性。一個組件可以有很多種形式出現,比如DLL,EXE等。DLL形式的組件與客戶程序工作在同一進程,EXE組件工作在獨立的進程。無論是進程內的組件還是進程外的組件,對于客戶來講都是同樣的,客戶無需關心進程間的通信。進程間的通信是復雜的,然而COM掩蓋了這種復雜性。
2 分布式組件對象模型(DCOM)
COM給軟件開發帶來了極大的便利。但是,在網絡環境下,單機上的組件重用和進程透明性已不能滿足需要,COM必須擴展。Microsoft的DCOM便是COM在網絡環境下的無縫擴展,DCOM能夠支持在局域網、廣域網,甚至在Internet上與不同計算機的對象之間的通信。使用DCOM,應用程序可以在位置上達到分布性,從而滿足客戶和應用的需求。
DCOM隱藏了網絡通信的細節,在可以利用的網絡協議的支持下,組件或客戶無需關心對方組件的位置,便可以進行通信。因此DCOM具有協議無關性。在網絡環境下,組件之間的通信不像在COM的進程內或進程間的LPC(Local Procedure Call),而是以RPC(Remote Procedure Call)來完成的。客戶與COM對象必須通過Proxy和Stub來進行通信。Proxy工作在客戶進程中,Stub工作在服務器進程中。此外,DCOM提供了所有在網絡上工作的軟件都應有的特殊性與安全性。
3 COM/DCOM在網絡虛擬實驗室中的應用
從程序設計的角度來看,COM/DCOM的結構是這樣的:對象是構建組件的基本元素,而服務器為組件提供進程內/外的服務,提供了組件工作的場所。對象是一個自包含的結構,提供一定的功能,它不能直接被客戶使用,客戶必須通過接口訪問它。對象必須通過接口來表現自己的功能,甚至對象的創建都不能由客戶直接完成,對象的創建必須借助一個特殊的對象,即類廠來完成。
對于客戶,它可以是一個組件對象也可以是一個支持COM的普通程序。它通過COM API來調用類廠創建對象,并增加引用計數,來決定對象的生存期。這樣COM庫和COM服務器會在適當的時候卸載。
雖然C++對象和COM對象有本質的區別,但是它們在二進制一級的構造上有一定的相似性,C++對象和COM對象都使用VTable。而且,C++的對象描述能力使它很容易創建COM。因此C++是實現COM的最佳選擇。Visual C++在CO
M編程方面提供了兩種方式:一種是MFC(Microsoft Foundation Class);一種是ATL(Active Template Library)。MFC是以嵌套類的方式來實現COM的;ATL大量地使用于模板,采用多重繼承的方式來實現COM。但不管是MFC還是ATL,都為開發軟件提供了極大的方便,很多的處理都由MFC提供,比如引用計數、服務器鎖計數、類廠等。盡管MFC和ATL都能實現COM,但MFC是一種開發完全應用程序的有效手段。相比之下,ATL是專為COM設計的。所以,ATL更適合創建快速小型化的COM組件。
3.1 服務器
在本文設計的網絡虛擬實驗室系統中,將模擬計算部分作為服務器。對于單用戶服務器的情況,可以使用STA(Single Thread Apartment)線程模型。在這種情況下,分作為一個COM對象。對于在這個組件來說,它至少應該提供一個Simulator對象、一個Isimulate接口和兩種方法。
interface IDatdT’: IUnknown
{
HRESULT InputData( [ in]... );
HRESULT OutputData( [ out]... );
…
};
這個對象是一個可連接對象。在模擬算法完成之后,它必須向用戶發出通知。而用戶程序內置了一個接收器。客戶使用InputData()向服務器傳送采集的數據,服務器在處理數據完成之后,客戶通過OutputData()取得處理結果。
對于多用戶服務器,實際上只要簡單地在這個COM組件中加入注冊表信息,或者用CoCreatelnst9nEX(),以主機信息為參數就可以在指定主機上創建對象,利用DCOM進行通信。位置透明性使客戶很容易使用DCOM。如果為客戶指定相應的主機(即服務器),客戶就可以創建并使用對象。
3.2 多用戶服務器的負載平衡
在多用戶的情況下,當用戶的數量達到一定程度的時候,多個用戶在主機上創建的對象實例會使服務器的壓力增大,從而造成服務器性能的下降,影響服務質量。當然,可以使用多個服務器來提供服務,人工地平衡多個服務器上的負載,但這將給維護帶來極大的困難。一旦用戶群動態地變化,服務器的負載平衡將被打破。顯然,這種沒有任何分布式策略的分布式COM(DCOM)是不夠的。雖然DCOM提供了位置透明性,但是沒有提供分布式的策略,分布式策略需要軟件開發者來提供。因此,提供負載平衡是DCOM組件開發的一個重要任務。為了平衡多個服務器的負載,建立了如下圖所示的系統結構。
對于模擬計算的COM對象,為了避免多次重復地創建和釋放,本文采用了服務對象。服務對象是已創建的COM對象實例。該系統中還引入了簡單的調度對象。調度對象是一個中間對象,它以STA(單線程Apartment)方式工作。調度對象負責建立服務對象Simulator,維護主機列表COSERVERINFO Server[N]、對象列表ISimulate*pISimulate[N]和對象狀態列表Int State[N]。主機列表保存主機名字,對象列表存放對象接口指針,狀態列表是一個對象的狀態值。對于對象來講,它有三種狀態:(1)未創建或創建失敗;(2)忙;(3)閑。三個列表都以全局變量的形式出現。由于使用了STA,可以不必考慮對象的同步問題。但是,多個同類對象訪問全局變量仍然可能造成對象在線程上的安全問題。因此,本文使用臨界區(Critical Section)來同步。此外,調度對象是一個可連接對象,它必須與服務對象通信并獲得服務對象的狀態。
調度對象負責在主機列表指定的主機上創建服務對象,并初始化。所有的客戶在需要服務的時候應向調度對象發出請求。當有客戶向調度對象請求服務時,調度對象檢索主機列表、對象列表和狀態列表,在選定主機上查詢并檢查對象的有效性,獲取服務對象接口指針,并返回給客戶,然后客戶與服務對象通信。根據COM的特性,此時客戶和服務對象之間的通信是直接進行的,不經過調度對象。調度對象根據什么原則來獲取某個主機上的對象是一個策略上的問題,實際應用中必須考慮主機的負載平衡。對于復雜的系統,這種策略可能相當的復雜。然而,為了簡單起見,本文采用了以執行任務的對象在主機上的數量多少作為平衡負載的標準。在客戶使用完畢對象后,對象激發一個調度對象事件,調度對象負責將對象狀態復位。因此,調度對象是一個可連接對象,實現了一個接收器,接收來自服務對象的事件。
此外,調度對象還負責將服務對象卸載。應該看到調度對象的引入增加了網絡通信量,但對于采用分布式策略的系統來說是必要的。實際上調度對象很大程度上起到了目錄服務的作用。如果必要的話,調度對象加上適當的模塊可以作為一個簡單的中間管理模塊,比如控制用戶登錄、限制用戶數量等。
3.3 客戶
客戶控制著虛擬實驗室數據的采集和輸出表現,它將直接面對用戶。對于客戶來講,它只需要在數據處理的時候,在執行調度的主機上創建調度對象,本文來自范文中國網www.fw789.com。調度對象負責返回可用的服務對象。客戶將數據交給服務對象來處理,并取得輸出值。在客戶與服務對象通信的過程中,客戶還必須接收來自服務對象激發的事件,所以客戶必須內置接收器。
4 結束語
本文使用了調度對象來實現負載的平衡,采用的平衡策略是以運行在主機上的對象數目作為衡量負載的標準,這對于簡單的系統已經足夠了,但對于比較復雜的系統,必須有更復雜的負載平衡策略。
DCOM雖然提供了很多的優點,如位置透明性、協議無關性等,然而這是以增加開銷為代價的。與Socket比較,DCOM的開銷要大一些,但是DCOM提供的方便超出了它帶來的額外開銷。
參考文獻:
[1]潘愛民 COM原理與應用[M].北京,清華大學出版社。1999。
[2]劉紹光,徐凱聲.三層C/S結構機理及微軟的解決方案—Windows DNA。
交通與計算機,2000-(2)