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