李金忠 唐衛東 夏潔武 王巧玲 胡運全
(井岡山大學信息科學與傳媒學院,江西吉安343009)
近年來,分布式并行計算已經成為解決科學研究和工程技術問題的嶄新手段和方式。但在許多應用領域,由于其數據需要共享存儲,且分布于網絡鏈路上的各計算機間通常協同并行運行,因此解決分布式并行計算中的同步以確保所訪問數據的一致性是一個重要問題。實踐表明,分布式系統中的同步問題常常比單處理器或者多處理器系統中的同步更加困難[l]。
解決讀寫控制問題的策略很多,如管程、消息傳遞、事件等傳統方法,但它們是較低級的同步機制,需要使用非常復雜的邏輯來解決,可理解性、可驗證性等都不能讓人滿意[2]。而基于活動對象(Active Object,AO)的ProActive有著較高層次的并發特征,易于開發并行、分布式、多線程的應用程序,且易于安全地實現潛在的復雜的同步策略,可應用于不同的同步策略,且能在不阻塞正讀或寫的情況下為讀操作或寫操作指派不同的優先權。ProActive用來解決讀寫控制問題具有顯著優勢,顯示出其高水平的同步能力。
基于此,本文將多個讀操作和寫操作分布在不同的主機上,給出了分布式系統環境下的一種讀寫同步控制模型。在Fedora 8操作系統下,利用ProActive中間件編寫程序,通過XML部署描述器編寫部署文件,配置SSH,仿真實現了該問題,使之能在多機多虛擬機上執行演示,為解決分布式并行計算中的同步問題提供了一種新方法。
分布式系統是由自主計算機組成的,這些計算機一起工作,對用戶來說就像是一個單一連貫的系統,其最主要目標是使用戶能夠方便地訪問遠程資源,并且以一種受控的方式與其他用戶共享這些資源。維持共享數據的順序一致性的同時能夠處理共享數據上的并發操作,對于分布式系統而言是非常重要的[l]。分布式系統中,允許系統中各主機多用戶同時并行讀取共享存儲數據,但當某個用戶在寫數據時,任何其他的用戶既不能讀也不得寫該數據。它所滿足的條件是:讀/讀允許、讀/寫互斥、寫/寫互斥,否則,將引起訪問沖突,破壞數據的完整性、一致性、正確性,產生不安全性。
讀寫控制問題[2]是指保證一個寫操作必須與其它寫操作或讀操作互斥地訪問共享數據的同步問題。它是一類讀寫操作受限的同步問題。考慮到讀操作和寫操作爭奪訪問共享數據時可以具有不同的優先權,它可拓展出3種控制方式:讀優先、寫優先、公平競爭。對于讀優先控制方式,當不斷出現新的讀操作時,會使得讀操作結盟,長期占用壟斷共享數據,導致寫操作被“餓死”。而寫優先控制方式中,當新的寫操作繼續產生時,會使得寫操作結盟,長期禁止讀操作,壟斷共享數據,導致讀操作被“餓死”。但在公平競爭控制方式中,盡管不斷出現新的讀操作或寫操作,也只能按一定原則順序推進執行,不會結盟壟斷,也不會導致寫操作或讀操作被“餓死”。

