浅谈抢票软件的危害及模拟分析

2021-11-28 00:27周彦汐李成奥徐艳
电脑知识与技术 2021年30期
关键词:买票购票线程

周彦汐 李成奥 徐艳

摘要:抢票软件的出现,在一定程度上缓解了铁路12306官方购票系统的售票压力,并被人们加上“买票快”,“买票方便”的标签,但其实抢票软件类似于生活中的一种插队现象,不仅没有抢票率的保证,而且从用户隐私安全和系统操作性能而言,抢票软件存在泄漏用户隐私、隐形收费、对服务器资源造成破坏等问题。

关键词:多线程并发;模拟分析危害

中图分类号:TP393      文献标识码:A

文章编号:1009-3044(2021)30-0055-02

开放科学(资源服务)标识码(OSID):

1引言

春节,对于中国人来说,象征着团圆和对来年的美好期盼,而一张火车票承载的是万千游子对故乡深深的思恋。在二十年前,我们为了一张春节返家的车票在车站彻夜排队购买车票,但随着科技的发展,这一现象已逐渐成为历史,12306网络购票系统正式上线,随之而来的也有各样的抢票软件[1]。抢票软件的出现不仅破坏市场的公平性和稳定性,也对铁路12306购票系统造成人力、物力的浪费。本文将从抢票软件的实现过程、对系统资源的危害做出阐述并模拟分析多线程并发的危害。

2抢票软件的实现流程

市场上大多数的抢票软件运转原理是由软件提前自动存储旅客的个人信息,放票系统一开放就用机器操作代替用户自己手动登录网站抢票,除此之外通过提高对12306网站的票源信息访问频率,一旦有人退票,能在较快的时间为用户锁定座位席[2]。但这种方式并不能改变一趟列车固定的座位数,而是打破了买票平衡,类似于生活中的插队行为。

2.1身份证——“伪实名”

铁路12306购票的“实名”其实是“伪实名”,因为购票系统后台并不会从人口信息库里一一匹配购票人的信息是否真实存在,所以只要旅客提供的身份证符合常规的输入格式,那么一样可以成功购票。而黄牛们就是利用这种算法自动生成身份证号抢票,再在某个指定时间将票取消放出,最后用客户的真实信息购票,因为速度原因,放出去的票还是会被黄牛重新购入。所以票会在黄牛提供的虚假身份账号的未支付的订单中不停的循环。

2.2多线程并发—— 刷新网站

第三方抢票软件具体的实现过程与计算机操作系统以及网络爬虫有一定的关联。实现原理是:多个线程并发执行,利用多个终端的多个线程同时抢票。在一定的时间间隔内向铁路12306网站发出访问请求,目的是获取当前网站的票务信息。当某个线程发现所需的座位席有余票时,为了避免临界资源——票被其他的线程访问,导致一张票被卖给多人,则会对临界资源进行上锁,实现资源的互斥。购票成功后才会释放锁,重复上述操作。

3抢票软件的危害性

抢票软件通过高频率向网站发送访问请求从而提高对网站车次信息的刷新频率,使得软件能在第一时间掌握座位席情况,但这并不能保证一定能为旅客买到票。因为座位席数是一定的,而能否购买到车票与12306放票系统有关[2]。并且从用户安全和系统安全方面考虑,第三方抢票软件存在泄漏用户隐私、隐形收费等问题,而这种高频率的信息刷新和访问网站可能会造成12306系统崩溃,影响其他旅客正常购票。

3.1多线程并发执行的危害

多线程可以提高程序并发执行的速度,但系统对于线程数量也有一定的要求,并非数量越多运行速度越快。原因之一是因为,每个线程的建立都会消耗系统内存空间,所以线程数量过多就意味着占用了电脑中更多的内存资源,造成资源浪费。另一个原因是cpu不允许同时执行两个线程,在执行多线程任务中需要轮流切换,若线程太多,cpu必须不断加快切换速度,而线程间的切换无意间消耗了许多时间,所以cpu有效利用率反而是下降的。其三是拖慢主线程。如果子线程的优先级都和主线程一样高,主线程就得不到更多资源优先执行,主线程的性能降低。

3.2对铁路12306服务器的破坏

