鄒云峰, 張昕, 李撈扒
(1.國網(wǎng)江蘇省電力公司 電力科學(xué)研究院,南京 210019;2.河海大學(xué) 計算機與信息學(xué)院,南京 211100)
軟件運行平臺是一組軟件基礎(chǔ)設(shè)施,屬于系統(tǒng)軟件的范疇[],為應(yīng)用軟件的運行提供各種必要的支撐。從系統(tǒng)角度來看,軟件運行平臺負(fù)責(zé)管理和協(xié)調(diào)底層軟硬件資源,有效地橋接各種異構(gòu)環(huán)境下的資源調(diào)用,增加互操作性,從而充分發(fā)揮軟硬件資源的計算能力[2]。從應(yīng)用角度來說,軟件運行平臺抽象了操作系統(tǒng)底層的細節(jié),封裝了系統(tǒng)現(xiàn)有的應(yīng)用接口函數(shù),為用戶提供了上層應(yīng)用的軟件編程模式與簡單易用的人機交互界面。隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,軟件平臺需要連接并管理網(wǎng)絡(luò)上功能結(jié)構(gòu)各異、數(shù)量眾多的軟硬件資源,因此,具有協(xié)調(diào)和整合能力的中間件逐漸演變成為網(wǎng)絡(luò)環(huán)境中典型的軟件運行平臺[3]。
然而,作為軟件平臺的中間件存在諸多局限,如它們的運行環(huán)境相對封閉、靜態(tài)與固定,而互聯(lián)網(wǎng)環(huán)境則為開放、動態(tài)且多變[3],這就對軟件運行平臺提出了更高的要求。
在實際應(yīng)用中,軟件運行平臺也面臨這樣的挑戰(zhàn)。在一些互聯(lián)網(wǎng)產(chǎn)品的IT型企業(yè)中,隨著業(yè)務(wù)需求的不斷拓展,越來越多的與新業(yè)務(wù)對應(yīng)的功能需要整合到現(xiàn)有的軟件系統(tǒng)架構(gòu)之中。企業(yè)為了節(jié)約運營成本,必須考慮如何將原有系統(tǒng)與新系統(tǒng)協(xié)同作業(yè),因此基于中間件構(gòu)建的應(yīng)用系統(tǒng)如何實現(xiàn)跨異構(gòu)平臺的互操作成為了平臺技術(shù)研究的重點和難點。目前軟件平臺類型多樣,但沒有統(tǒng)一的通信協(xié)議,為實現(xiàn)跨平臺的互操作,需要解決不同平臺間的進程通信問題,這是軟件平臺開發(fā)中所涉及的關(guān)鍵問題之一。
針對這一問題,本文設(shè)計了一種具有高效可靠進程間通信機制和可移植性的軟件運行平臺。其本質(zhì)是作為消息中間件,用來建立連接、接收和轉(zhuǎn)發(fā)消息等,屏蔽了不同操作系統(tǒng)的細節(jié)差異,為平臺所支撐的上層服務(wù)端應(yīng)用提供可靠的運行環(huán)境,從而大大減輕了上層應(yīng)用的開發(fā)復(fù)雜度,有效縮短了開發(fā)流程,提高工作效率。本文主要從3個方面介紹跨系統(tǒng)軟件運行平臺的實現(xiàn)技術(shù)。首先,建立高效可靠的進程間通信機制;其次,封裝系統(tǒng)API函數(shù),提供部分通用的服務(wù)和管理程序;最后,編寫自動化編譯部署腳本,實現(xiàn)平臺源代碼的定制化編譯,并部署到操作系統(tǒng)環(huán)境中。
平臺分成四個模塊,分別是功能區(qū)、通信機制、被封裝的API庫、定制化編譯部署。功能區(qū)以API庫和通信機制為基礎(chǔ),配置文件提供配置參數(shù)和全局變量,初始化進程、監(jiān)控進程、通信進程、交互進程和通用服務(wù)實現(xiàn)系統(tǒng)初始化、進程監(jiān)控、消息接收和轉(zhuǎn)發(fā)及定時器等功能;通信機制模塊實現(xiàn)進程通信功能;被封裝的API庫提供統(tǒng)一的上層接口;定制化編譯部署用于在不同操作系統(tǒng)上部署本平臺。平臺框架,如圖1所示。

