蔣 躍,田 田,夏永紅,匡華星
(中國船舶重工集團公司第七二四研究所,南京 211153)
當前,作為艦艇平臺發展的革命性技術之一的“高性能公共計算環境”已經得到了越來越多的關注。作為下一代艦船的信息整合與處理中心,通過“高性能公共計算環境”可以對平臺內的所有資源(包括射頻資源、面陣資源、信息處理資源等)進行統一任務調度和聯合資源分配,以充分發揮系統整體資源優勢。
由于具有高效性、穩定性、安全性等特點[1],Linux系統更適合于作為“高性能公共計算環境”的操作系統。美國的DDG-1000全艦計算環境就采用了刀片服務器架構,操作系統為Red Hat Linux。國內的中標麒麟桌面操作系統采用強化的Linux內核,實現對X86及國產CPU平臺的全面兼容。基于上述原因,開展了基于Linux操作系統開發環境的雷達全流程仿真軟件開發和仿真試驗,為雷達信息處理應用在Linux操作系統上的開發實現積累經驗。本文針對從Windows到Linux的C程序移植,介紹了Linux系統的安裝和開發環境的搭建,并探討了C程序移植的方法和經驗。
在現有的Windows系統下安裝Linux系統有兩種方式可以選擇:一是一般安裝,即分配單獨的硬盤分區用來安裝Linux系統;二是虛擬機安裝,即使用軟件模擬一個具有完整硬件系統功能的計算機并安裝Linux系統。一般安裝可以實現計算機的雙系統,但在使用時只能選擇進入一種操作系統。而虛擬機安裝則能保證新系統在一個完全隔離的環境中工作,虛擬機中安裝和運行的應用程序就像在真正的計算機上一樣。[2]同時,對于Windows用戶來說,虛擬機只是物理計算機上的應用程序,即使虛擬機中安裝的系統發生崩潰也不會影響物理計算機上的Windows系統。更重要的是,虛擬機安裝可以實現Windows系統與Linux系統下資源的拷貝共享,有需要的話完全可以在物理計算機上模擬多臺虛擬的計算機,并且安裝好的虛擬機也可以拷貝到其他物理計算機上使用。因此,本文選擇使用虛擬機在現有Windows系統下安裝Linux操作系統。
在當前的主流虛擬機軟件中,VMware在多操作系統支持和執行效率上都具有比較明顯的優勢,因此本文選擇VMware軟件來創建虛擬機。本文所使用的虛擬機安裝了CentOS 7版本的Linux操作系統。安裝完成后在Windows系統下只需要打開VMware軟件,啟動虛擬機即可登錄CentOS 7,實現Windows與Linux系統的同時工作。在VMware軟件中還自帶了一種增強工具VMware Tools,可以實現物理計算機(Windows)和虛擬機(Linux)或者兩臺虛擬機之間的拷貝功能,方便資源共享和用戶使用。
Eclipse[3]是一個開源免費的基于Java撰寫的集成開發環境(IDE),提供圖形化的編輯和調試界面,可以跨平臺,在Windows和Linux系統下都可以使用。另外,Eclipse本身是可擴展的開發平臺,通過插件可以實現目前主流程序語言諸如C/C++、C#、Java、PHP、Python等等的程序開發。因此,本文選擇在Linux系統下安裝Eclipse來進行C/C++的程序開發。
Eclipse開發程序的流程一般為創建工程->創建文件->編輯文件->編譯工程->運行或調試。由于本文是將Windows系統下的C程序移植到Linux系統中,在創建工程后只需將編輯好的各個工程文件導入即可,再對工程進行編譯、運行或調試。
在將C程序從Windows系統移植到Linux系統的過程中,由于Linux下gcc默認的編譯規則是比VC嚴格的,在VC中編譯通過的程序放到Linux下卻可能出現許多警告錯誤[4]。根據實際的C程序移植經驗,在移植過程中需要注意以下幾方面:
(1) 確保文件名的大小寫正確
雖然在C/C++語言中是區分大小寫的,但對于程序中包含的頭文件,在Windows系統下其文件名大小寫都可以正確編譯,而在Linux系統下卻必須要頭文件的大小寫正確。這是由于ext2文件系統對文件名的大小寫敏感,避免在編譯中出現找不到頭文件的錯誤。
(2) 注意各個系統下獨有的頭文件
在Windows系統下,程序中通常會包含頭文件“windows.h”,若程序需要實現網絡通信,則需包含頭文件“winsock2.h”或者MFC下的“afxsock.h”。這些頭文件都是Windows系統獨有的。因此,程序在移植到Linux系統后,需要將這類頭文件以及一些Windows系統的常量定義說明注釋掉,并且添加Linux系統下對應的頭文件,例如頭文件“sys/socket.h”即可支持實現網絡通信。
(3) 注意VC中獨有的數據類型和關鍵字
VC中__int16、__int32、__int64等獨有的數據類型在Linux系統中編譯器并不支持,無法正確識別這些數據類型。因此,在程序移植后可以將這些數據類型在VC中的定義語句復制到一個頭文件中,并在程序中包含該頭文件。而對于VC中獨有的關鍵字如WORD、DWORD、__asm等等,應盡量避免在程序中使用,或者在移植后用“#ifdef”和“#endif”重新編寫。因此,為提高程序在不同平臺之間的可移植性,在程序編寫過程中應該避免直接使用各編譯器獨有的數據類型或關鍵字。
(4) 注意修改相應函數原型
對于程序中使用標準C/C++語言編寫的函數,在不同系統下基本都可以適用。但是,對于一些系統調用函數,由于Linux與Windows有所區別,需要改變相應的函數原型。例如,要實現網絡通信功能,在Windows中使用MFC下CSocket編程,調用CSocket::Create初始化、CSocket::Bind綁定地址端口、CSocket::SendTo發送內容、CSocket::Close關閉等等,而在Linux中相應地通過socket、bind、sendto、close等函數實現這些功能。若要實現文件指針的移動,在Linux中用fseeko64函數代替Windows下的_fseeki64函數來將文件指針移動到指定的位置。在計算程序運行耗時方面,Windows系統使用QueryPerformanceFrequency和QueryPerformanceCounter函數來計時,而Linux系統下則可以用gettimeofday函數實現計時功能。因此,在程序移植中要實現相同的功能需要改變相應的函數原型。
(5) 注意編譯環境的配置
在Windows系統中,使用VC編寫的工程需要添加頭文件引用路徑以及庫文件的引用路徑和鏈接。相應地,在Linux系統中也要對Eclipse的編譯環境進行配置。由于在程序中采用了Intel IPP函數庫進行加速計算,并且在VC中利用IPP的多線程靜態函數庫進行內部并行加速,在程序移植后也需要進行修改配置。因此,在Linux系統中需要先安裝相應版本的Intel IPP,并且在Eclipse中修改工程屬性,配置IPP的環境變量、頭文件引用路徑、庫文件引用路徑和鏈接。在配置完編譯環境可以正確編譯后,還需要在運行或調試配置中也相應配置IPP的環境變量。
(6) 注意系統文件或路徑
在Windows與Linux系統中,各自的路徑標識符是不同的,因此程序移植后需將路徑中的“\”改為“/”。另外,由于Linux系統中對于文件或者目錄的權限是分為擁有者、群組和其他的,在對文件進行寫操作時需要注意修改文件或目錄的權限,否則無法進行寫操作。
以上幾方面僅是實際C程序移植過程中出現的需要注意的問題。但是,在具體的程序移植過程中可能還會出現更多更復雜的情況,例如移植Windows系統下用MFC編寫的圖形界面程序、多進/線程程序等等都還需要分析程序設計結構,理解程序邏輯模塊,才能更好地完成程序移植。
某型雷達的全流程處理程序原是在Windows系統的VC中實現的,本文將其移植到Linux系統,程序成功編譯并運行,輸出結果與VC程序保持一致,成功完成移植工作。本文所使用的物理計算機為Windows系統,內存為32 GB,處理器為i7-6700K 四核八線程;而創建的虛擬機為Linux系統,內存為4 GB,處理器為雙核。由于全流程處理程序運行所需內存占比較小,且程序內部僅利用雙核進行并行加速,處理結果基本不受兩個系統環境的計算資源影響。下面對兩個系統下程序各功能模塊的處理耗時結果進行對比分析,對比結果如表1所示。

表1 兩個系統下程序各功能模塊處理耗時對比
從表1中可以看出,在讀取數據上Linux系統耗時減少了約20 s,查找包頭兩者耗時差不多,信號處理部分Linux耗時減少了約7 s。雖然在點跡凝聚時Linux耗時多了近5 s,但在發送和記錄點跡以及輸出和發送視頻方面則有了較大提升,耗時節省了約33 s。統計整個程序所有功能模塊的處理時間,Linux系統的耗時比Windows節約了56 s。這是由于Linux系統簡單、占用內存少,可以利用最少的資源最短的時間實現所有功能,而且Linux系統在硬件支持和網絡性能方面較Windows都占優勢。
表2給出了信號處理中各功能模塊的處理耗時對比。從中可以發現,兩個系統下信號處理的各功能模塊的合計耗時與表1中基本相符,且在脈沖壓縮部分Linux的耗時減少更為明顯。

表2 兩個系統下信號處理各功能模塊處理耗時對比
本文針對從Windows到Linux的C程序移植,介紹了Linux系統的安裝和開發環境的搭建,根據實際程序移植經驗給出了C程序移植的方法和需要注意的問題,同時對實際程序各功能模塊的處理耗時結果進行了對比分析,程序在Linux系統下耗時更短。