抢票软件利用多IP多线程并发执行,快速且连续的向铁路12306网络购票系统发出访问请求。这种刷屏式的抢票方式,无异于加大12306的服务压力,挤占服务器的服务宽带,过大的访问需求量可能会引起服务器瘫痪,这也就扰乱了公平、正常的购票秩序,影响了其他没有使用抢票软件的旅客的购票。虽然铁路12306网络购票系统通过增加验证码的识别难度,打击机器自动购票的行为,但由于验证码难度的上升,提交错误验证码的次数也随着上升,对服务器又是一种额外的负担。

3.3 泄露用户信息

所谓的“抢票软件”更多时候是利用贩卖人的买票焦虑情绪,打着技术的幌子,二次消费客户的隐私信息用于商用。一趟车次的座位席是固定的,抢票软件抢的其实是这趟车次的余票、退票,如果没有余票也没有人退票,那么抢票软件也是根本抢不到票的。而大量的客户信息被提前存储在抢票软件上,所以对于大部分旅客而言,不仅买不到票,浪费了时间,也将自己的私人信息泄露出去,让不法分子们嗅到了商机。

4针对多线程并发危害的模拟和对比分析

4.1基于Linux系统的多线程并发程序实现

操作系统中为了使多個程序并发执行, 改善内存使用情况和提高内存利用率引入了进程。但当进程并发执行时, 所占用的系统内存也较高, 在此基础上, 操作系统中再次引入线程[3]。例如data++运算符一共会执行3条指令,首先是把内存中的data值放到寄存器中,然后再对data值进行+1操作,最后再把寄存器中的data值写回到内存中。在这三条指令执行的过程中,我们不知道何时会对线程进行切换,所以可能会在执行第一条指令执行的时候,另一个线程开始执行,最终导致data的值不是预期的值。我们在购买火车票,飞机票时就可能会遇到此问题。不同用户会购买同一趟列车的票,此时的票数就相当于全局变量,不同用户相当于不同线程,如果不做线程同步的相关处理,那么就会造成最后的出票数和用户购票数的不一致。下面用Linux pthread API来模拟多线程并发执行可能会造成的后果。

int data = 0;

int i = 0;

void * thread_task(void * arg) {

while(1) {

int val = data;

i++;

printf("线程:%d 正在执行---data的值变为:%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函数来创建一个新线程,总共创建了两个子线程,两个子线程都对全局变量data和i进行赋值更新操作。当i到1000时,结束线程任务,并最后打印全局变量data的值。结果如下图所示:

如图所示,按照预想的来看,最后data的值应该为10000,但是实际最后data的值却为123。主要原因就是在运算指令还未完成时,两个进程进行切换,最后导致结果不符合预期。

4.2对系统资源占有的对比分析

我们又创建了一个单线程程序,对比单线程和多线程在资源占比上的区别。用top命令动态实时观察单线程和多线程资源利用方面的区别。结果如下:

从比较表来看,首先第一个不同点就是使用的虚拟内存总量,单线程进程为4560,而多线程进程则为22896。多线程进程的虚拟内存分配量要远远超于单线程进程的虚拟内存分配量,这是由于Linux要对于多线程的虚拟内存分配策略所导致。第二个不同点就是cpu的占有率,多线程程序的cpu占有率要高于单线程的cpu占有率,表明多线程程序能够更充分的利用cpu,提高cpu利用率。最后一個就是实际内存的占用,多线程程序会比单线程程序占用更多的实际内存。

5总结

抢票软件抢的是未买完的座位席和退票,如果没有退票也没有空位,那么抢票软件根本抢不到票,所以抢票软件和抢票率没有必然联系,使用抢票软件对铁路12306官网和电脑系统也有一定的危害。而近几年铁路官网开通了候补购票通道缓解旅客们买票难得压力,并在一定程度上打击了抢票软件。所以在这里呼吁各位,采取科学有效的措施购票买票。

参考文献:

[1]  刘丽娜.抢票软件需规制[N].检察日报,2020-01-08(7).

[2] 万婉娉,颜瑞,梁红玉,马千惠,金明.第三方抢票软件的相关研究[J].现代商贸工业,2020,41(15):35-36.

[3] 张步忠.Java语言中的线程同步互斥研究[J].安庆师范学院学报(自然科学版),2011,17(4):106-110.

【通联编辑:光文玲】

猜你喜欢
买票购票线程
不同的购票方法
直击痛点的“候补购票”可多来一些
铁路候补购票服务扩大到全部列车
智擒偷儿
浅谈linux多线程协作
瞬间
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究
么移动中间件线程池并发机制优化改进
买票