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