圖1 平臺框架圖
跨平臺是軟件開發(fā)領(lǐng)域一個重要的概念,指應(yīng)用軟件不必依賴于某些特定的操作系統(tǒng)或編譯器,也不依賴于特定的硬件環(huán)境。它泛指程序語言、軟件或硬件設(shè)備可以在多種作業(yè)系統(tǒng)或不同硬件架構(gòu)的計算機上運作[4]。它能夠快速地移植到各種操作系統(tǒng)平臺上,在功能上類似于自適配通信環(huán)境(ACE)框架[5-7]的OS適配層。
IPC(Inter-Process Communication,進程間通信)是應(yīng)用程序中經(jīng)常涉及的重要問題,進程間的數(shù)據(jù)交互對于應(yīng)用軟件來說至關(guān)重要。不同的操作系統(tǒng)平臺IPC機制是有區(qū)別的,類UNIX系統(tǒng)(包括Linux)的IPC主要包括管道、信號、消息隊列、共享內(nèi)存、信號量;Windows系統(tǒng)的IPC主要包括文件映射、共享內(nèi)存、匿名管道、命名管道、郵件槽、剪貼板、動態(tài)數(shù)據(jù)交換(DDE)、套接字Socket[8]。
進程通信主要包括3個方面:進程內(nèi)線程通信;同主機進程間線程通信;不同主機進程間線程通信。通過對不同操作系統(tǒng)IPC機制的分析,本文選擇使用以消息隊列、共享內(nèi)存和Socket為組合的IPC機制。
消息隊列機制是在內(nèi)核中開辟的用于保存消息的鏈表,并作為一種競爭的共享資源,被有通信需求的多進程公用。消息來源為發(fā)送方的進程,隊列中已有的消息將由指定進程接收[9]。Windows系統(tǒng)可以運用消息緩沖通信來達到消息隊列的功能。
共享內(nèi)存機制允許兩個或多個進程共用指定的存儲區(qū),這一段存儲區(qū)可以被兩個或多個進程映射至自身的地址空間中[10],數(shù)據(jù)不需要在進程間復(fù)制,所以這是最快的一種IPC方式,它適用于通信數(shù)據(jù)量較大的場合。
Socket與一般IPC方式有所不同,它專門用于位于不同主機上的進程間網(wǎng)絡(luò)通信。網(wǎng)絡(luò)上的不同程序進行數(shù)據(jù)交換,一般通過一個雙向的通信連接實現(xiàn),這個雙向鏈路的一端就是一個Socket[11]。Socket的跨平臺性比其它IPC機制好得多,不但Linux和類UNIX系統(tǒng)可以使用,Windows系統(tǒng)同樣可以使用,同時Socket連接是網(wǎng)絡(luò)環(huán)境下進程間通信必不可少的方式[12-14]。
系統(tǒng)應(yīng)用程序編程接口API(Application Programming Interface)是由操作系統(tǒng)提供的函數(shù),供應(yīng)用程序訪問特定資源。API的封裝方法是在代碼的編寫過程中,使用條件編譯[15]。通常情況下,源程序所有行都會被編譯,為了實現(xiàn)跨平臺,本文使用#ifdef、#ifndef和#pragma等條件編譯指令以操作系統(tǒng)類型作為條件進行編譯。通過使用條件編譯將不同系統(tǒng)上功能相似的系統(tǒng)API函數(shù)統(tǒng)一起來,生成相同的開發(fā)接口,從而實現(xiàn)API封裝。
功能區(qū)以封裝的系統(tǒng)API和通信機制為基礎(chǔ),包括配置文件、初始化進程、監(jiān)控進程、通信進程、交互進程和通用服務(wù)。
配置文件是一組.ini文件,用來保存平臺相關(guān)設(shè)置,平臺可以依據(jù)此文件加載系統(tǒng)所需要的環(huán)境設(shè)置和文件集合,從而方便程序的移植。
初始化進程用于讀取配置并初始化環(huán)境,實現(xiàn)上層應(yīng)用的啟動和統(tǒng)計,其流程圖,如下圖2所示。

