趙美珍
(中國艦船研究設(shè)計中心 武漢 430064)
?
Linux下多進程編程在海洋環(huán)境信息系統(tǒng)中的應(yīng)用*
趙美珍
(中國艦船研究設(shè)計中心 武漢 430064)
介紹了Linux操作系統(tǒng)下進程的數(shù)據(jù)結(jié)構(gòu),多進程編程的應(yīng)用方法,包括進程狀態(tài)的管理及進程間相互通信機制。分析了多進程在該系統(tǒng)中應(yīng)用的必要性,設(shè)計了多進程編程在系統(tǒng)人機交互界面與網(wǎng)絡(luò)通信中具體實現(xiàn)方案,解決了系統(tǒng)中網(wǎng)絡(luò)通信阻塞與人機交互界面顯示間的制約矛盾,通過進程間通信實現(xiàn)了經(jīng)網(wǎng)絡(luò)獲取的基礎(chǔ)導(dǎo)航數(shù)據(jù)實時動態(tài)顯示的功能。實驗測試表明達到了良好的界面顯示與網(wǎng)絡(luò)通信并存的效果。
海洋環(huán)境信息系統(tǒng); Linux; 多進程; 網(wǎng)絡(luò)通信
Class Number TP316.8
近年來,操作系統(tǒng)Windows一統(tǒng)天下的局面正在逐漸被Linux打破,Linux操作系統(tǒng)正以其獨特的魅力得到越來越多使用者的青睞。在Linux操作系統(tǒng)下開發(fā)應(yīng)用程序不但會獲得較高的運行效率,而且可通過較小的投入獲得較大的收益。
目前,某海洋環(huán)境信息系統(tǒng)就是在該平臺下實現(xiàn)的。海洋環(huán)境信息應(yīng)用系統(tǒng)集成海洋中溫度、鹽度、密度、聲場、海流、潮汐、水深、底質(zhì)等諸多信息,為船舶航行、操縱等活動提供必要的支持和保障。由于海洋信息的復(fù)雜多樣性以及信息傳輸要求的高效性,對信息的處理能力將是選用操作系統(tǒng)的一項重要參考。使用Linux這樣一個功能強大的多用戶多任務(wù)網(wǎng)絡(luò)操作系統(tǒng)環(huán)境,開發(fā)應(yīng)用程序?qū)Q笮畔⒌奶幚沓蔀榱丝赡堋?/p>
2.1 Linux進程數(shù)據(jù)結(jié)構(gòu)分析
進程是程序執(zhí)行的基本單位,它是特定程序的個體實例化。按照Linux的定義,進程就是處于執(zhí)行期的程序。進程并不是僅指一段可執(zhí)行的代碼,通常還包括一些資源,如打開的文件,進程的地址空間處理器狀態(tài)、寄存器的內(nèi)容等[1~2]。
Linux內(nèi)核利用一個數(shù)據(jù)結(jié)構(gòu)代表一個進程。在該結(jié)構(gòu)中保存進程的屬性和其他信息。在此對比較重要的域進行分析。
1) volatile long state:用于保存進程的狀態(tài),在進程的生命期內(nèi),可以從該域獲得自己的狀態(tài)。
2) struct thread_info *thread_info:當(dāng)前進程的一些運行環(huán)境信息。
3) int prio,static_prio:prio表示優(yōu)先級,static_prio表示靜態(tài)優(yōu)先級。
4) struct list_head run_list:表示運行隊列,在該隊列中包含所有可運行的進程。
5) int exit_code,exit_signal:分別用于存放進程的退出值和終止信號,是將子進程的退出值傳給父進程的方式。
6) pid_t pid:進程的唯一標(biāo)識符。
7) struct task_struct*real_parent:用于標(biāo)識該進程的父進程的描述符。若該進程的父進程已經(jīng)死亡,那么該域?qū)⒅赶騣nit()的進程描述符。
8) struct list_head children:指向該進程的子進程的列表。
9) uid_t uid,euid,suid,fsuid:uid用于保存創(chuàng)建該進程的用戶的ID。
在Linux中,內(nèi)核將這些結(jié)構(gòu)體用兩種方式組織起來:(1)用一個哈希表的形式,(2)用一個雙向循環(huán)鏈表將所有task_struct組織起來。
2.2 Linux基本進程函數(shù)庫
1) 啟動新進程
int system(const char*string)。
2) 替換進程映像
exec函數(shù)系列由一組相關(guān)的函數(shù)組成,它們在進程的啟動方式和程序參數(shù)的表達方式上各有不同。一個exec函數(shù)可以把當(dāng)前進程替換為一個新進程。
3) 復(fù)制進程映像
圖1 復(fù)制進程映像過程
fork()函數(shù),實現(xiàn)復(fù)制進程映像。在父進程中的fork()調(diào)用返回的是新進程的子進程的PID。新進程將繼續(xù)執(zhí)行,就像原進程一樣,不同之處在于,子進程中的fork調(diào)用返回的是0。父子進程可以通過這一點來判斷究竟誰是父進程,誰是子進程。具體實現(xiàn)流程如圖1所示。
4) 等待一個進程
可以通過在父進程中調(diào)用wait函數(shù)讓父進程等待子進程的結(jié)束。這個調(diào)用返回子進程的PID,它通常是已經(jīng)結(jié)束運行的子進程的PID。狀態(tài)信息允許父進程了解子進程的退出狀態(tài)[3~5]。
Linux系統(tǒng)中常用的進程通信機制包括管道、信號量、共享內(nèi)存和消息隊列[2,7]。下面分別進行介紹。
3.1 管道
管道是許多應(yīng)用程序的基本構(gòu)建模塊。管道是半雙工的,數(shù)據(jù)只能向一個方向流動,如需要雙向通信時,需建立兩個管道。管道對于管道兩端的進程而言,單獨構(gòu)成一個文件系統(tǒng)。它們的數(shù)據(jù)是一個字節(jié)流,類似于TCP連接。在某一進程往管道中寫入數(shù)據(jù)前,要求另外某一進程在該管道上等待數(shù)據(jù)的到達,如果讀出者不存在,則先有寫入者是沒有意義的。
3.2 信號量
為了防止多個程序同時訪問一個共享資源,通過生成并使用令牌來授權(quán),即在任一時刻只能有一個執(zhí)行線程訪問代碼的臨界區(qū)域。常使用信號量完成這種對資源訪問的管理。
3.3 共享內(nèi)存
共享內(nèi)存允許兩個不相關(guān)的進程訪問同一邏輯內(nèi)存。共享內(nèi)存是在兩個正在運行的進程之間傳遞數(shù)據(jù)的一種非常有效的方式。共享內(nèi)存是有IPC為進程創(chuàng)建的一個特殊的地址范圍,它將出現(xiàn)在該進程的地址空間中。其他進程可以將同一段共享內(nèi)存連接到它們自己的地址空間中。所有進程都可以訪問共享內(nèi)存中的地址。如果一個進程更新了其中的數(shù)據(jù),其他的進程會立即更新[6]。
3.4 消息隊列
消息隊列可以認(rèn)為是一個消息鏈表。有足夠?qū)憴?quán)限的進程可往隊列中寫入消息,有足夠讀權(quán)限的進程可從隊列中讀出消息。每個消息是一個記錄,它由發(fā)送者賦予一個優(yōu)先級。一個進程可往某一隊列中寫入消息后終止,讓另一個進程在后某個時刻讀出這些消息。這跟管道是相反的[8]。
在上述四種進程間通信技術(shù)中,每種技術(shù)都有自己的特點和使用范圍,可以根據(jù)需求進行選擇應(yīng)用。
4.1 多進程應(yīng)用在本系統(tǒng)應(yīng)用中的必要性
海洋環(huán)境信息系統(tǒng)主要由終端顯示處理器和網(wǎng)絡(luò)通信子系統(tǒng)構(gòu)成。系統(tǒng)終端顯示器完成人機交互功能,實現(xiàn)對多種海洋信息查詢和航海作業(yè)操作。
為提高海洋環(huán)境信息系統(tǒng)處理性能,從以下幾方面因素考慮,采用多進程并發(fā)處理是比較合適的。
1) 時間因素。網(wǎng)絡(luò)通信通常要求系統(tǒng)能并發(fā)處理多種任務(wù),而串行處理必然降低系統(tǒng)資源利用率和處理效率。
2) 應(yīng)用處理對象因素。海洋信息種類繁多,需進行大量信息數(shù)據(jù)庫操作,如批量數(shù)據(jù)裝載、海量數(shù)據(jù)的查詢統(tǒng)計等,其主要瓶頸為I/O,啟用多進程無助于性能改善。相應(yīng)的,如果應(yīng)用存在大量計算處理,則采用多個進程并行處理可提高性能。
3) 網(wǎng)絡(luò)實現(xiàn)機制因素。基于TCP/IP協(xié)議族的socket網(wǎng)絡(luò)編程默認(rèn)狀態(tài)是阻塞的。阻塞機制是為防止進程在等待中通過循環(huán)反復(fù)查詢某一條件造成系統(tǒng)資源的浪費[9]。雖然可以使用fcntl()函數(shù)使其成為非阻塞的socket,但由于海洋環(huán)境信息系統(tǒng)終端顯示處理器要處理及管理眾多信息,與外部進行網(wǎng)絡(luò)通信只是其部分功能,為對系統(tǒng)資源的合理分配利用,可以選擇阻塞socket。而阻塞的socket又帶來一定的不足,它使人機交互界面無法顯示。而使用多進程將可以很好地解決該問題。
4) 開發(fā)環(huán)境因素。本實例Linux操作系統(tǒng)。
該系統(tǒng)是一個多用戶、多任務(wù)、交互式的網(wǎng)絡(luò)操作系統(tǒng),其開發(fā)環(huán)境支持子進程的創(chuàng)建,而且實現(xiàn)較為容易。
4.2 多進程編程在本系統(tǒng)中設(shè)計方案
基于以上分析,系統(tǒng)各進程功能獨立,需求時能相互通信是最理想狀態(tài)。
圖2 系統(tǒng)多進程的父子關(guān)系圖
1) 系統(tǒng)多進程方案
在系統(tǒng)設(shè)計中,采用了樹形結(jié)構(gòu)進行復(fù)制進程映像操作。將人機交互界面作為程序主進程,網(wǎng)絡(luò)通信部分作為它的子進程。又對網(wǎng)絡(luò)傳輸?shù)牟煌畔⑦M行多次復(fù)制進程映像操作,從而形成多種網(wǎng)絡(luò)信息處理進程。其結(jié)構(gòu)簡意圖如圖2所示。
2) 系統(tǒng)多進程通信機制
系統(tǒng)人機交互界面與網(wǎng)絡(luò)通信間的關(guān)系主要是將經(jīng)網(wǎng)絡(luò)獲取的導(dǎo)航信息及部分海洋環(huán)境信息實時顯示在人機交互界面的動態(tài)顯示區(qū)。由多進程方案設(shè)計可以知道兩者是處于不同的進程,此時是需要進程間通信的。經(jīng)仔細(xì)分析以上幾種進程間通信機制,選擇共享內(nèi)存方式實現(xiàn)窗口顯示與網(wǎng)絡(luò)通信的信息交互比較合適的。
圖3 海洋環(huán)境信息系統(tǒng)人機交互界面圖
3) 進程狀態(tài)的管理及資源的回收
通過上述相關(guān)方案設(shè)計,可以解決網(wǎng)絡(luò)通信阻塞與人機交互界面顯示間的制約矛盾,并能很好地對各種海洋環(huán)境信息進行處理。但因網(wǎng)絡(luò)信息的動態(tài)性,將產(chǎn)生大量僵尸進程。因此,進程的管理及資源的回收是系統(tǒng)多進程應(yīng)用設(shè)計所必須考慮的問題。
對進程狀態(tài)的管理設(shè)計如下操作。在系統(tǒng)應(yīng)用主程序中設(shè)置信號處理函數(shù)。當(dāng)子進程結(jié)束時系統(tǒng)捕獲該信號并進行相應(yīng)處理。具體設(shè)計如下:在應(yīng)用主程序中使用signal(SIGCHLD,ClearChild);語句。當(dāng)系統(tǒng)收到SIGCHLD信號后調(diào)用ClearChild函數(shù)。而在ClearChild函數(shù)內(nèi)部又調(diào)用waitpid函數(shù)(wait函數(shù)族中的一個)來收集子進程信息,從而避免僵尸進程的產(chǎn)生。
系統(tǒng)采用如上所述的多進程方案,通過網(wǎng)絡(luò)技術(shù)將現(xiàn)場傳感器獲取的基本導(dǎo)航信息和海域環(huán)境信息傳送給終端顯示處理器。在通信子進程中進行解析處理,利用共享內(nèi)存的進程間通信機制將基本導(dǎo)航信息及部分海洋環(huán)境信息實時顯示。
表1 測試數(shù)據(jù)列表
為確認(rèn)多進程方案在海洋環(huán)境信息系統(tǒng)中解決問題的處理能力,進行了以VxWorks 5.4為客戶端的網(wǎng)絡(luò)測試,其測試結(jié)果如表1所示??梢钥吹桨l(fā)送時間間隔的減小,數(shù)據(jù)包的增大,會帶來一定量的丟包率。但從系統(tǒng)硬件設(shè)備及網(wǎng)絡(luò)應(yīng)用協(xié)議因素等方面考慮,系統(tǒng)是滿足性能要求的。
本文通過多進程編程在海洋環(huán)境信息系統(tǒng)中的應(yīng)用,解決了海洋環(huán)境信息系統(tǒng)人機交互界面與網(wǎng)絡(luò)通信并行工作問題,實現(xiàn)了人機交互界面上實時顯示網(wǎng)絡(luò)獲取的基礎(chǔ)導(dǎo)航數(shù)據(jù)。通過對系統(tǒng)的測試,發(fā)現(xiàn)其運行效率、穩(wěn)定性和可靠性都比較高,達到令人滿意的效果。實驗證明,該方案是行之有效的。
[1] 吳國偉,李張,任廣臣.Linux內(nèi)核分析及高級編程[M].北京:電子工業(yè)出版社,2008:11-20.
[2] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2001:21-30.
[3] 陳健,宋健建.Linux程序設(shè)計[M].第3版.北京:人民郵電出版社,2007:36-40.
[4] 朱珂.Linux編程白皮書[M].北京:機械工業(yè)出版社,2000:9-11.
[5] 劉軍.UNIX環(huán)境下的多進程編程[J].電腦知識與技術(shù),2008,2:265-267.
[6] 王文啟,韓秀玲,孫波.基于MiniGUI的多進程圖形用戶界面的研究[J].微計算機信息,2007,23:78-80.
[7] 程樹良.UNIX下的多進程及進程間的通信[J].交通與計算機,2000,2:40-2.
[8] 胡英楣,沈文海,宋之光.多進程并發(fā)在國內(nèi)氣象通信系統(tǒng)的應(yīng)用[J].應(yīng)用氣象學(xué)報,2007,12:878-885.
[9] 陳遠森,鄧可.UNIX網(wǎng)絡(luò)實用編程技術(shù)[M].北京:水利水電出版社,2000:31-40.
[10] 高峰.基于Linux的船用海洋環(huán)境數(shù)據(jù)庫系統(tǒng)設(shè)計與實現(xiàn)[D].哈爾濱:哈爾濱工程大學(xué)碩士學(xué)位論文,2008:8-17,19-38,48-57.
[11] 許兆新,方明,徐婧.基于國際標(biāo)準(zhǔn)的電子海圖顯示系統(tǒng)設(shè)計[J].計算機與數(shù)字工程,2005,33(9):93-96.
The Application of Multi-Processes Programming under Linux in the Information System of the Ocean Environment
ZHAO Meizhen
(China Ship Development and Design Center, Wuhan 430064)
This paper introduced the structure of a process under Linux operation system and the method of multi-processes programming. It included the management of the statement of a process and the inter-process communication. It analyzed the necessaries of multi-processes programming to the Information System of the Ocean Environment(ISOE) and designed the implementation of Multi-Processes programming between man-machine mutual interface and net communication. It solved the conflicts between net communication blocking and man-machine mutual interface showing. Meanwhile it accomplished the basic navigation data got by net communication showing in real-time by inter-process communication. Testes showed the application could make ISOE work well by good man-machine mutual interface and net communication.
information system of the ocean environment, Linux, multi-processes, net communication
2015年6月17日,
2015年7月31日
趙美珍,女,碩士,工程師,研究方向:船舶導(dǎo)航系統(tǒng)設(shè)計。
TP316.8
10.3969/j.issn.1672-9730.2015.12.029