趙美珍
(中國艦船研究設計中心 武漢 430064)
?
Linux下多進程編程在海洋環境信息系統中的應用*
趙美珍
(中國艦船研究設計中心 武漢 430064)
介紹了Linux操作系統下進程的數據結構,多進程編程的應用方法,包括進程狀態的管理及進程間相互通信機制。分析了多進程在該系統中應用的必要性,設計了多進程編程在系統人機交互界面與網絡通信中具體實現方案,解決了系統中網絡通信阻塞與人機交互界面顯示間的制約矛盾,通過進程間通信實現了經網絡獲取的基礎導航數據實時動態顯示的功能。實驗測試表明達到了良好的界面顯示與網絡通信并存的效果。
海洋環境信息系統; Linux; 多進程; 網絡通信
Class Number TP316.8
近年來,操作系統Windows一統天下的局面正在逐漸被Linux打破,Linux操作系統正以其獨特的魅力得到越來越多使用者的青睞。在Linux操作系統下開發應用程序不但會獲得較高的運行效率,而且可通過較小的投入獲得較大的收益。
目前,某海洋環境信息系統就是在該平臺下實現的。海洋環境信息應用系統集成海洋中溫度、鹽度、密度、聲場、海流、潮汐、水深、底質等諸多信息,為船舶航行、操縱等活動提供必要的支持和保障。由于海洋信息的復雜多樣性以及信息傳輸要求的高效性,對信息的處理能力將是選用操作系統的一項重要參考。使用Linux這樣一個功能強大的多用戶多任務網絡操作系統環境,開發應用程序對海洋信息的處理成為了可能。
2.1 Linux進程數據結構分析
進程是程序執行的基本單位,它是特定程序的個體實例化。按照Linux的定義,進程就是處于執行期的程序。進程并不是僅指一段可執行的代碼,通常還包括一些資源,如打開的文件,進程的地址空間處理器狀態、寄存器的內容等[1~2]。
Linux內核利用一個數據結構代表一個進程。在該結構中保存進程的屬性和其他信息。在此對比較重要的域進行分析。
1) volatile long state:用于保存進程的狀態,在進程的生命期內,可以從該域獲得自己的狀態。
2) struct thread_info *thread_info:當前進程的一些運行環境信息。
3) int prio,static_prio:prio表示優先級,static_prio表示靜態優先級。
4) struct list_head run_list:表示運行隊列,在該隊列中包含所有可運行的進程。
5) int exit_code,exit_signal:分別用于存放進程的退出值和終止信號,是將子進程的退出值傳給父進程的方式。
6) pid_t pid:進程的唯一標識符。
7) struct task_struct*real_parent:用于標識該進程的父進程的描述符。若該進程的父進程已經死亡,那么該域將指向init()的進程描述符。
8) struct list_head children:指向該進程的子進程的列表。
9) uid_t uid,euid,suid,fsuid:uid用于保存創建該進程的用戶的ID。
在Linux中,內核將這些結構體用兩種方式組織起來:(1)用一個哈希表的形式,(2)用一個雙向循環鏈表將所有task_struct組織起來。
2.2 Linux基本進程函數庫
1) 啟動新進程
int system(const char*string)。
2) 替換進程映像
exec函數系列由一組相關的函數組成,它們在進程的啟動方式和程序參數的表達方式上各有不同。一個exec函數可以把當前進程替換為一個新進程。
3) 復制進程映像

