• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      航管仿真訓(xùn)練系統(tǒng)運(yùn)行控制的設(shè)計(jì)與實(shí)現(xiàn)

      2014-08-03 00:53:00陳虹宇董志強(qiáng)李科磊
      關(guān)鍵詞:航管訓(xùn)練組隊(duì)列

      陳虹宇,胡 術(shù),董志強(qiáng),李科磊,殷 源

      (1.四川大學(xué)計(jì)算機(jī)學(xué)院,四川 成都 610064;2.四川大學(xué)國(guó)家空管自動(dòng)化系統(tǒng)技術(shù)重點(diǎn)實(shí)驗(yàn)室, 四川 成都 610045;3.空軍裝備研究院雷達(dá)與電子對(duì)抗所, 北京 100039)

      1 引言

      我國(guó)成都、西安區(qū)域管制中心引進(jìn)了西班牙英德拉(Indra)系統(tǒng),該系統(tǒng)配有模擬仿真訓(xùn)練系統(tǒng),使用與真實(shí)系統(tǒng)一樣的設(shè)備與人機(jī)界面來(lái)訓(xùn)練管制人員。Indra系統(tǒng)是目前中國(guó)引進(jìn)的最先進(jìn)的航管系統(tǒng)?;诒疚奶岢龅姆椒ㄗ灾餮邪l(fā)的系統(tǒng)與Indra配備的模擬仿真訓(xùn)練系統(tǒng)類(lèi)似,提供了對(duì)航空管制員的訓(xùn)練功能。其運(yùn)行控制需求復(fù)雜,不僅要求提供對(duì)多個(gè)組別的模擬飛行員席位和模擬管制員的組隊(duì)訓(xùn)練,還要求提供對(duì)提供服務(wù)的模擬服務(wù)程序均衡地分配計(jì)算資源的能力。針對(duì)航管仿真訓(xùn)練系統(tǒng)的相關(guān)訓(xùn)練特點(diǎn),本文設(shè)計(jì)并完成了基于航管仿真訓(xùn)練系統(tǒng)的運(yùn)行控制系統(tǒng)。

      2 航管仿真系統(tǒng)及運(yùn)行控制功能簡(jiǎn)介

      航管仿真訓(xùn)練系統(tǒng)是用于培養(yǎng)和提高空中交通區(qū)域及進(jìn)近雷達(dá)管制人員管制技能的主要手段和標(biāo)準(zhǔn)設(shè)備,能夠逼真地模擬包括設(shè)備、用戶(hù)界面等所有與訓(xùn)練相關(guān)的對(duì)象。通過(guò)實(shí)時(shí)模擬不同空中交通狀態(tài),以提供一個(gè)接近真實(shí)的工作環(huán)境來(lái)訓(xùn)練管制員,并且提供必要的手段完成這一模擬訓(xùn)練過(guò)程的準(zhǔn)備、運(yùn)行、記錄、回放以及評(píng)估等。當(dāng)代大型航管仿真訓(xùn)練系統(tǒng)可以同時(shí)進(jìn)行多個(gè)組別、不同訓(xùn)練內(nèi)容、科目的訓(xùn)練,其基本組成如圖1所示。該系統(tǒng)均由UNIX操作系統(tǒng)主機(jī)構(gòu)成,仿真軟件采用跨平臺(tái)設(shè)計(jì),可以運(yùn)行在Solaris、Linux等主流操作系統(tǒng)上。

      Figure 1 ATC simulation training system圖1 航管仿真訓(xùn)練系統(tǒng)組成圖

      進(jìn)行航管模擬訓(xùn)練的基本過(guò)程如下:在進(jìn)行仿真訓(xùn)練時(shí),教員席位準(zhǔn)備訓(xùn)練數(shù)據(jù),將訓(xùn)練數(shù)據(jù)分發(fā)給參訓(xùn)主機(jī)后,開(kāi)啟訓(xùn)練過(guò)程,主要完成對(duì)參訓(xùn)的模擬機(jī)長(zhǎng)席位和模擬雷達(dá)管制席位的角色指定,完成一個(gè)模擬機(jī)長(zhǎng)席位和一個(gè)或多個(gè)模擬雷達(dá)管制席位的組隊(duì),在模擬訓(xùn)練服務(wù)器中啟動(dòng)相應(yīng)組別的多個(gè)模擬服務(wù)進(jìn)程。圖1中,模擬機(jī)長(zhǎng)P1和模擬雷達(dá)管制席位R1和R2組成第一組,通過(guò)和模擬訓(xùn)練服務(wù)器交互完成第一組模擬訓(xùn)練任務(wù)。模擬訓(xùn)練服務(wù)器集群中部署相同的進(jìn)程,可以同時(shí)運(yùn)行一組或多組訓(xùn)練服務(wù)程序,為各組模擬機(jī)長(zhǎng)和模擬雷達(dá)管制席位的運(yùn)行提供支撐。教員席位通過(guò)啟動(dòng)訓(xùn)練服務(wù)進(jìn)程、模擬機(jī)長(zhǎng)和模擬管制員席位完成訓(xùn)練組的開(kāi)啟,在訓(xùn)練完成后退出相應(yīng)的訓(xùn)練組進(jìn)程。

      為了簡(jiǎn)化系統(tǒng)的部署,系統(tǒng)設(shè)計(jì)時(shí)各訓(xùn)練組的主機(jī)(含模擬訓(xùn)練服務(wù)器、模擬機(jī)長(zhǎng)和模擬管制員席位)均部署一樣的進(jìn)程,只在運(yùn)行前由教員席位先進(jìn)行訓(xùn)練數(shù)據(jù)準(zhǔn)備,然后將不同訓(xùn)練組的訓(xùn)練數(shù)據(jù)按組分發(fā)到參訓(xùn)主機(jī)的train_num(即訓(xùn)練組號(hào))目錄下,然后用命令行參數(shù)-Tnum(num為訓(xùn)練組號(hào))啟動(dòng)訓(xùn)練的各進(jìn)程,進(jìn)程通過(guò)讀取相應(yīng)的訓(xùn)練數(shù)據(jù)目錄運(yùn)行不同訓(xùn)練組。

      從以上需求來(lái)看,大型航管仿真訓(xùn)練系統(tǒng)對(duì)運(yùn)行控制提出了較高的要求,需合理地調(diào)度模擬訓(xùn)練服務(wù)器的計(jì)算資源,靈活地組合訓(xùn)練組教員和模擬雷達(dá)主機(jī),安全地啟動(dòng)和退出訓(xùn)練組。

      3 訓(xùn)練進(jìn)程組的設(shè)計(jì)

      運(yùn)行控制最基本的要求是對(duì)組成訓(xùn)練組的各進(jìn)程的啟動(dòng)、停止進(jìn)行準(zhǔn)確的控制,并且監(jiān)控其運(yùn)行狀態(tài)。為此,設(shè)計(jì)在系統(tǒng)每個(gè)主機(jī)上部署Agent代理進(jìn)程,通過(guò)教員席位負(fù)責(zé)運(yùn)行調(diào)度的調(diào)度模塊Scheduler對(duì)不同主機(jī)Agent發(fā)出相應(yīng)的啟動(dòng)、關(guān)閉命令,完成訓(xùn)練組的運(yùn)行控制。

      為了(1)在模擬訓(xùn)練服務(wù)器中均衡運(yùn)行不同訓(xùn)練組進(jìn)程;(2)在不同席位中按模擬飛行員、模擬管制員的不同角色啟動(dòng)進(jìn)程,航管模擬訓(xùn)練系統(tǒng)中進(jìn)程以組作為調(diào)度的最小粒度。圖2為三組訓(xùn)練服務(wù)進(jìn)程通過(guò)三臺(tái)模擬訓(xùn)練服務(wù)器為五個(gè)訓(xùn)練組提供服務(wù)的實(shí)例圖。不同進(jìn)程組的運(yùn)行情況,用二元組〈進(jìn)程組編號(hào)/訓(xùn)練組編號(hào)〉對(duì)應(yīng)一個(gè)實(shí)際運(yùn)行的進(jìn)程組,被稱(chēng)為訓(xùn)練進(jìn)程組。

      Figure 2 Distribution of process group and training group in services clusters圖2 服務(wù)集群中進(jìn)程組與訓(xùn)練組的分布

      4 進(jìn)程組運(yùn)行控制

      4.1 進(jìn)程啟動(dòng)方式的選擇

      進(jìn)程組運(yùn)行控制的基礎(chǔ)是通過(guò)Agent實(shí)現(xiàn)對(duì)組內(nèi)進(jìn)程進(jìn)行啟動(dòng)和退出的操作。通過(guò)一個(gè)進(jìn)程對(duì)其他進(jìn)程進(jìn)行啟動(dòng)有多種方式,系統(tǒng)實(shí)驗(yàn)了三種啟動(dòng)方式:

      (1)以fork+子進(jìn)程中exec方式將進(jìn)程作為Agent的子進(jìn)程啟動(dòng)[1],啟動(dòng)后立即獲得被啟動(dòng)進(jìn)程的pid,后續(xù)可使用kill(pid,0)方式檢查進(jìn)程是否在運(yùn)行。該方式的缺點(diǎn)是:①子進(jìn)程將繼承父進(jìn)程Agent的諸多運(yùn)行環(huán)境,如打開(kāi)的文件描述符、控制終端、信息輸出終端等,使父、子進(jìn)程的輸出將打印在同一個(gè)終端,因而無(wú)法分辨;②可能導(dǎo)致出現(xiàn)僵死進(jìn)程,耗費(fèi)系統(tǒng)資源。

      (2)改進(jìn)上述方法采用兩次fork,可避免僵死進(jìn)程的出現(xiàn)[2]。但是,該方法:①具有方法(1)中描述的①同樣的缺點(diǎn);②對(duì)使用shell腳本啟動(dòng)而在退出時(shí)使用實(shí)際運(yùn)行pid進(jìn)行管理的進(jìn)程(如Java進(jìn)程),該方法不能處理;③對(duì)啟動(dòng)后立即異常退出的進(jìn)程,雖然在啟動(dòng)時(shí)就獲取了pid,但由于該進(jìn)程沒(méi)有穩(wěn)定運(yùn)行,可能會(huì)對(duì)Agent的狀態(tài)判斷產(chǎn)生短暫的負(fù)面影響。

      (3)使用 system()啟動(dòng)。system()函數(shù)執(zhí)行了三步操作:①system()通過(guò)調(diào)用fork()由當(dāng)前終端窗口的shell產(chǎn)生子進(jìn)程;②子進(jìn)程則調(diào)用execl()來(lái)啟動(dòng)一個(gè)全新的程序;③在父進(jìn)程中調(diào)用waitpid()等待子進(jìn)程結(jié)束。在調(diào)用system()期間SIGCHLD 信號(hào)會(huì)被暫時(shí)擱置,SIGINT和SIGQUIT 信號(hào)則會(huì)被忽略[3]。system()方式的另一個(gè)好處是可以衍生執(zhí)行多種啟動(dòng)方式,如在某個(gè)終端中執(zhí)行進(jìn)程(如Linux環(huán)境下的終端仿真程序Gnome Terminal)等。這種方式的缺點(diǎn)是不能立即獲得被啟動(dòng)進(jìn)程的pid,需要使用進(jìn)程定位技術(shù)獲得pid。

      目前主要基于第三種方式,為了更好地適應(yīng)進(jìn)程組運(yùn)行控制的多樣化需求,也提供了其他幾種方式。

      4.2 進(jìn)程定位與監(jiān)控

      在使用system()啟動(dòng)時(shí),既可以將子進(jìn)程的控制臺(tái)輸出與父進(jìn)程的控制臺(tái)輸出在一起,也可以啟動(dòng)一個(gè)終端窗口,將子進(jìn)程的輸出輸出到該窗口;但是,該方法在啟動(dòng)時(shí)無(wú)法立即獲取被啟動(dòng)進(jìn)程的pid。本系統(tǒng)采用的策略是,在system()啟動(dòng)后的適應(yīng)性時(shí)間(一般是該進(jìn)程完成必要的初始化并開(kāi)始穩(wěn)定運(yùn)行)后,使用與操作系統(tǒng)平臺(tái)相關(guān)的進(jìn)程定位方法獲取進(jìn)程pid[4]。如在Linux系統(tǒng)下,訪(fǎng)問(wèn)/proc的虛擬文件系統(tǒng),/proc下以數(shù)字命名的子目錄是進(jìn)程目錄,通過(guò)進(jìn)程pid來(lái)訪(fǎng)問(wèn)該子目錄,查看子目錄中名為cmdline的文件,可以獲得相關(guān)進(jìn)程的啟動(dòng)時(shí)間、用戶(hù)時(shí)間、系統(tǒng)時(shí)間等。

      4.3 進(jìn)程退出管理

      在指定訓(xùn)練組關(guān)閉時(shí),各主機(jī)需要安全退出該訓(xùn)練組的相關(guān)進(jìn)程,傳統(tǒng)的做法是由Agent調(diào)用kill()函數(shù)對(duì)進(jìn)程發(fā)出SIGKILL(值為9)信號(hào)。但是,在模擬訓(xùn)練服務(wù)器中,如模擬仿真核心需要在退出時(shí)將訓(xùn)練過(guò)程中生成的評(píng)估信息等存入數(shù)據(jù)庫(kù),如果強(qiáng)行退出將導(dǎo)致數(shù)據(jù)丟失。本系統(tǒng)可對(duì)進(jìn)程的退出方式進(jìn)行配置,對(duì)于需要保存數(shù)據(jù)的進(jìn)程,先發(fā)出SIGTERM(值為15)信號(hào)等待適應(yīng)性時(shí)間后,如該進(jìn)程仍未退出,才最后對(duì)其發(fā)出SIGKILL信號(hào)[2]強(qiáng)制退出。

      4.4 進(jìn)程組分級(jí)管理

      除了訓(xùn)練組相關(guān)的應(yīng)用進(jìn)程外,模擬訓(xùn)練系統(tǒng)中有一些進(jìn)程需要長(zhǎng)時(shí)間運(yùn)行,直到系統(tǒng)完全關(guān)機(jī)。這類(lèi)進(jìn)程包括:基于NTP協(xié)議的對(duì)時(shí)進(jìn)程、打印服務(wù)進(jìn)程、消息中間件、集群管理進(jìn)程、訓(xùn)練日志進(jìn)程、系統(tǒng)監(jiān)控進(jìn)程等。這些進(jìn)程可以放在Agent啟動(dòng)前運(yùn)行,完成主機(jī)對(duì)時(shí)、初始化打印隊(duì)列等系統(tǒng)的環(huán)境準(zhǔn)備工作。如Agent在啟動(dòng)后發(fā)現(xiàn)這些進(jìn)程沒(méi)有啟動(dòng),將首先啟動(dòng)這些進(jìn)程。本系統(tǒng)將這些進(jìn)程按主機(jī)分成不同的服務(wù)進(jìn)程組,并由Agent確保其連續(xù)運(yùn)行,當(dāng)這些進(jìn)程發(fā)生異常退出時(shí),將自動(dòng)重啟該進(jìn)程,以保證服務(wù)提供的持續(xù)性。

      5 基于多個(gè)隊(duì)列設(shè)計(jì)和實(shí)現(xiàn)Agent

      Agent進(jìn)程通過(guò)網(wǎng)絡(luò)接收教員席Scheduler模塊發(fā)出的基本運(yùn)行控制命令,這些命令包括:關(guān)閉全系統(tǒng)主機(jī)、停止全系統(tǒng)運(yùn)行、啟動(dòng)本機(jī)指定進(jìn)程組、退出本機(jī)指定進(jìn)程組、對(duì)運(yùn)行時(shí)異常退出的進(jìn)程執(zhí)行重啟操作、按默認(rèn)方式啟動(dòng)進(jìn)程組以及關(guān)閉指定進(jìn)程等。基于進(jìn)程的運(yùn)行控制要求,Agent應(yīng)具有按照命令啟動(dòng)、退出、管理一臺(tái)主機(jī)上一個(gè)或多個(gè)訓(xùn)練進(jìn)程組的功能。Agent采用了劃分命令隊(duì)列、啟動(dòng)隊(duì)列、重啟隊(duì)列和退出隊(duì)列的管理方式實(shí)現(xiàn)了復(fù)雜的運(yùn)行控制。每個(gè)隊(duì)列設(shè)置一個(gè)定時(shí)器驅(qū)動(dòng),每秒鐘輪詢(xún)隊(duì)列一次,執(zhí)行控制命令。

      5.1 命令隊(duì)列

      命令隊(duì)列接收教員席Scheduler模塊傳入的控制報(bào)文并解析命令。解析命令后,根據(jù)其類(lèi)型,最終將其加入啟動(dòng)隊(duì)列、重啟隊(duì)列,或是退出隊(duì)列中執(zhí)行。由于命令的執(zhí)行要耗費(fèi)一定的時(shí)間,驅(qū)動(dòng)器每次只從隊(duì)首取出一條命令,待這條命令執(zhí)行完畢后將其從隊(duì)列中刪除。

      5.1.1 優(yōu)先級(jí)劃分

      命令隊(duì)列區(qū)分了各種命令的優(yōu)先順序,為每個(gè)命令定義了不同的優(yōu)先級(jí)及不同的處理函數(shù)。命令優(yōu)先級(jí)PRI_MODE如下所示,其中優(yōu)先級(jí)越高,數(shù)值越低。

      enum PRI_MODE

      EM_SHUTDOWN= 1,∥關(guān)機(jī)命令

      EM_CLOSE_ALL_PROC= 2,∥關(guān)閉所有進(jìn)程

      EM_CLOSE_SVR_PROC= 3,/*關(guān)閉所有服務(wù)進(jìn)程 */

      EM_CLOSE_APP_PROC= 4,/*關(guān)閉所有應(yīng)用進(jìn)程*/

      EM_START_DEFAULT_PROC= 5,/*啟動(dòng)默認(rèn)進(jìn)程*/

      EM_CLOSE_PROC= 6,∥關(guān)閉某應(yīng)用進(jìn)程

      EM_START_PROC= 7,∥開(kāi)啟某應(yīng)用進(jìn)程

      升壓調(diào)節(jié)器采用的是SP6641B,它具有很高的電池轉(zhuǎn)換效率能夠滿(mǎn)足多個(gè)設(shè)備的電力供應(yīng),而且還具有極低的靜態(tài)電流。

      };

      Figure 3 Flow chart of process management 圖3 進(jìn)程管理流程圖

      引入優(yōu)先級(jí)主要是為了避免如下情況的發(fā)生:教員席位可以不斷發(fā)出各種運(yùn)行操作命令,這些命令的執(zhí)行和完成都需花費(fèi)一定時(shí)間,在這個(gè)時(shí)間里如果教員席位不斷惡意地發(fā)出命令,則系統(tǒng)有可能會(huì)不斷關(guān)閉和啟動(dòng),影響系統(tǒng)穩(wěn)定性。所以,Agent收到命令后, 應(yīng)先根據(jù)命令報(bào)文的類(lèi)型及當(dāng)前隊(duì)列中命令,判斷是將新命令加入命令隊(duì)列,還是忽略這個(gè)命令。對(duì)PRI_MODE中的前四種命令,處理規(guī)則為:(1)當(dāng)前沒(méi)有要執(zhí)行的命令,直接將新命令加入到命令隊(duì)列;(2)當(dāng)這些命令加入時(shí),刪除所有低優(yōu)先級(jí)命令;(3)當(dāng)這些命令加入時(shí)如果有更高優(yōu)先級(jí)命令存在,則放棄加入。這樣能讓教員在系統(tǒng)完全退出、就緒的狀態(tài)下進(jìn)行下一個(gè)系統(tǒng)級(jí)操作。而后三種命令的判斷規(guī)則為:(1)當(dāng)前沒(méi)有要執(zhí)行的命令,直接將新命令加入到命令隊(duì)列;(2)當(dāng)前有正在執(zhí)行的命令,新命令的類(lèi)型是啟動(dòng)默認(rèn)進(jìn)程,若新命令的優(yōu)先級(jí)最高,則新命令加入隊(duì)列中,但不刪除隊(duì)列之前的命令;(3)當(dāng)前有正在執(zhí)行的命令,新命令的類(lèi)型是關(guān)閉某應(yīng)用進(jìn)程,若新命令的優(yōu)先級(jí)最高,則新命令加入隊(duì)列中,并且刪除當(dāng)前命令隊(duì)列中對(duì)同一組進(jìn)程的啟動(dòng)命令,但不刪除隊(duì)列之前的其他命令;(4)當(dāng)前有正在執(zhí)行的命令,新命令的類(lèi)型是啟動(dòng)某應(yīng)用進(jìn)程,若命令隊(duì)列中存在關(guān)機(jī)命令、關(guān)閉所有進(jìn)程的命令,則忽略新命令,否則,將其加入隊(duì)列。

      5.1.2 進(jìn)程信息管理

      由于命令隊(duì)列在執(zhí)行命令時(shí),將命令中涉及到的進(jìn)程交付給了其他三個(gè)隊(duì)列,故其本身并不知道進(jìn)程的執(zhí)行結(jié)果,因此把進(jìn)程劃分為九種狀態(tài)。各隊(duì)列根據(jù)進(jìn)程的執(zhí)行情況,調(diào)整進(jìn)程的狀態(tài)。例如,進(jìn)程暫時(shí)不能被加入到啟動(dòng)隊(duì)列中(一種情況是,需等到退出隊(duì)列中的進(jìn)程全部退出后,進(jìn)程才能加入啟動(dòng)隊(duì)列),這時(shí)進(jìn)程被設(shè)置為PS_TOSTART狀態(tài);在進(jìn)程成功加入啟動(dòng)隊(duì)列后,進(jìn)程被設(shè)置為PS_INSTART狀態(tài);啟動(dòng)隊(duì)列中的進(jìn)程成功啟動(dòng)后,又被設(shè)置為PS_RUNNING狀態(tài)。圖3簡(jiǎn)要描述了進(jìn)程在啟動(dòng)列表、重啟列表及退出列表中的轉(zhuǎn)換過(guò)程。

      進(jìn)程狀態(tài)PROC_STATE如下所示:

      enum PROC_STATE

      {

      PS_NONE= 1,∥初始化狀態(tài)

      PS_INSTART= 2,∥在啟動(dòng)隊(duì)列中

      PS_TOSTART= 3,∥要加入到啟動(dòng)隊(duì)列

      PS_STARTING= 4,∥正在啟動(dòng)

      PS_RUNNING= 5,∥運(yùn)行中

      PS_TOEXIT= 6,∥要加入到退出隊(duì)列

      PS_STOPPED= 7,∥已經(jīng)停止

      PS_INEXIT= 8,∥在退出隊(duì)列中

      PS_TERMING= 9∥正在停止

      };

      除了進(jìn)程狀態(tài)的設(shè)置外,系統(tǒng)還設(shè)計(jì)了專(zhuān)門(mén)的進(jìn)程管理器。進(jìn)程管理器存儲(chǔ)了Agent系統(tǒng)中所有服務(wù)進(jìn)程和應(yīng)用進(jìn)程的最新信息,包括進(jìn)程狀態(tài)信息。因此每次進(jìn)程狀態(tài)發(fā)生變化時(shí),都要及時(shí)修改進(jìn)程管理器中相關(guān)信息。通過(guò)定時(shí)器驅(qū)動(dòng)定時(shí)檢查所有應(yīng)用進(jìn)程的狀態(tài),對(duì)已經(jīng)退出的進(jìn)程,將其從進(jìn)程管理器中刪除;對(duì)等待啟動(dòng)和等待關(guān)閉進(jìn)程,將其加入到啟動(dòng)或退出隊(duì)列中。由于運(yùn)行中的進(jìn)程可能會(huì)發(fā)生異常終止的情況,進(jìn)程管理器將正常退出的進(jìn)程標(biāo)記為KILLED(數(shù)值1),異常退出的進(jìn)程的標(biāo)記為UNKILLED(數(shù)值0)。通過(guò)查看進(jìn)程退出標(biāo)記的值及檢測(cè)進(jìn)程是否還在運(yùn)行中,來(lái)判斷進(jìn)程有無(wú)異常終止。對(duì)異常終止的進(jìn)程,進(jìn)程管理器將其加入到重啟列表中重新啟動(dòng)。

      5.2 啟動(dòng)隊(duì)列和重啟隊(duì)列

      啟動(dòng)隊(duì)列接收命令隊(duì)列和進(jìn)程管理器的進(jìn)程啟動(dòng)請(qǐng)求,將待啟動(dòng)進(jìn)程加入到隊(duì)列中。與命令隊(duì)列不同,啟動(dòng)隊(duì)列一次處理完所有到來(lái)的請(qǐng)求,而不是逐一處理。啟動(dòng)和重啟隊(duì)列中的進(jìn)程狀態(tài)只能是INSTART和TOSTART兩者之一,啟動(dòng)成功的進(jìn)程狀態(tài)修改為PS_RUNNING,并從該隊(duì)列中移除。進(jìn)程執(zhí)行啟動(dòng)動(dòng)作后,若超過(guò)了60秒仍未啟動(dòng)成功,則將進(jìn)程加入到重啟隊(duì)列中等待下一次啟動(dòng),同時(shí)從啟動(dòng)隊(duì)列中刪除。啟動(dòng)隊(duì)列和重啟隊(duì)列中的進(jìn)程要求無(wú)重復(fù);同時(shí),啟動(dòng)進(jìn)程之前需判斷進(jìn)程的存活狀態(tài),使用kill(pid,0)得到進(jìn)程是否已經(jīng)在運(yùn)行,確保不會(huì)再次啟動(dòng)已經(jīng)在運(yùn)行的進(jìn)程。

      由于Agent支持在一臺(tái)主機(jī)上進(jìn)行不同訓(xùn)練組的切換功能,如席位主機(jī)從模擬飛行員切換為模擬雷達(dá)管制席位,這樣在啟動(dòng)新進(jìn)程組時(shí),若本機(jī)上前一組進(jìn)程仍然在運(yùn)行,需要進(jìn)行進(jìn)程組的切換。進(jìn)程組的切換要求先將前一個(gè)訓(xùn)練組的進(jìn)程加入退出隊(duì)列并殺死,再將待啟動(dòng)的新訓(xùn)練組進(jìn)程加入啟動(dòng)隊(duì)列進(jìn)行啟動(dòng)。因此,在命令隊(duì)列將待啟動(dòng)進(jìn)程加入啟動(dòng)隊(duì)列之前,需保證退出隊(duì)列的穩(wěn)定態(tài)(即待退出的進(jìn)程已經(jīng)全部殺死)。如果退出隊(duì)列是非穩(wěn)定態(tài),則通過(guò)定時(shí)器驅(qū)動(dòng)不斷檢測(cè)其狀態(tài),直到達(dá)到穩(wěn)定態(tài),才能將待啟動(dòng)進(jìn)程加入啟動(dòng)隊(duì)列中。

      5.3 退出隊(duì)列

      命令隊(duì)列處理退出進(jìn)程組、退出進(jìn)程、全系統(tǒng)關(guān)閉、訓(xùn)練組切換等命令時(shí),需要?dú)⑺酪粋€(gè)或多個(gè)進(jìn)程,所有待殺死的進(jìn)程被放入到退出隊(duì)列中。Agent提供了兩種殺死進(jìn)程的方式:一種基于SIGKILL信號(hào),一種基于SIGTERM信號(hào)。由于SIGTERM信號(hào)不能立即殺死進(jìn)程[2],故設(shè)置超時(shí)時(shí)間用于判斷SIGTERM是否超時(shí)。超時(shí)后,使用SIGKILL信號(hào)立即殺死進(jìn)程。在對(duì)進(jìn)程發(fā)出SIGTERM信號(hào)后,該進(jìn)程繼續(xù)保留在退出隊(duì)列中,同時(shí)記錄下SIGTERM信號(hào)的發(fā)出時(shí)間,進(jìn)程狀態(tài)也由PS_INEXIT變?yōu)镻S_TERMING。退出隊(duì)列的定時(shí)器輪詢(xún)隊(duì)列時(shí),若檢查到狀態(tài)為PS_TERMING的進(jìn)程在超時(shí)時(shí)間之內(nèi)死亡,則將其從退出隊(duì)列中移除;若檢查到該進(jìn)程已經(jīng)超時(shí)卻仍然存活,則對(duì)該進(jìn)程發(fā)出SIGKILL信號(hào),強(qiáng)制殺死進(jìn)程并將該進(jìn)程移出退出列表。與啟動(dòng)隊(duì)列類(lèi)似,對(duì)退出隊(duì)列中進(jìn)程發(fā)出殺死信號(hào)之前,也要判斷其存活狀態(tài),避免對(duì)已死亡進(jìn)程的不必要操作。

      5.4 Agent設(shè)計(jì)優(yōu)化

      當(dāng)采用進(jìn)程定位方式管理進(jìn)程時(shí),如果對(duì)操作系統(tǒng)中所有的進(jìn)程進(jìn)行定時(shí)的輪詢(xún),會(huì)導(dǎo)致Agent的CPU占用率增高。為了減少Agent的CPU占用率,可以采用將驅(qū)動(dòng)器運(yùn)行時(shí)間間隔加長(zhǎng)的方法,但這樣會(huì)降低進(jìn)程檢測(cè)的靈敏度。經(jīng)過(guò)優(yōu)化的Agent設(shè)計(jì)為:在上述四個(gè)隊(duì)列均為空時(shí)(這是實(shí)際系統(tǒng)運(yùn)行時(shí)大部分時(shí)間的狀態(tài)),將這種狀態(tài)定義為系統(tǒng)穩(wěn)定態(tài),只對(duì)被進(jìn)程管理器管理的進(jìn)程用kill(pid, 0)進(jìn)行存活的判斷,該方法有效降低了CPU占用率。

      6 Scheduler模塊的設(shè)計(jì)

      系統(tǒng)中各主機(jī)的Agent定時(shí)向Scheduler模塊發(fā)送訓(xùn)練組的信息和狀態(tài),每秒鐘更新一次。更新的信息包括:發(fā)送主機(jī)、是否處于穩(wěn)定態(tài)、當(dāng)前CPU使用率、當(dāng)前主機(jī)運(yùn)行了的分組數(shù)目、當(dāng)前本機(jī)上運(yùn)行的分組分別是哪些等。這個(gè)報(bào)文只在Agent處于穩(wěn)定狀態(tài)的時(shí)候進(jìn)行發(fā)送,如果主機(jī)目前狀態(tài)不穩(wěn)定,則會(huì)選擇發(fā)送上一次穩(wěn)定態(tài)的信息;同時(shí),指示當(dāng)前的主機(jī)狀態(tài)為不穩(wěn)定,以便Scheduler暫時(shí)不使用這些信息進(jìn)行進(jìn)程組的啟動(dòng)。Scheduler在啟動(dòng)后和運(yùn)行中如果發(fā)現(xiàn)某個(gè)訓(xùn)練組發(fā)生組缺失導(dǎo)致該訓(xùn)練組不能正常運(yùn)行,將選擇在某個(gè)訓(xùn)練服務(wù)器上重啟該缺失的訓(xùn)練進(jìn)程組。圖4是對(duì)Agent與Scheduler關(guān)系的簡(jiǎn)單描述。

      Figure 4 Flow chart of scheduler processing 圖4 Scheduler處理流程圖

      對(duì)于運(yùn)行于模擬仿真服務(wù)器上的各進(jìn)程組,Scheduler在:(1)存在進(jìn)程異常退出;(2)某臺(tái)服務(wù)器CPU占用率高于閾值;(3)訓(xùn)練組啟動(dòng)后需要對(duì)當(dāng)前的服務(wù)器運(yùn)行的訓(xùn)練服務(wù)進(jìn)程組在多個(gè)服務(wù)器間進(jìn)行調(diào)度,盡可能保持各航管模擬訓(xùn)練服務(wù)器的CPU負(fù)載均衡。Scheduler在負(fù)載均衡算法運(yùn)算后根據(jù)結(jié)果執(zhí)行調(diào)度動(dòng)作,目前執(zhí)行調(diào)度切換的時(shí)間為3秒,可以滿(mǎn)足系統(tǒng)的需要。

      Scheduler采用如下方法進(jìn)行調(diào)度[5~8]:

      (1)接收Agent報(bào)告的各訓(xùn)練服務(wù)器中各進(jìn)程的CPU占用率,并得到以進(jìn)程組為單位的CPU占用率,本系統(tǒng)中使用的占用率為小數(shù)點(diǎn)以后兩位。

      (2)檢查各服務(wù)器CPU占用率是否存在較大的差值,如果存在則進(jìn)行負(fù)載均衡動(dòng)作即進(jìn)入第三步。

      (3)定義一個(gè)系統(tǒng)中不可能出現(xiàn)的單機(jī)最大負(fù)載值MAX_LOAD,當(dāng)系統(tǒng)滿(mǎn)足了進(jìn)行負(fù)載均衡切換的條件后,首先在集群系統(tǒng)中查找當(dāng)前負(fù)載小于參數(shù)所指定負(fù)載(MAX_LOAD)的服務(wù)器中的最高負(fù)載的服務(wù)器,由它們組成一個(gè)“最高負(fù)載服務(wù)器鏈表”,然后依次遍歷鏈表的每個(gè)服務(wù)器上的進(jìn)程組。假設(shè)某最高負(fù)載服務(wù)器上運(yùn)行的第T個(gè)訓(xùn)練組的第N號(hào)進(jìn)程組,于是在當(dāng)前運(yùn)行的服務(wù)器組中查找具有最低負(fù)載的服務(wù)器。如果找到則計(jì)算兩臺(tái)服務(wù)器切換前后的負(fù)載差值,如果切換后的差值小于切換前的則說(shuō)明切換后負(fù)載更趨向均衡,那么將該進(jìn)程放入進(jìn)行切換的隊(duì)列中,依此類(lèi)推,直至遍歷完該主機(jī)上的所有進(jìn)程組為止。如果在該主機(jī)的遍歷過(guò)程中發(fā)生了進(jìn)程組的變化,那么則跳出對(duì)“最高負(fù)載服務(wù)器鏈表”的循環(huán),因?yàn)橛捎诎l(fā)生了切換,所以此時(shí)在最高負(fù)載服務(wù)器鏈表中的服務(wù)器負(fù)載總和可能已經(jīng)不再是系統(tǒng)中的最高負(fù)載了,因此重新進(jìn)行處理,進(jìn)入下一次遞歸,此時(shí)傳遞的參數(shù)仍然是MAX_LOAD,直至遍歷完所有最高負(fù)載主機(jī)上的進(jìn)程組。如果遍歷完成而沒(méi)有發(fā)生切換,那么就將此時(shí)系統(tǒng)中的最高負(fù)載總值作為參數(shù)傳遞到下一次遞歸運(yùn)算中。遞歸的終點(diǎn)是:在服務(wù)器組中再也找不到具有比傳入?yún)?shù)更小的負(fù)載總值的服務(wù)器了。此刻訓(xùn)練服務(wù)器組中各主機(jī)的負(fù)載達(dá)到了最大程度的平衡。圖5作為算法流程圖詳細(xì)描述了這一步的算法流程與步驟。

      在推選出各服務(wù)器要進(jìn)行切換的服務(wù)器進(jìn)程組以后,Scheduler會(huì)通知這些進(jìn)程組完成進(jìn)程運(yùn)行狀態(tài)檢查點(diǎn)的保存,并使用調(diào)用各服務(wù)器Agent完成檢查點(diǎn)信息到目標(biāo)服務(wù)器的傳輸,在狀態(tài)完成傳遞以后,統(tǒng)一發(fā)起進(jìn)程組在目標(biāo)機(jī)的啟動(dòng)工作。在進(jìn)程組跨主機(jī)遷移的過(guò)程中,Scheduler對(duì)外部對(duì)集群的控制命令不予處理,對(duì)于Agent心跳報(bào)文也只記錄收到的時(shí)間,這樣做的目的是為了避免切換過(guò)程中引起新的調(diào)度。

      Figure 5 Flow chart of training server load balancing algorithm圖5 訓(xùn)練服務(wù)器負(fù)載均衡算法流程圖

      7 實(shí)驗(yàn)分析與結(jié)果

      如4.1節(jié)的方法一所述,以fork+子進(jìn)程中exec方式將進(jìn)程作為Agent的子進(jìn)程啟動(dòng)的方式可能導(dǎo)致出現(xiàn)僵死進(jìn)程。當(dāng)子進(jìn)程終止時(shí),它釋放資源,并且發(fā)送SIGCHLD信號(hào)通知父進(jìn)程。父進(jìn)程接收SIGCHLD信號(hào),返回子進(jìn)程的狀態(tài),并且釋放系統(tǒng)進(jìn)程表資源。如果子進(jìn)程先于父進(jìn)程終止,而父進(jìn)程fork()之前既沒(méi)有按照SIGCHLD信號(hào)調(diào)用處理函數(shù)waitpid()等待子進(jìn)程結(jié)束,又沒(méi)有顯式忽略該信號(hào),則子進(jìn)程成為僵死進(jìn)程,無(wú)法正常結(jié)束。此時(shí)即使是以超級(jí)用戶(hù)身份調(diào)用kill-9命令也不能殺死僵死進(jìn)程。直到其父進(jìn)程結(jié)束,子線(xiàn)程成為孤兒進(jìn)程,由守護(hù)進(jìn)程init領(lǐng)養(yǎng)孤兒進(jìn)程,當(dāng)孤兒進(jìn)程結(jié)束時(shí)init為其釋放進(jìn)程表資源。

      實(shí)現(xiàn)系統(tǒng)時(shí)發(fā)現(xiàn),即使處理了SIGCHILD信號(hào),調(diào)用waitpid()等待子進(jìn)程結(jié)束,當(dāng)被關(guān)閉進(jìn)程組的進(jìn)程過(guò)多時(shí),如達(dá)到幾十個(gè),由于UNIX系統(tǒng)對(duì)同一信號(hào)沒(méi)有排隊(duì)機(jī)制,總有幾個(gè)子進(jìn)程無(wú)法正常關(guān)閉,出現(xiàn)僵死進(jìn)程。不僅耗費(fèi)系統(tǒng)資源,也可能因?yàn)榻┧肋M(jìn)程沒(méi)有釋放系統(tǒng)資源,如網(wǎng)絡(luò)通訊的文件描述符綁定的網(wǎng)絡(luò)端口,導(dǎo)致同一進(jìn)程無(wú)法再次啟動(dòng),給系統(tǒng)的進(jìn)程管理帶來(lái)很大麻煩。經(jīng)過(guò)多次嘗試新方法,最終4.1節(jié)的方法三良好地適應(yīng)了系統(tǒng)進(jìn)程組控制管理的需求。

      8 結(jié)束語(yǔ)

      以上介紹了基于代理的航管仿真訓(xùn)練系統(tǒng)運(yùn)行控制的設(shè)計(jì)與實(shí)現(xiàn),通過(guò)對(duì)命令隊(duì)列、啟動(dòng)隊(duì)列、重啟隊(duì)列和退出隊(duì)列的設(shè)計(jì),通過(guò)對(duì)收到的命令按優(yōu)先級(jí)進(jìn)行處理,配合負(fù)載均衡算法,有效處理了航管訓(xùn)練系統(tǒng)中運(yùn)行控制的問(wèn)題,也實(shí)現(xiàn)了對(duì)進(jìn)程運(yùn)行狀態(tài)信息的監(jiān)控。

      在航管仿真訓(xùn)練系統(tǒng)的后續(xù)研發(fā)中,隨著訓(xùn)練功能的日益豐富,對(duì)基于代理的運(yùn)行控制提出了更多的要求,其XML表述的配置內(nèi)容更加豐富,對(duì)于命令的處理也由單純的依靠?jī)?yōu)先級(jí)判斷變?yōu)榛谟邢逘顟B(tài)機(jī)進(jìn)行命令和運(yùn)行狀態(tài)轉(zhuǎn)換,系統(tǒng)功能日益完善和提升。

      [1] Ferber J, Gutknecht O. A meta-model for the analysis and design of organization in multi-agent systems[C]∥Proc of the 3rd International Conference on Multi-Agent Systems (ICMAS’98), 1998:258-266.

      [2] Raymond E S. The art of Unix programming[M]. 2nd edition. Beijing:Electronic Industry Press, 2006.(in Chinese)

      [3] Stevens W R. Advanced programming in the Unix environment[M]. Beijing:Posts & Telecom Press, 2000.(in Chinese)

      [4] Stevens W R. Unix network programming volume 2:Interprocess communications[M]. Beijing:Posts & Telecom Press, 2010.(in Chinese)

      [5] Lin Jun-xuan, Hu Shu. System and process information access in tru64 Unix server[J]. Computer Applications, 2006, 26(z2):316-318.(in Chinese)

      [6] Forrest S,Hofmeyr S A,Somayaji A,et al.A sense of self for Unix processes[C]∥Proc of the 1996 IEEE Symposium on Security and Privacy, 1996:120-128.(in Chinese)

      [7] Xiang Jian-jun, Bai Xin, Zuo Ji-zhang. A multipletask load balancing algorithm used in real-time cluster system[J]. Computer Engineering, 2003, 29(12):36-38.(in Chinese)

      [8] Sekar R, Venkatakrishnan V N. One-way isolation:An effective approach for realizing safe execution environments[C]

      ∥Proc of the ISOC Network and Distributed Systems Symposium, 2005:265-278.(in Chinese)

      [9] Bass L, Clements P C, Kazman R. Software architecture in practice[M].2nd ed. Beijing:Tsinghua University Press, 2003.(in Chinese)

      附中文參考文獻(xiàn):

      [2] Raymond E S. UNIX編程藝術(shù)[M]. 第二版.北京:電子工業(yè)出版社,2006.

      [3] Stevens W R. UNIX高級(jí)環(huán)境編程[M].第二版.北京:人民郵電出版社,2000.

      [4] Stevens W R. UNIX網(wǎng)絡(luò)編程(卷二)進(jìn)程間通信[M]. 北京:人民郵電出版社,2010.

      [5] 林俊萱,胡術(shù).Tru64 Unix服務(wù)器中系統(tǒng)及進(jìn)程信息的獲取方法[J]. 計(jì)算機(jī)應(yīng)用,2006, 26(z2):316-318.

      [6] Forrest S,Hofmeyr S A,Somayaji A,等.自我感覺(jué)UNIX進(jìn)程[C]∥ IEEE計(jì)算機(jī)學(xué)會(huì)安全與隱私研討會(huì), 1996:120-128.

      [7] 向建軍,白欣,左繼章.一種用于實(shí)時(shí)集群的多任務(wù)負(fù)載均衡算法[J]. 計(jì)算機(jī)工程,2003, 29(12):36-38.

      [8] Sekar R, Venkatakrishnan V N. 單向隔離:實(shí)現(xiàn)安全的執(zhí)行環(huán)境的有效途徑[C]∥國(guó)際互聯(lián)網(wǎng)協(xié)會(huì)網(wǎng)絡(luò)與分布式系統(tǒng)安全座談會(huì), 2005:265-278.

      [9] Bass L, Clements P C, Kazman R.軟件構(gòu)架實(shí)踐[M].第二版.北京:清華大學(xué)出版社,2003.

      猜你喜歡
      航管訓(xùn)練組隊(duì)列
      新型抗阻力訓(xùn)練模式改善大學(xué)生身體素質(zhì)的實(shí)驗(yàn)研究
      跑臺(tái)運(yùn)動(dòng)訓(xùn)練對(duì)脊髓損傷大鼠肺功能及HMGB-1表達(dá)的影響
      線(xiàn)上自主訓(xùn)練與線(xiàn)下指導(dǎo)訓(xùn)練表面肌電差異分析
      隊(duì)列里的小秘密
      基于多隊(duì)列切換的SDN擁塞控制*
      軟件(2020年3期)2020-04-20 00:58:44
      淺談軍民航航管的融合發(fā)展
      在隊(duì)列里
      豐田加速駛?cè)胱詣?dòng)駕駛隊(duì)列
      傳輸設(shè)備速率對(duì)于航管雷達(dá)融合處理的影響研究
      航管應(yīng)答機(jī)退敏和恢復(fù)的設(shè)計(jì)研究
      電子制作(2017年23期)2017-02-02 07:16:51
      乳山市| 专栏| 新绛县| 芜湖市| 上犹县| 青神县| 田阳县| 丹巴县| 阿克陶县| 来宾市| 威远县| 临潭县| 汽车| 隆德县| 商南县| 红河县| 石棉县| 内江市| 姜堰市| 磐石市| 房山区| 杂多县| 西和县| 南宁市| 肥城市| 探索| 双鸭山市| 伊宁县| 平果县| 苏尼特左旗| 察哈| 隆安县| 策勒县| 内乡县| 北宁市| 施秉县| 丹阳市| 同江市| 永顺县| 航空| 临安市|