左悅 林寧
摘? 要:為了滿足編程題在線評閱對響應(yīng)時間、并發(fā)處理能力的需求,本文結(jié)合Linux操作系統(tǒng)的穩(wěn)定性好、多任務(wù)和多用戶等特點,提出在Linux操作系統(tǒng)下架設(shè)在線評閱服務(wù)器的方法。本文就在線評閱服務(wù)平臺的技術(shù)進行了探討,給出了評閱服務(wù)器的技術(shù)性指標、自啟動評閱服務(wù)進程的方法、service服務(wù)進程對Mysql數(shù)據(jù)庫操作和多進程并發(fā)評閱的具體實現(xiàn)方法等,文中提出的技術(shù)使得評閱服務(wù)器具有良好的穩(wěn)定性和較強并發(fā)處理能力。
關(guān)鍵詞:Linux系統(tǒng);編程題;在線評閱;并發(fā)處理能力
中圖分類號:TP311.1? ? ? ?文獻標識碼:A 文章編號:2096-4706(2019)10-0097-03
Abstract:In order to meet the demand of response time and concurrent processing ability for programming online review,combining the advantages of Linux operating system,such as good stability,multi-task and multi-user,this paper proposes to set up on-line review server under Linux operating system. This paper discusses the technology of the online review service platform,and gives the technical index of the evaluation server,the method of self-starting the review service process,the concrete realization of the operation of the Mysql database by the service process and the concurrent evaluation of the multi-process and so on. The technology proposed in this paper makes the evaluation server have good stability and strong concurrent processing ability.
Keywords:Linux system;programming questions;online judging;concurrent processing capability
0? 引? 言
Linux是一個開源的、多任務(wù)、多用戶操作系統(tǒng),大多數(shù)企業(yè)或個人選擇在Linux操作系統(tǒng)上搭建FTP服務(wù)器、DHCP服務(wù)器和Web網(wǎng)站服務(wù)器等。Linux操作系統(tǒng)被選作服務(wù)器的主要原因有這幾個方面:第一,Linux系統(tǒng)具有較好的穩(wěn)定性,安裝在Linux的服務(wù)器可以連續(xù)運行,無須關(guān)閉服務(wù)器;第二,Linux系統(tǒng)可以使大量用戶在同一服務(wù)器上工作而不會出現(xiàn)任何問題;第三,Linux操作系統(tǒng)的代碼是開源的,對于其他操作系統(tǒng),代碼并非每個人都可以自由使用;第四,Linux服務(wù)器還可以執(zhí)行多任務(wù),即Linux系統(tǒng)能夠處理同時運行的許多不同程序。
本文所開發(fā)的平臺要求具有實時在線評閱功能,為了提高在線評閱的響應(yīng)速度,要求服務(wù)端具有多用戶、多進程并發(fā)處理學(xué)生提交的程序的能力,因此,Linux操作系統(tǒng)非常適合用來搭建在線評閱平臺。
1? 運行環(huán)境的需求
1.1? 服務(wù)端需求
評閱平臺采用B/S和C/S混合模式進行開發(fā)。不同于只采用C/S模式的判分系統(tǒng),程序的運行和評閱由客戶端完成,服務(wù)器端只用來接收數(shù)據(jù)。本系統(tǒng)中,程序首先由客戶端提交到服務(wù)器端,然后由服務(wù)器端的評閱進程調(diào)用不同的函數(shù)和命令對程序運行評閱,服務(wù)器的負載相對來說比較重。目前硬件的性能已經(jīng)非常好,而且價格相對便宜。服務(wù)器可以根據(jù)實際使用的人數(shù)來選購,既要避免服務(wù)器的負載相對過重,又要避免資源的浪費。軟件運行環(huán)境:操作系統(tǒng)為CentOS,網(wǎng)絡(luò)協(xié)議為TCP/IP,Web服務(wù)器為apache-tomcat,jdk編譯環(huán)境,數(shù)據(jù)庫為Mysql。
1.2? 客戶端需求
對客戶端的硬件要求不高,硬件上只要網(wǎng)絡(luò)連通,能瀏覽和處理數(shù)據(jù)即可。軟件運行環(huán)境:操作系統(tǒng)為Windows,網(wǎng)絡(luò)協(xié)議為TCP/IP,瀏覽器為Internet Explorer 8.0以上或Mozilla Firefox等。
2? 評閱服務(wù)平臺的技術(shù)性指標
評閱服務(wù)端主要考慮硬盤存儲容量、執(zhí)行速度、判分響應(yīng)時間、吞吐量及易維護性等。
(1)存儲容量:本文所開發(fā)的系統(tǒng)主要對編程題進行評閱,不同于其他評閱系統(tǒng),只有完成后才可進行答卷的提交,而且只能提交一次。對于程序題的評閱,為了提高評分的準確性,應(yīng)允許學(xué)生在規(guī)定時間內(nèi)進行多次提交,服務(wù)端應(yīng)將所有的提交程序全部記錄,以便事后查詢。面對大量的數(shù)據(jù),有限的存儲空間,系統(tǒng)應(yīng)對提交的程序大小進行限制。
(2)執(zhí)行速度:作為自動評閱系統(tǒng),系統(tǒng)對學(xué)生提交的程序應(yīng)實時評閱,結(jié)果出來后立即返回給學(xué)生。
(3)響應(yīng)時間:對提交的程序不能進行長時間的評閱,因此,評閱時間應(yīng)控制在一定的范圍內(nèi)。
(4)吞吐量:吞吐量是指單位時間內(nèi)評閱系統(tǒng)完成的交易數(shù)量??荚嚮蚣芯毩?xí)過程中,也是系統(tǒng)用戶登錄最多的時候,系統(tǒng)吞吐量達到最大,系統(tǒng)應(yīng)滿足最大吞吐量的需求。40FD3F09-BDE3-4BBD-A00E-4B8210CE6395
(5)易維護性:在練習(xí)或考試過程中,不管是服務(wù)進程還是客戶端在出現(xiàn)故障中斷后,都應(yīng)具備考前數(shù)據(jù)恢復(fù)功能,保證考試繼續(xù)進行。
3? 評閱服務(wù)進程的啟動
有時因斷電或者其他因素的影響,服務(wù)端需要重新啟動,自動評閱進程需要自動啟動。在本系統(tǒng)中,評閱服務(wù)程序采用C語言進行開發(fā),經(jīng)過編譯后生成service可執(zhí)行文件,放在/home/run/cserver目錄下。編寫shell script腳本文件runserver.sh,腳本程序主要監(jiān)控service進程是否啟動,一旦監(jiān)控到service沒有運行,就會馬上啟動service進程;runserver.sh腳本程序如下:
while [ "" = "" ];
do
pid=`ps -ef|grepservice|wc -l`
if [ $pid -gt 1 ]; then
echo "service進程正在運行!";
else
/home/run/cserver/service
fi
sleep 1
done
runserver.sh腳本程序一個無限循環(huán)的程序,每隔一秒鐘檢查一次service進程是否運行,這樣也避免了因特殊情況service進程突然中斷,從而導(dǎo)致評閱服務(wù)停止。Linux服務(wù)器重新啟動后,需自動執(zhí)行runserver.sh腳本程序,可以在Linux系統(tǒng)的/etc/rc.local文件中加入語句sh/home/run/cserver/runserver.sh&實現(xiàn)。
4? 評閱服務(wù)進程接Mysql數(shù)據(jù)庫
4.1? Mysql數(shù)據(jù)庫的連接
評閱服務(wù)進程在評閱后需要將評閱結(jié)果存入Mysql數(shù)據(jù)中,使用C語言連接Mysql數(shù)據(jù)庫時,常用到一些C API函數(shù)如mysql_init、mysql_real_connect、mysql_close函數(shù),下面代碼是一個C語言連接本地Mysql數(shù)據(jù)庫的代碼片段:
MYSQL connect;
mysql_init(&myconnect);
if(mysql_real_connect(&myconnect,"localhost","lin","123456","Erex",0,NULL,0))
printf("連接Mysql數(shù)據(jù)庫成功");
else
printf("連接Mysql數(shù)據(jù)庫失?。。躰");
其功能是:首先使用Mysql結(jié)構(gòu)定義了結(jié)構(gòu)變量my-connect,接著使用mysql_init()函數(shù)對myconnect變量初始化,然后使用mysql_real_connect()函數(shù)連接了本地數(shù)據(jù)庫Erex,連接的信息保存到myconnect結(jié)構(gòu)變量中,最后使用printf()函數(shù)提示是否連接成功。
4.2? Mysql數(shù)據(jù)操作的實現(xiàn)
評閱服務(wù)進程在對Mysql數(shù)據(jù)操作前,先連接數(shù)據(jù)庫,myconnect()為自定義函數(shù),連接成功返回1,否則返回0。圖1為service進程操作Mysql數(shù)據(jù)庫的流程圖。
由于service進程可以并發(fā)評閱學(xué)生提交的程序,service產(chǎn)生的多個子進程可能會同時讀寫一個數(shù)據(jù)表中的數(shù)據(jù),這可能造成數(shù)據(jù)表中的數(shù)據(jù)錯誤,如:A進程讀取了數(shù)據(jù)表table的數(shù)據(jù),在A進程處理數(shù)據(jù)的過程中,至A進程寫入數(shù)據(jù)到table之前,是不允許其他進程讀寫table中的數(shù)據(jù)的,否則,可能會造成數(shù)據(jù)錯誤。因此,在讀數(shù)據(jù)之前評閱子進程需先對數(shù)據(jù)庫中特定的表進行鎖定操作,然后再對表中的數(shù)據(jù)進行其他操作。如下面的程序片段:
sprintf(cxnr,"lock table t_recordswrite,t_answer-filewrite,t_exam_lib write;");
if(mysql_real_query(&con,cxnr,(unsigned int)strlen(cxnr)))
{ printf("鎖定表t_records,t_answerfile,t_exam_lib失?。。躰");}
對t_records,t_answerfilewrite,t_exam_lib三張表鎖定的寫操作,其他進程不能再往這三張表輸入數(shù)據(jù),直到解鎖。
5? 多進程并發(fā)評閱的實現(xiàn)
5.1? service守護進程的創(chuàng)建
service守護進程是在后臺運行的特殊進程,用于完成在線評閱的任務(wù),Service進程在操作系統(tǒng)啟動后啟動,并一直運行除非系統(tǒng)關(guān)閉。由于守護進程是脫離控制終端的,因此首先創(chuàng)建子進程,終止父進程,之后所有的工作都在子進程中完成。Service進程脫離控制終端的關(guān)鍵代碼:
pid_t child1,child2;
child1=fork();
if(child1>0) exit(0);
setsid();
chdir("/home/runspace");
umask(0);
上述程序中,fork()函數(shù)創(chuàng)建子進程并返回值至child1中,exit(0)語句終止了父進程的運行,子進程調(diào)用setsid()函數(shù)創(chuàng)建新的會話,chdir("/")改變工作目錄到/home/runspace,umask()用于重設(shè)文件掩碼。
5.2? 多進程評閱的實現(xiàn)
service守護進程監(jiān)聽到新的任務(wù)時,調(diào)用fork()函數(shù)創(chuàng)建新的子進程,評閱任務(wù)由子進程完成,父進程繼續(xù)監(jiān)聽新的任務(wù)。這樣service守護進程僅僅負責(zé)新任務(wù)的監(jiān)聽,并產(chǎn)生新的子進程,評閱的任務(wù)全部交給子進程完成,這樣大大提高評閱的并發(fā)處理能力,縮短在線評閱的響應(yīng)時間,提高系統(tǒng)的吞吐量。
6? 結(jié)? 論
本文中闡述的在線評閱設(shè)技術(shù)已應(yīng)用到C語言編程題在線評閱系統(tǒng)上,經(jīng)過實踐證明服務(wù)器具有良好的穩(wěn)定性和較好的并發(fā)處理能力,對其他服務(wù)器的開發(fā)有一定的借鑒意義。
參考文獻:
[1] 吳文剛,張志文.信息安全等級保護Linux服務(wù)器shell腳本測評方法 [J].現(xiàn)代工業(yè)經(jīng)濟和信息化,2017,7(13):59-61.
[2] 盧云宏,侯文涵,趙前,等.基于Linux的OnlineJudge在線提交環(huán)境的搭建 [J].電子技術(shù)與軟件工程,2017(12):50-51.
[3] 劉加海,張益先,等.Linux軟件工程師(C語言)實用教程 [M].北京:科學(xué)出版社,2009.
作者簡介:左悅(1981-),女,漢族,遼寧盤錦人,講師,碩士,研究方向:圖形圖像處理、計算機應(yīng)用。40FD3F09-BDE3-4BBD-A00E-4B8210CE6395