圖1 復制進程映像過程
fork()函數,實現復制進程映像。在父進程中的fork()調用返回的是新進程的子進程的PID。新進程將繼續執行,就像原進程一樣,不同之處在于,子進程中的fork調用返回的是0。父子進程可以通過這一點來判斷究竟誰是父進程,誰是子進程。具體實現流程如圖1所示。
4) 等待一個進程
可以通過在父進程中調用wait函數讓父進程等待子進程的結束。這個調用返回子進程的PID,它通常是已經結束運行的子進程的PID。狀態信息允許父進程了解子進程的退出狀態[3~5]。
Linux系統中常用的進程通信機制包括管道、信號量、共享內存和消息隊列[2,7]。下面分別進行介紹。
3.1 管道
管道是許多應用程序的基本構建模塊。管道是半雙工的,數據只能向一個方向流動,如需要雙向通信時,需建立兩個管道。管道對于管道兩端的進程而言,單獨構成一個文件系統。它們的數據是一個字節流,類似于TCP連接。在某一進程往管道中寫入數據前,要求另外某一進程在該管道上等待數據的到達,如果讀出者不存在,則先有寫入者是沒有意義的。
3.2 信號量
為了防止多個程序同時訪問一個共享資源,通過生成并使用令牌來授權,即在任一時刻只能有一個執行線程訪問代碼的臨界區域。常使用信號量完成這種對資源訪問的管理。
3.3 共享內存
共享內存允許兩個不相關的進程訪問同一邏輯內存。共享內存是在兩個正在運行的進程之間傳遞數據的一種非常有效的方式。共享內存是有IPC為進程創建的一個特殊的地址范圍,它將出現在該進程的地址空間中。其他進程可以將同一段共享內存連接到它們自己的地址空間中。所有進程都可以訪問共享內存中的地址。如果一個進程更新了其中的數據,其他的進程會立即更新[6]。
3.4 消息隊列
消息隊列可以認為是一個消息鏈表。有足夠寫權限的進程可往隊列中寫入消息,有足夠讀權限的進程可從隊列中讀出消息。每個消息是一個記錄,它由發送者賦予一個優先級。一個進程可往某一隊列中寫入消息后終止,讓另一個進程在后某個時刻讀出這些消息。這跟管道是相反的[8]。
在上述四種進程間通信技術中,每種技術都有自己的特點和使用范圍,可以根據需求進行選擇應用。
4.1 多進程應用在本系統應用中的必要性
海洋環境信息系統主要由終端顯示處理器和網絡通信子系統構成。系統終端顯示器完成人機交互功能,實現對多種海洋信息查詢和航海作業操作。
為提高海洋環境信息系統處理性能,從以下幾方面因素考慮,采用多進程并發處理是比較合適的。
1) 時間因素。網絡通信通常要求系統能并發處理多種任務,而串行處理必然降低系統資源利用率和處理效率。
2) 應用處理對象因素。海洋信息種類繁多,需進行大量信息數據庫操作,如批量數據裝載、海量數據的查詢統計等,其主要瓶頸為I/O,啟用多進程無助于性能改善。相應的,如果應用存在大量計算處理,則采用多個進程并行處理可提高性能。
3) 網絡實現機制因素。基于TCP/IP協議族的socket網絡編程默認狀態是阻塞的。阻塞機制是為防止進程在等待中通過循環反復查詢某一條件造成系統資源的浪費[9]。雖然可以使用fcntl()函數使其成為非阻塞的socket,但由于海洋環境信息系統終端顯示處理器要處理及管理眾多信息,與外部進行網絡通信只是其部分功能,為對系統資源的合理分配利用,可以選擇阻塞socket。而阻塞的socket又帶來一定的不足,它使人機交互界面無法顯示。而使用多進程將可以很好地解決該問題。
4) 開發環境因素。本實例Linux操作系統。
該系統是一個多用戶、多任務、交互式的網絡操作系統,其開發環境支持子進程的創建,而且實現較為容易。
4.2 多進程編程在本系統中設計方案
基于以上分析,系統各進程功能獨立,需求時能相互通信是最理想狀態。

