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