圖2 初始化進程流程圖
監(jiān)控進程通過兩種方法檢查上層應(yīng)用的工作狀態(tài):目標(biāo)應(yīng)用是否異常結(jié)束;向目標(biāo)應(yīng)用發(fā)送測試消息,若不能及時收到響應(yīng),則認(rèn)為目標(biāo)應(yīng)用出現(xiàn)異常。若檢測到目標(biāo)應(yīng)用出現(xiàn)異常則重啟之。
通信進程通過創(chuàng)建子線程實現(xiàn)建立外部連接、接收外部消息、外部消息對內(nèi)分發(fā)、內(nèi)部消息對外分發(fā)功能,包括消息接收子線程和消息發(fā)送子線程。
交互進程實現(xiàn)平臺與上層應(yīng)用開發(fā)人員的交互功能,包括進程跟蹤、調(diào)試等功能,用于方便開發(fā)人員開發(fā)和調(diào)試程序。
通用服務(wù)主要包括定時器、消息發(fā)送與接收及進程信息獲取等功能。
編譯之前,需要配置操作系統(tǒng)的環(huán)境變量等參數(shù),為了簡化環(huán)境變量的配置過程,本文創(chuàng)建了shell腳本——setenv.sh文件,用來配置編譯環(huán)境,為makefile自動化編譯提供所需的參數(shù)或變量,主要步驟如下:
a) 清理工作目錄
b) 設(shè)置全局環(huán)境變量
c) 判斷系統(tǒng)類型
d) 根據(jù)系統(tǒng)類型設(shè)置不同的參數(shù)
配置環(huán)境變量后,利用make工具將大型的開發(fā)項目分解成多個更加容易管理的模塊,對于包含眾多源文件的應(yīng)用程序,使用makefile可以簡明地理順各文件之間錯綜復(fù)雜的依賴關(guān)系,同時它還可以簡化編譯過程,實現(xiàn)自動化編譯。開發(fā)程序通常按照不同的模塊,分別存放在不同的目錄中,這樣需要編寫多個makefile文件。本軟件平臺對多級目錄使用makefile時,在總目錄和每個子目錄下均創(chuàng)建makefile,然后由主目錄makefile調(diào)用子makefile,編譯順序是由主目錄makefile決定的,這樣就使編譯過程變得清晰直觀。
不同操作系統(tǒng)的安裝流程略有區(qū)別,但總體步驟是一樣的:
a) 將源代碼復(fù)制到環(huán)境的工作目錄下
b) 進入程序主目錄
c) 對shell腳本賦予執(zhí)行權(quán)限
d) 執(zhí)行setenv腳本,設(shè)置環(huán)境變量
e) 清空前一次編譯生成的文件
f) 編譯并安裝部署
系統(tǒng)類型:LINUX REDHAT,版本信息:Linux version 2.6.18,編譯器版本:gcc 4.1.2 20080704 (Red Hat 4.1.2-48),Make版本:make 3.79。
將源碼拷貝至PROJECT_DIR目錄下,進入程序主目錄,順序執(zhí)行以下命令:
chmodu+x*.sh #對shell腳本賦予執(zhí)行權(quán)限
./setenv_64.sh #設(shè)置環(huán)境變量
make Clean
make Install #編譯安裝
安裝完成后,在$PROJECT_DIR/bin生成可執(zhí)行程序和腳本,如圖3所示。
在PROJECT_DIR/lib生成庫文件,如圖4所示。
系統(tǒng)類型:HP-UX,版本信息:HP-UX 11.31,Patch版本為高于或等于0803,編譯器:aCC 3.5以上,Make版本:make 3.79。

圖3 Linux系統(tǒng)環(huán)境下生成的可執(zhí)行程序和腳本

圖4 Linux系統(tǒng)環(huán)境下生成的庫文件
將源碼拷貝至$PROJECT_DIR目錄下,進入程序主目錄,順序執(zhí)行以下命令:
chmodu+x*.sh #對shell腳本賦予執(zhí)行權(quán)限
./setenv_64.sh #設(shè)置環(huán)境變量
make Clean
make Install #編譯安裝
安裝完成后,在$PROJECT_DIR/bin生成可執(zhí)行程序和腳本,如圖5所示。

圖5 HP-UX系統(tǒng)環(huán)境下生成的可執(zhí)行程序和腳本
在$PROJECT_DIR/lib生成庫文件,如圖6所示。

圖6 HP-UX系統(tǒng)環(huán)境下生成的庫文件
本文的主要工作是給出了一個基于跨系統(tǒng)進程間通信的軟件運行平臺設(shè)計方案。它基于跨系統(tǒng)技術(shù)實現(xiàn),利用通用的3種通信機制——消息隊列、共享內(nèi)存和Socket的組合實現(xiàn)消息傳遞,通過封裝系統(tǒng)API,屏蔽了異構(gòu)操作系統(tǒng)的細節(jié)差異,提供統(tǒng)一的訪問接口和部分通用的服務(wù)與管理程序,通過定制化編譯部署方法使之能夠適應(yīng)不同的操作系統(tǒng),為其支撐的上層應(yīng)用提供良好的運行環(huán)境。