圖2 系統多進程的父子關系圖
1) 系統多進程方案
在系統設計中,采用了樹形結構進行復制進程映像操作。將人機交互界面作為程序主進程,網絡通信部分作為它的子進程。又對網絡傳輸的不同信息進行多次復制進程映像操作,從而形成多種網絡信息處理進程。其結構簡意圖如圖2所示。
2) 系統多進程通信機制
系統人機交互界面與網絡通信間的關系主要是將經網絡獲取的導航信息及部分海洋環境信息實時顯示在人機交互界面的動態顯示區。由多進程方案設計可以知道兩者是處于不同的進程,此時是需要進程間通信的。經仔細分析以上幾種進程間通信機制,選擇共享內存方式實現窗口顯示與網絡通信的信息交互比較合適的。

圖3 海洋環境信息系統人機交互界面圖
3) 進程狀態的管理及資源的回收
通過上述相關方案設計,可以解決網絡通信阻塞與人機交互界面顯示間的制約矛盾,并能很好地對各種海洋環境信息進行處理。但因網絡信息的動態性,將產生大量僵尸進程。因此,進程的管理及資源的回收是系統多進程應用設計所必須考慮的問題。
對進程狀態的管理設計如下操作。在系統應用主程序中設置信號處理函數。當子進程結束時系統捕獲該信號并進行相應處理。具體設計如下:在應用主程序中使用signal(SIGCHLD,ClearChild);語句。當系統收到SIGCHLD信號后調用ClearChild函數。而在ClearChild函數內部又調用waitpid函數(wait函數族中的一個)來收集子進程信息,從而避免僵尸進程的產生。
系統采用如上所述的多進程方案,通過網絡技術將現場傳感器獲取的基本導航信息和海域環境信息傳送給終端顯示處理器。在通信子進程中進行解析處理,利用共享內存的進程間通信機制將基本導航信息及部分海洋環境信息實時顯示。

表1 測試數據列表
為確認多進程方案在海洋環境信息系統中解決問題的處理能力,進行了以VxWorks 5.4為客戶端的網絡測試,其測試結果如表1所示。可以看到發送時間間隔的減小,數據包的增大,會帶來一定量的丟包率。但從系統硬件設備及網絡應用協議因素等方面考慮,系統是滿足性能要求的。
本文通過多進程編程在海洋環境信息系統中的應用,解決了海洋環境信息系統人機交互界面與網絡通信并行工作問題,實現了人機交互界面上實時顯示網絡獲取的基礎導航數據。通過對系統的測試,發現其運行效率、穩定性和可靠性都比較高,達到令人滿意的效果。實驗證明,該方案是行之有效的。
[1] 吳國偉,李張,任廣臣.Linux內核分析及高級編程[M].北京:電子工業出版社,2008:11-20.
[2] 毛德操,胡希明.Linux內核源代碼情景分析[M].杭州:浙江大學出版社,2001:21-30.
[3] 陳健,宋健建.Linux程序設計[M].第3版.北京:人民郵電出版社,2007:36-40.
[4] 朱珂.Linux編程白皮書[M].北京:機械工業出版社,2000:9-11.
[5] 劉軍.UNIX環境下的多進程編程[J].電腦知識與技術,2008,2:265-267.
[6] 王文啟,韓秀玲,孫波.基于MiniGUI的多進程圖形用戶界面的研究[J].微計算機信息,2007,23:78-80.
[7] 程樹良.UNIX下的多進程及進程間的通信[J].交通與計算機,2000,2:40-2.
[8] 胡英楣,沈文海,宋之光.多進程并發在國內氣象通信系統的應用[J].應用氣象學報,2007,12:878-885.
[9] 陳遠森,鄧可.UNIX網絡實用編程技術[M].北京:水利水電出版社,2000:31-40.
[10] 高峰.基于Linux的船用海洋環境數據庫系統設計與實現[D].哈爾濱:哈爾濱工程大學碩士學位論文,2008:8-17,19-38,48-57.
[11] 許兆新,方明,徐婧.基于國際標準的電子海圖顯示系統設計[J].計算機與數字工程,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日
趙美珍,女,碩士,工程師,研究方向:船舶導航系統設計。
TP316.8
10.3969/j.issn.1672-9730.2015.12.029