圖l為分布式系統環境下的一種讀寫同步控制模型,在該模型中,中間件層延伸到了m臺主機上,且提供了相同的接口,由分布式計算來決定某臺主機扮演協助者——控制器,以防止網絡中的這些主機上的Readers和Writers執行操作上的沖突(寫寫操作和讀寫操作沖突)。
由法國的INIRA小組開發的ProActive[3]是基于并行、分布式和協同及多線程計算的網格中間件,同時是一個具有靈活性和安全性的基于主動對象模式的統一體系架構。
AO是ProActive開發并行應用的一個活動和分布的基本單元,實際上是由兩個對象組成:一個Body和一個標準的java對象。Body主要負責接收對AO的調用請求,并把他們加入請求隊列中,和其他已經部署好的AO協同工作,且可以指定同步方式,默認情況下是FIFO.AO是在標準對象的基礎上增加了位置透明、活動透明和同步三種功能。
ProActive提供一種高級同步機制的類庫用于編寫同步協作應用程序,通過創建ObjectForSynchronous-Call類的AO控制同步調用,結合類(如Service等)和接口(如 RunActive、Body等)及方法 isAwaited、wait-For、waitForAll、waitForAny等可容易和安全地實現潛在復雜的同步機制。
ProActive提供了基于XML部署描述器,可在本地機器或者使用 ssh、rlogin、rsh、LSF、globus、pbs等協議在遠程機器上創建Java虛擬機(Java VirtualMachines,JVM),并映射虛擬節點(Virtual Node,VN)到該 JVM。一個XML部署文件指定VNS→JVMS→Machines的映射,它主要由 componentDefinition(定義、命名 VN)、deployment(指定VN包含的JVM)、infrastructure(指定啟動JVM的具體參數信息)三部分構成。一個Pro-Active應用程序能夠在不改變源代碼的情況下,用不同的協議部署在不同的主機上,在程序運行時從部署文件獲取節點部署信息。
ProActive是通過SSHProcess來實現動態部署的,通過SSH連接實現遠程計算節點的啟動。為了避免運行中輸入密碼的問題,先要配制基于密鑰的認證方式。首先生成密鑰對,修改目錄.ssh的權限;然后拷貝公用密鑰到遠程主機;次在本地主機執行ssh-agent、ssh-add等命令設置無密碼SSH連接,而使其能自動登入到遠程主機。更多信息請參考文獻[3,6]。
圖形監控工具IC2D,實現對分布式應用程序的遠程監控和管理,可查看、管理、控制、獲取當前主機、JVM、VN和AO等信息,對每個AO的狀態、AO間的通信及拓撲等都可捕獲顯示。有關ProActive的更多知識請參考文獻[3~5]。
基于ProActive提供的高級同步機制編寫程序,程序中涉及的主要類有:ReaderWriter、Reader、Writer、ReaderDisplay和AppletReader等,為使其能在多機上進行實驗演示,還需編寫部署文件readers.xml,且需配置SSH等,使多個讀/寫操作分布在不同的主機上。其中的initActivity方法的核心為:
……
try{proActiveDescriptor=ProActive。getProactiveDescriptor("file:"+ "..//..//descriptors//readers.xml");
//指定具體的部署文件readers.xml
}catch(ProActiveException e){ System.err.println("**ProActiveException**");}
proActiveDescriptor.activateMappings( );//根 據 部 署 文 件,啟 動JVM,激活VNS
VirtualNode vn = proActiveDescriptor.getVirtualNode( "readers-Node");
//在所給VN指定的JVM中創建readersNode節點的AO群
try{nodes=vn.getNodesURL();}catch(NodeException e){System.err.println("**NodeException**");}
Object[]param=new Object[]{org.objectweb.proactive.ProActive.getStubOnThis(),
new Integer(ReaderWriter.DEFAULT_POLICY)};
try{ rw = (ReaderWriter)org.objectweb.proactive.ProActive.newActive(ReaderWriter.class.getName(),
param);
//以數組param中的數據作參數,創建ReaderWriter類的AO,且把這些AO部署在本地JVM的默認節點上
}catch(Exception e){e.printStackTrace();}
param=new Object[3];
param[0] =org.objectweb.proactive.ProActive.getStubOnThis();
param[l]=rw;
for(int i=0;i<3;i++){param[2]=new Integer(i);
try{
readers[i]=(Reader)org.objectweb.proactive.ProActive.newActive(Reader.class.getName(),param,nodes[i]);
//以數組param中的數據作參數,創建Reader類的AO,且把這些AO部署到nodes中指定的節點上
writers[i]=(Writer)org.objectweb.proactive.ProActive.newActive(Writer.class.getName(),param,nodes[i]);
}catch(Exception e){e.printStackTrace();}
……
實驗環境:由三臺同構PC機互連網絡,OS為Fedora 8,IDE 采用Eclipse3.2.2,中間件ProActive,監控工具IC2D.依據ProActive提供的基于XML的部署描述器編寫部署文件reader.xml,映射VN到計算節點上,使各Reader和Writer均分布于三臺PC機中,如圖2所示。

其中每臺主機上各分布一個Reader和一個Writer,這些Reader和Writer可同時依據“讀優先”、“寫優先”或“公平競爭”三種策略中任意一種策略共同訪問主機zhong上的共享數據區。

使用SSH協議部署在不同的節點上,同時通過IC2D監控其運行結果以仿真該讀/寫控制模型。圖3和圖4為某一瞬間的多機多虛擬節點運行結果IC2D監控快照(限于篇幅,只列出了運行結果的動態變化過程中的某一瞬間的兩個監控圖):啟動了3臺主機和4個JVM,對應于4個計算節點,創建了8個AO,這些AO之間通過RMI互相通信,且受控于活動對象ReaderWriter。主機 zhong啟動 2個 JVM,生成 2個VN,創建4 個 AO:Reader、Writer、ReaderWriter和 ReaderDisplay各l個,且分布于這2個JVM中;另2臺主機各啟動l個JVM,生成l個VN,每個JVM中各創建2個AO:Reader和Writer各l個。圖3中主機leea上的Writer當前正處于寫操作狀態,Reader處于等待狀態;主機 lee和zhong上的 Reader、Writer均處于等待狀態,這三臺主機的AO間互相通信且受限于所采用的同步策略而同步地執行。圖4中主機lee上的Writer當前正處于寫操作狀態,Reader處于等待狀態;主機zhong和leea上的Reader、Writer處于等待狀態。
文獻[2]是利用JAC技術在單機上解決讀/寫控制問題的,而本文是在文獻[2]的基礎上構造了分布式系統環境下的一種讀寫同步控制模型,在分布式系統環境下利用ProActive中間件編寫程序,配置SSH和通過XML部署描述器編寫部署文件實現該模型。通過仿真實驗,跟蹤各快照的動態變化過程,結果表明:在該模型上,無論應用哪種同步策略:“讀優先”、“寫優先”或“公平競爭”,不同的Reader和Writer都能以控制器所選的同步策略的規則去訪問共享數據,且在該仿真程序不停頓的情況下,也可應用于不同的同步策略。
分布式系統環境下的讀寫同步控制模型為分布式數據庫的讀寫建立了一個模型,為分布式系統環境下的同步機制提供了新思路。但本文仿真只是考慮了6個Reader和Writer分布在三臺主機上,其規模較小。下一步的工作是增加Reader和Writer及主機的數量,在更大規模下去驗證該仿真方法的健壯性、可靠性和容錯性。
l 辛春生,陳宗斌等譯.分布式系統原理與泛型(第2版)[M].北京:清華大學出版社,2008.
2 夏潔武,李金忠,胡運全.基于JAC技術實現讀寫控制的仿真研究[J].機床與液壓,2009,37(5):l55 ~l56,l69
3 ProActive[ EB/OL].http://www-sop inria.fr/oasis/ProActive/.June,2009.
4 董明剛,梁正友.Windows下基于ProActive并行計算的關鍵技術[J].計算機工程,2006,32(l9):l05 ~l07
5 梁正友,張凌,董守斌.基于ProActive的網格應用程序開發方法[J].計算機應用,2005,25(6):l4l4 ~l4l6
6 SSH[EB/OL]/http://www.openssh.org/.June,2009.
7 唐衛東,劉昌鑫,李萍萍等.基于Open-L系統及遞歸表示的虛擬植物模型[J].農業機械學報,2009,40(l):l67 ~l70
8 唐衛東,李萍萍,盧章平.虛擬植物系統模型耦合構建技術[J].農業機械學報,2008,39(5):94 ~98,l07