本技术公开了一种并行无锁可编程脚本设计方法及装置,应用于互联网技术领域。该方法包括:线程初始化配置:根据线程结构和指针结构,定义工作线程的私有指针变量,并基于所述私有指针变量对所述工作线程和配置线程进行初始化配置;线程运行并获取脚本数据:运行所述工作线程,通过所述私有指针变量获取并执行所述脚本数据;脚本数据替换:所述配置线程接收新的脚本数据,并对脚本指针变量进行更新处理;其中,所述线程结构包括线程编号、线程类别和线程数量,所述线程类别包括工作线程和配置线程,所述指针结构包括私有指针变量和脚本指针变量,从而提升线程运行的性能和执行的效率。
背景技术
在负载均衡设备中,用户希望通过在虚拟服务器上挂载自定义的脚本,实现对访问虚拟服务器的数据包转发路径的定制、数据包协议头选项或者数据内容的定制,此种情况下能快速为用户提供可编程脚本是最佳选择,让用户通过简单的脚本配置就能定制自己想要的功能。
在常用的负载均衡设备中,有一个配置线程和N个工作线程,配置线程负责接收用户在WEB界面或CLI(命令行)的配置,然后传递给工作线程,工作线程根据用户的配置完成对数据包的处理(丢弃或者转发)。
因为涉及到配置线程和工作线程在运行时交互数据,为了保证交互数据的一致性,通用的做法是配置线程在收到WEB端或者CLI下发的脚本数据后,首先做好脚本内容正确性的检查,然后加一把全局锁,获取到全局锁之后,然后逐个替换虚拟服务器上的脚本文件,最后释放锁,工作线程需要执行脚本时首先获取这把全局的锁,获取全局锁之后可以拿到虚拟服务器上的可执行脚本,执行完脚本后再释放全局锁。这样配置线程和工作线程之间会因为脚本更新而竞争锁资源,工作线程都会使用读锁,如果工作线程较多且任务繁忙时,工作线程可能会一直保持持有读锁而不释放,导致配置线程申请的写锁一直等待而影响配置更新。或者另一种方式,让每个工作线程都有一把脚本配置锁,工作线程要执行脚本时都加自己的脚本配置锁,但是这样会带来另一个问题,就是配置线程更新时,首先要获取全部的锁资源后,才能逐个替换,因为获取锁是可能失败的。不论采用那种加锁的方式都会阻止工作线程执行脚本,而且锁操作效率低下。
综上所述,有必要引入一种新的方法及装置,以对脚本这类配置内容的替换采用无锁替换的方式,通过工作线程的私有指针是否指向新的脚本内容来判断脚本内容是否正在使用,根据判断的结果替换并释放旧的脚本内容空间,以解决现有技术中的多线程竞争锁资源影响配置更新,以及配置线程更新时获取锁失败的技术问题,进而提升线程运行的性能和执行的效率,以及对脚本内容的操作效率。
实现思路