周彥汐 李成奧 徐艷
摘要:搶票軟件的出現(xiàn),在一定程度上緩解了鐵路12306官方購票系統(tǒng)的售票壓力,并被人們加上“買票快”,“買票方便”的標(biāo)簽,但其實搶票軟件類似于生活中的一種插隊現(xiàn)象,不僅沒有搶票率的保證,而且從用戶隱私安全和系統(tǒng)操作性能而言,搶票軟件存在泄漏用戶隱私、隱形收費(fèi)、對服務(wù)器資源造成破壞等問題。
關(guān)鍵詞:多線程并發(fā);模擬分析危害
中圖分類號:TP393? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)30-0055-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
1引言
春節(jié),對于中國人來說,象征著團(tuán)圓和對來年的美好期盼,而一張火車票承載的是萬千游子對故鄉(xiāng)深深的思戀。在二十年前,我們?yōu)榱艘粡埓汗?jié)返家的車票在車站徹夜排隊購買車票,但隨著科技的發(fā)展,這一現(xiàn)象已逐漸成為歷史,12306網(wǎng)絡(luò)購票系統(tǒng)正式上線,隨之而來的也有各樣的搶票軟件[1]。搶票軟件的出現(xiàn)不僅破壞市場的公平性和穩(wěn)定性,也對鐵路12306購票系統(tǒng)造成人力、物力的浪費(fèi)。本文將從搶票軟件的實現(xiàn)過程、對系統(tǒng)資源的危害做出闡述并模擬分析多線程并發(fā)的危害。
2搶票軟件的實現(xiàn)流程
市場上大多數(shù)的搶票軟件運(yùn)轉(zhuǎn)原理是由軟件提前自動存儲旅客的個人信息,放票系統(tǒng)一開放就用機(jī)器操作代替用戶自己手動登錄網(wǎng)站搶票,除此之外通過提高對12306網(wǎng)站的票源信息訪問頻率,一旦有人退票,能在較快的時間為用戶鎖定座位席[2]。但這種方式并不能改變一趟列車固定的座位數(shù),而是打破了買票平衡,類似于生活中的插隊行為。
2.1身份證——“偽實名”
鐵路12306購票的“實名”其實是“偽實名”,因為購票系統(tǒng)后臺并不會從人口信息庫里一一匹配購票人的信息是否真實存在,所以只要旅客提供的身份證符合常規(guī)的輸入格式,那么一樣可以成功購票。而黃牛們就是利用這種算法自動生成身份證號搶票,再在某個指定時間將票取消放出,最后用客戶的真實信息購票,因為速度原因,放出去的票還是會被黃牛重新購入。所以票會在黃牛提供的虛假身份賬號的未支付的訂單中不停的循環(huán)。
2.2多線程并發(fā)—— 刷新網(wǎng)站
第三方搶票軟件具體的實現(xiàn)過程與計算機(jī)操作系統(tǒng)以及網(wǎng)絡(luò)爬蟲有一定的關(guān)聯(lián)。實現(xiàn)原理是:多個線程并發(fā)執(zhí)行,利用多個終端的多個線程同時搶票。在一定的時間間隔內(nèi)向鐵路12306網(wǎng)站發(fā)出訪問請求,目的是獲取當(dāng)前網(wǎng)站的票務(wù)信息。當(dāng)某個線程發(fā)現(xiàn)所需的座位席有余票時,為了避免臨界資源——票被其他的線程訪問,導(dǎo)致一張票被賣給多人,則會對臨界資源進(jìn)行上鎖,實現(xiàn)資源的互斥。購票成功后才會釋放鎖,重復(fù)上述操作。
3搶票軟件的危害性
搶票軟件通過高頻率向網(wǎng)站發(fā)送訪問請求從而提高對網(wǎng)站車次信息的刷新頻率,使得軟件能在第一時間掌握座位席情況,但這并不能保證一定能為旅客買到票。因為座位席數(shù)是一定的,而能否購買到車票與12306放票系統(tǒng)有關(guān)[2]。并且從用戶安全和系統(tǒng)安全方面考慮,第三方搶票軟件存在泄漏用戶隱私、隱形收費(fèi)等問題,而這種高頻率的信息刷新和訪問網(wǎng)站可能會造成12306系統(tǒng)崩潰,影響其他旅客正常購票。
3.1多線程并發(fā)執(zhí)行的危害
多線程可以提高程序并發(fā)執(zhí)行的速度,但系統(tǒng)對于線程數(shù)量也有一定的要求,并非數(shù)量越多運(yùn)行速度越快。原因之一是因為,每個線程的建立都會消耗系統(tǒng)內(nèi)存空間,所以線程數(shù)量過多就意味著占用了電腦中更多的內(nèi)存資源,造成資源浪費(fèi)。另一個原因是cpu不允許同時執(zhí)行兩個線程,在執(zhí)行多線程任務(wù)中需要輪流切換,若線程太多,cpu必須不斷加快切換速度,而線程間的切換無意間消耗了許多時間,所以cpu有效利用率反而是下降的。其三是拖慢主線程。如果子線程的優(yōu)先級都和主線程一樣高,主線程就得不到更多資源優(yōu)先執(zhí)行,主線程的性能降低。
3.2對鐵路12306服務(wù)器的破壞
搶票軟件利用多IP多線程并發(fā)執(zhí)行,快速且連續(xù)的向鐵路12306網(wǎng)絡(luò)購票系統(tǒng)發(fā)出訪問請求。這種刷屏式的搶票方式,無異于加大12306的服務(wù)壓力,擠占服務(wù)器的服務(wù)寬帶,過大的訪問需求量可能會引起服務(wù)器癱瘓,這也就擾亂了公平、正常的購票秩序,影響了其他沒有使用搶票軟件的旅客的購票。雖然鐵路12306網(wǎng)絡(luò)購票系統(tǒng)通過增加驗證碼的識別難度,打擊機(jī)器自動購票的行為,但由于驗證碼難度的上升,提交錯誤驗證碼的次數(shù)也隨著上升,對服務(wù)器又是一種額外的負(fù)擔(dān)。
3.3 泄露用戶信息
所謂的“搶票軟件”更多時候是利用販賣人的買票焦慮情緒,打著技術(shù)的幌子,二次消費(fèi)客戶的隱私信息用于商用。一趟車次的座位席是固定的,搶票軟件搶的其實是這趟車次的余票、退票,如果沒有余票也沒有人退票,那么搶票軟件也是根本搶不到票的。而大量的客戶信息被提前存儲在搶票軟件上,所以對于大部分旅客而言,不僅買不到票,浪費(fèi)了時間,也將自己的私人信息泄露出去,讓不法分子們嗅到了商機(jī)。
4針對多線程并發(fā)危害的模擬和對比分析
4.1基于Linux系統(tǒng)的多線程并發(fā)程序?qū)崿F(xiàn)
操作系統(tǒng)中為了使多個程序并發(fā)執(zhí)行, 改善內(nèi)存使用情況和提高內(nèi)存利用率引入了進(jìn)程。但當(dāng)進(jìn)程并發(fā)執(zhí)行時, 所占用的系統(tǒng)內(nèi)存也較高, 在此基礎(chǔ)上, 操作系統(tǒng)中再次引入線程[3]。例如data++運(yùn)算符一共會執(zhí)行3條指令,首先是把內(nèi)存中的data值放到寄存器中,然后再對data值進(jìn)行+1操作,最后再把寄存器中的data值寫回到內(nèi)存中。在這三條指令執(zhí)行的過程中,我們不知道何時會對線程進(jìn)行切換,所以可能會在執(zhí)行第一條指令執(zhí)行的時候,另一個線程開始執(zhí)行,最終導(dǎo)致data的值不是預(yù)期的值。我們在購買火車票,飛機(jī)票時就可能會遇到此問題。不同用戶會購買同一趟列車的票,此時的票數(shù)就相當(dāng)于全局變量,不同用戶相當(dāng)于不同線程,如果不做線程同步的相關(guān)處理,那么就會造成最后的出票數(shù)和用戶購票數(shù)的不一致。下面用Linux pthread API來模擬多線程并發(fā)執(zhí)行可能會造成的后果。
int data = 0;
int i = 0;
void * thread_task(void * arg) {
while(1) {
int val = data;
i++;
printf("線程:%d 正在執(zhí)行---data的值變?yōu)椋?d\n",pthread_self(),data);
data = val + 1;
if(i == 10000)break;
}
return NULL;
}
int main(){
int ret,i;
pthread_t tid[2];
for(i = 0; i < 2;i++) {
ret = pthread_create(&tid[i],NULL,thread_task,NULL);
assert(ret == 0);
}
}
以上代碼使用pthread_create函數(shù)來創(chuàng)建一個新線程,總共創(chuàng)建了兩個子線程,兩個子線程都對全局變量data和i進(jìn)行賦值更新操作。當(dāng)i到1000時,結(jié)束線程任務(wù),并最后打印全局變量data的值。結(jié)果如下圖所示:
如圖所示,按照預(yù)想的來看,最后data的值應(yīng)該為10000,但是實際最后data的值卻為123。主要原因就是在運(yùn)算指令還未完成時,兩個進(jìn)程進(jìn)行切換,最后導(dǎo)致結(jié)果不符合預(yù)期。
4.2對系統(tǒng)資源占有的對比分析
我們又創(chuàng)建了一個單線程程序,對比單線程和多線程在資源占比上的區(qū)別。用top命令動態(tài)實時觀察單線程和多線程資源利用方面的區(qū)別。結(jié)果如下:
從比較表來看,首先第一個不同點就是使用的虛擬內(nèi)存總量,單線程進(jìn)程為4560,而多線程進(jìn)程則為22896。多線程進(jìn)程的虛擬內(nèi)存分配量要遠(yuǎn)遠(yuǎn)超于單線程進(jìn)程的虛擬內(nèi)存分配量,這是由于Linux要對于多線程的虛擬內(nèi)存分配策略所導(dǎo)致。第二個不同點就是cpu的占有率,多線程程序的cpu占有率要高于單線程的cpu占有率,表明多線程程序能夠更充分的利用cpu,提高cpu利用率。最后一個就是實際內(nèi)存的占用,多線程程序會比單線程程序占用更多的實際內(nèi)存。
5總結(jié)
搶票軟件搶的是未買完的座位席和退票,如果沒有退票也沒有空位,那么搶票軟件根本搶不到票,所以搶票軟件和搶票率沒有必然聯(lián)系,使用搶票軟件對鐵路12306官網(wǎng)和電腦系統(tǒng)也有一定的危害。而近幾年鐵路官網(wǎng)開通了候補(bǔ)購票通道緩解旅客們買票難得壓力,并在一定程度上打擊了搶票軟件。所以在這里呼吁各位,采取科學(xué)有效的措施購票買票。
參考文獻(xiàn):
[1]? 劉麗娜.搶票軟件需規(guī)制[N].檢察日報,2020-01-08(7).
[2] 萬婉娉,顏瑞,梁紅玉,馬千惠,金明.第三方搶票軟件的相關(guān)研究[J].現(xiàn)代商貿(mào)工業(yè),2020,41(15):35-36.
[3] 張步忠.Java語言中的線程同步互斥研究[J].安慶師范學(xué)院學(xué)報(自然科學(xué)版),2011,17(4):106-110.
【通聯(lián)編輯:光文玲】