CN114928579B - 数据处理方法、装置、计算机设备及存储介质 - Google Patents
数据处理方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN114928579B CN114928579B CN202110151770.6A CN202110151770A CN114928579B CN 114928579 B CN114928579 B CN 114928579B CN 202110151770 A CN202110151770 A CN 202110151770A CN 114928579 B CN114928579 B CN 114928579B
- Authority
- CN
- China
- Prior art keywords
- variable
- target
- buffer queue
- value
- queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 29
- 239000000872 buffer Substances 0.000 claims abstract description 734
- 238000000034 method Methods 0.000 claims abstract description 108
- 230000004044 response Effects 0.000 claims abstract description 66
- 238000012545 processing Methods 0.000 claims description 87
- 230000003139 buffering effect Effects 0.000 claims description 10
- 230000008569 process Effects 0.000 abstract description 70
- 238000005516 engineering process Methods 0.000 abstract description 6
- 230000006870 function Effects 0.000 description 36
- 238000004891 communication Methods 0.000 description 26
- 238000010586 diagram Methods 0.000 description 26
- 230000000903 blocking effect Effects 0.000 description 8
- 230000005540 biological transmission Effects 0.000 description 7
- 238000004590 computer program Methods 0.000 description 7
- 238000001514 detection method Methods 0.000 description 6
- 238000013475 authorization Methods 0.000 description 4
- 238000012795 verification Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 125000004122 cyclic group Chemical group 0.000 description 3
- 230000000977 initiatory effect Effects 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 239000003795 chemical substances by application Substances 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 238000012384 transportation and delivery Methods 0.000 description 2
- 241000700605 Viruses Species 0.000 description 1
- 230000002159 abnormal effect Effects 0.000 description 1
- 125000002015 acyclic group Chemical group 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000011981 development test Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 230000004927 fusion Effects 0.000 description 1
- ZXQYGBMAQZUVMI-GCMPRSNUSA-N gamma-cyhalothrin Chemical compound CC1(C)[C@@H](\C=C(/Cl)C(F)(F)F)[C@H]1C(=O)O[C@H](C#N)C1=CC=CC(OC=2C=CC=CC=2)=C1 ZXQYGBMAQZUVMI-GCMPRSNUSA-N 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000000737 periodic effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000013468 resource allocation Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
- H04L49/901—Buffering arrangements using storage descriptor, e.g. read or write pointers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L49/00—Packet switching elements
- H04L49/90—Buffering arrangements
- H04L49/9031—Wraparound memory, e.g. overrun or underrun detection
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/14—Session management
- H04L67/141—Setup of application sessions
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请基于云技术公开一种数据处理方法、装置、计算机设备及介质,该方法可由第一客户端执行,具体包括:在获取到第二客户端发送的多个网络数据包后,调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存任一生产者存入的内存地址;异步调用多个消费者线程从目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从存储空间中获取对应的目标网络数据包;调用多个消费者线程对获取到的各个目标网络数据包进行响应处理。本申请可以较好地对网络数据包进行处理,从而提升数据包响应的及时性和稳定性。
Description
技术领域
本申请涉及互联网技术领域,具体涉及计算机技术领域,尤其涉及一种数据处理方法、一种数据处理装置、一种计算机设备及一种计算机存储介质。
背景技术
随着互联网技术的发展,目前的计算机设备不仅可支持安装并运行多个客户端组件(后续简称客户端),还可支持各个客户端通过在计算机设备中进行本地通信来更好地为用户提供服务。任一客户端在运行过程中,若接收到同一设备中的其他客户端发送网络数据包,则需要对该网络数据包进行响应处理,并将响应结果返回给其他客户端,使得其他客户端可基于该响应结果执行后续处理。目前,当同时接收到其他客户端通过本地通信发送的多个网络数据包时,如何更好地对各个网络数据包进行处理,以提升请求响应的及时性和稳定性成为了研究热点。
发明内容
本发明实施例提供了一种数据处理方法、装置、计算机设备及存储介质,可以较好地对网络数据包进行处理,从而提升数据包响应的及时性和稳定性。
一方面,本发明实施例提供了一种数据处理方法,所述数据处理方法由第一客户端执行,所述第一客户端与第二客户端进行通信,且所述第一客户端和所述第二客户端运行在同一个设备中;所述方法包括:
在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
另一方面,本发明实施例提供了一种数据处理装置,所述数据处理装置运行在第一客户端中,所述第一客户端与第二客户端进行通信,且所述第一客户端和所述第二客户端运行在同一个设备中;所述装置包括:
缓存单元,用于在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
读取单元,用于异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
处理单元,用于调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
再一方面,本发明实施例提供了一种计算机设备,所述计算机设备包括输入接口和输出接口,所述计算机设备还包括:
处理器,适于实现一条或多条指令;以及,
计算机存储介质,所述计算机存储介质存储有一条或多条指令,所述一条或多条指令适于由所述处理器加载并执行如下步骤:
在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
再一方面,本发明实施例提供了一种计算机存储介质,所述计算机存储介质存储有一条或多条指令,所述一条或多条指令适于由处理器加载并执行如下步骤:
在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
本发明实施例中的第一客户端获取到同一个设备中的第二客户端发送的多个网络数据包后,可调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列中。目标缓冲队列中的第i个缓冲区是在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存该任一生产者存入的内存地址的;可见,任一生产者线程在缓存其负责的内存地址时,只需通过原子操作在目标缓冲队列中预定一个缓冲区,并在成功预定后写入该内存地址即可,整个缓存过程无需对生产者线程执行加锁操作,从而可有效降低因加锁而给生产者线程造成的性能影响,进而提升整个响应过程的稳定性。在对目标缓冲队列执行写入操作时,还可异步地调用多个消费者线程从目标缓冲队列中读取已缓存的内存地址;通过异步读取内存地址的方式,可以有效减少内存地址的读取时延,从而实现对整个响应过程进行有效加速。当任一消费者线程读取到一个内存地址后,便可根据该内存地址从存储空间中获取对应的目标网络数据包,并对获取的目标网络数包进行响应处理;这样可实现多个消费者线程对网络数据包的并行响应,进一步减少响应时延,提升响应及时性。并且,通过缓存内存地址,可避免生产者线程执行写操作以及消费者线程执行读操作时,因对目标缓冲队列执行数据拷贝操作而引起的性能消耗问题,可有效提升处理效率,进而加速响应过程。
附图说明
为了更清楚地说明本发明实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1a是本发明实施例提供的一种目标缓冲队列的结构示意图;
图1b是本发明实施例提供的一种通信连接的示意图;
图1c是本发明实施例提供的一种获取网络数据包的示意图;
图1d是本发明实施例提供的一种向目标缓冲队列写入内存地址的示意图;
图1e是本发明实施例提供的一种从目标缓冲队列读取内存地址,并异步回收内存地址的示意图;
图2是本发明实施例提供的一种数据处理方法的流程示意图;
图3a是本发明实施例提供的一种目标缓冲队列配置有三个变量的示意图;
图3b是本发明实施例提供的一种异步回收内存地址的示意图;
图4是本发明另一实施例提供的一种数据处理方法的流程示意图;
图5a是本发明实施例提供的一种检测目标缓冲队列是否队满的示意图;
图5b是本发明实施例提供的一种如何对目标缓冲队列执行入队操作的流程示意图;
图5c是本发明实施例提供的一种检测目标缓冲队列是否队空的示意图;
图5d是本发明实施例提供的一种如何对目标缓冲队列执行出队操作的流程示意图;
图5e是本发明实施例提供的一种对目标缓冲队列进行动态扩容的示意图;
图6a是本发明实施例提供的一种零信任系统的架构图;
图6b是本发明实施例提供的一种访问主体和访问客体之间的关系示意图;
图6c是本发明实施例提供的一种零信任策略的配置界面图;
图6d是本发明实施例提供的一种可信应用的配置界面图;
图6e是本发明实施例提供的一种IP地址的配置界面图;
图6f是本发明实施例提供的一种域名地址的配置界面图;
图6g是本发明实施例提供的一种iOA客户端输出的登录界面的示意图;
图6h是本发明实施例提供的一种iOA客户端输出的提示界面的示意图;
图6i是本发明实施例提供的一种iOA客户端输出的应用信息界面的示意图;
图7是本发明实施例提供的一种数据处理装置的结构示意图;
图8是本发明实施例提供的一种计算机设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
本发明实施例针对同一个计算机设备中所运行的两个不同客户端之间的本地通信,提出了一种数据处理方案;该数据处理方案通过引入非阻塞的目标缓冲队列作为网络数据包的缓冲结构,并通过将网络数据包的接收、解析和响应过程区分开,为客户端提供并行地执行网络数据包的接收、解析和响应的能力;使得任一客户端在同时获取到同一计算机设备中的其他客户端所发送的多个网络数据包时,可较好地对各个网络数据包进行响应处理,以提升数据包响应的及时性和稳定性。
其中,该目标缓冲队列可以是一个采用K(K为正整数)个缓冲区并基于循环数组所实现的缓冲队列,如环状循环队列;所谓的环状循环队列可以理解为是一个将各个缓冲区依次排列并进行首尾相连所形成的,从逻辑上看形状为环状的队列,如图1a所示。其中,图1a中的HEAD表示第一个加入队列中的数据,TAIL表示最后一个加入队列中的数据;并且,数据是按照图1a所示的顺时针方向所指示的顺序被写入至环状循环队列的。在该环状循环队列中,当最后一个缓冲区已被使用而需再执行入队操作时,只要第一缓冲区处于空闲状态,便可将需要入队的数据写入到第一个缓冲区中,这样可有效防止队列假溢出的情况;所谓的队列假溢出是指:队列存在空闲的缓冲区,但无法继续缓存数据的现象。应理解的是,图1a只是示例性地表征目标缓冲队列的结构示意图,并不对此进行限定;例如,数据也可以是按照逆时针方向所指示的顺序被写入至环状循环队列的;又如,该目标缓冲队列也可以是非环状的循环队列;再如,若不考虑队列假溢出的问题,则该目标缓冲队列也可以是一个采用K个缓冲区所构成的非循环的队列,等等。
需要说明的是,上述所提及的计算机设备可以是终端或者服务器,对此不作限制。其中,终端可包括但不限于:智能手机、平板电脑、笔记本电脑、台式计算机等;服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器,等等。所谓的云计算是网格计算(Grid Computing)、分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(UtilityComputing)、网络存储(Network Storage Technologies)、虚拟化(Virtualization)、负载均衡(Load Balance)等传统计算机和网络技术发展融合的产物。
为便于阐述,后续将计算机设备中用于对接收网络数据包并对网络数据包执行响应处理的客户端称为第一客户端,将用于产生网络数据包的客户端称为第二客户端。第一客户端和第二客户端之间可通过TCP(Transmission Control Protocol,传输控制协议)协议建立本地通信,且第一客户端可支持第二客户端同时发起多个TCP连接;TCP连接可以分为长链或者短链,所谓的长链是指每次建立通信后可进行至少两次数据传输的连接,短链则是指每次建立通信后只进行一次数据传输的连接。例如,第二客户端通过TCP协议与第一客户端成功建立通信连接后,第二客户端可基于该通信连接向第一客户端发送一个数据请求1。若在成功发送数据请求1后,直接断开了该通信连接,则可认为该通信连接属于短链,如图1b中的左图所示。若在成功发送数据请求1后,继续保持该通信连接,并基于该通信连接继续发送数据请求2,甚至更多的数据请求后,才断开该通信连接,则该通信连接可属于长链,如图1b中的右图所示。由此可见,同一个长链可允许发起多个请求;需要说明的是,本发明实施例所提及的每个TCP连接均为长链。
下面将结合图1c-图1e,对本发明实施例所提出的数据处理方案的大致原理进行阐述:
首先,第二客户端可作为生产者角色(producer),采用单生产者模式或者多生产者模式来发送字节流(socket stream);所谓的单生产者模式是指:通过单个长链与第一客户端进行通信的模式;多生产者模式是指:通过多个长链与第一客户端进行通信的模式。也就是说,第二客户端可通过与第二客户端建立单个长链发送字节流;或者,也可以通过与第二客户端建立多个长链来并行地发送字节流。相应的,与第二客户端的生产者角色相对的是第一客户端的消费者角色(consumer);第一客户端作为消费者角色,可调用主服务进程接收第二客户端所发送的字节流,所谓的进程是指系统进行资源分配和调度的基本单位。主服务进程在接收完字节流后,可对该字节流进行解析处理以得到多个网络数据包。具体可参见图1c所示,第一客户端可从字节流中解析出多个初始数据包;并检测多个初始数据包中是否存在黏包,所谓的黏包是指由一个数据包加上其他数据包中的全部数据或部分数据所构成的包。若多个初始数据包中存在黏包,则可对多个初始数据包进行格式化处理(如黏包拆分处理),得到多个网络数据包;若多个初始数据包不存在黏包,则可直接将多个初始数据包作为多个网络数据包。其中,每个网络数据包均是由一个定长header(头部)和加密body(包体)组成的。
由于每个网络数据包在被主服务进程获取到后,在该主服务进程中便具备唯一的内存地址,且各个内存地址均可被主服务进程中的多个线程访问到;因此为了避免在对目标缓冲队列执行读操作和写操作时,因拷贝网络数据包的具体数据内容而引起的性能消耗问题,可设置目标缓冲队列中的每一个缓冲区均用于缓存网络数据包的内存地址,使得第一客户端采用线程池的方式通过目标缓冲队列缓存的内存地址消费这多个网络数据包,从而完成各个网络数据包的响应处理。其中,该线程池中可包括多个生产者线程和多个消费者线程,生产者线程的数量和消费者线程的数量可相同或不同,对此不作限制;此处所提及的生产者线程是指:用于对目标缓冲队列执行写操作的线程,消费者线程则是指:用于对目标缓冲队列执行读操作以及对网络数据包进行响应处理的线程。
基于此,在获取到多个数据包后,第一客户端可调用多个生产者线程通过原子操作来申请(预定)缓冲区的方式,将多个网络数据包的内存地址缓存至目标缓冲队列,一个缓冲区每次只能被一个生产者线程通过原子操作成功申请到,如图1d所示;此处的原子操作是指计算机设备的处理器所支持的、不可被中断的一个或一系列操作,如CAS(Compare&Set,比较并交换)操作,FAA(Fetch and Add,原子加)操作等。只要目标缓冲队列成功被写入一个内存地址后,第一客户端便可异步地调用多个消费者线程通过原子操作来抢占缓冲区的方式,从目标缓冲队列中读取一个或多个已缓存的内存地址,一个缓冲区每次只能被一个消费者线程执行读操作。每个消费者从目标缓冲队列中读取出内存地址后,便可直接根据该内存地址找到实际的目标网络数据包,并对找到的目标网络数据包进行响应处理;在该目标网络数据包处理完毕后,不仅可向第二客户端返回该目标网络数据包的响应结果,还可异步回收该目标数据包的内存地址以节省缓冲空间,如图1e所示。
基于上述描述可知,本发明实施例所提出的数据处理方案可至少具有如下有益效果:
①通过引入非阻塞机制的目标缓冲队列作为网络数据包的缓冲结构,并通过原子操作在目标缓冲队列中预定一个位置(即缓冲区),从而在该位置上插入或提取内存地址的方式,可实现并行执行的任务之间不争抢任何资源,能够显著降低了任务抢占的频率,从而可有效减缓cache(缓冲区)颠簸,提升响应的稳定性。其中,cache颠簸是指因发生任务抢占而导致cache中的数据从失效状态到最终可用状态之间的现象;也就是说,cache颠簸是由如下原因导致的:在当前任务被抢占时,当前cache中的内容需要被接下来获得运行权的进程覆盖,且接下来待运行的进程需要花费时间将cache预热才能达到良好的运行效率;此过程涉及对cache进行保存和恢复上下文的操作,而在保存和恢复上下文的过程中cache中的数据便会失效,最终可从失效状态切换成可用状态。
②由于内存地址的写入是由相应线程通过执行原子操作来抢占缓存区实现的,因此各个内存地址的写入顺序取决于各个生产者线程的抢占缓冲区的速度。也就是说,各个网络数据包的内存地址的写入顺序和网络数据包的获取顺序是相互独立;最先被获取到的网络数据包,其对应的内存地址不一定是最先被写入至目标缓冲队列的,从而使得其对应的内存地址也不一定是最先被从目标缓冲队列中读取出的,即最先被获取到的网络数据包不一定是最先被响应处理的,其对应的响应结果也不一定是最先反馈给第二客户端的。由此可见,通过执行原子操作来抢占缓存区的方式执行读写操作,并通过优化客户端之间的通讯协议,可实现网络数据包的异步乱序响应,避免了单步执行按序响应导致的时延,阻塞后续字节流的解析,可打破串行处理的限制,提升响应及时性。
③通过将网络数据包的接收和响应操作分开处理的方式,即接收完字节流,解析完毕形成完整网络数据包后,再将各个网络数据包的内存地址送入非阻塞队列,通过多个线程来根据非阻塞队列中的内存地址来消费各个网络数据包的方式;可支持多个消费者线程对各个网络数据包的并行处理,有效提升网络数据包的响应及时性。并且,通过采用缓冲区来缓存内存地址的方式,一方面可避免生产者线程在存入缓冲结构,消费者线程消费缓冲结构时因拷贝实际的数据内容而引起的性能消耗问题,可有效提升处理效率。另一方面还可有效降低了缓冲结构的内存占用(如果存储网络数据包的实际内容,则要求构成该缓冲结构的每个缓冲区需要容纳网络数据包的最大数据量,因为循环数组是提前分配空间的,而且每个缓冲区的空间大小相同,易引起较大比例的空间浪费),并可避免因空间划分不合适,而导致当某个网络数据包的数据量大于缓冲区的空间大小时,无法缓存该网络数据包的问题。可见,通过采用缓冲区来缓存内存地址的方式具有较强的灵活性和可用性。
基于上述数据处理方案的描述,本发明实施例提出一种数据处理方法;该数据处理方法可以由上述所提及的第一客户端执行,第一客户端与第二客户端进行通信,且第一客户端和第二客户端运行在同一个设备中。请参见图2,该数据处理方法可包括以下步骤S201-S203:
S201,在获取到第二客户端发送的多个网络数据包后,调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列。
其中,目标缓冲队列可包括K个缓冲区,K为正整数;一个缓冲区可具有一个区域标识,且一个缓冲区用于缓存一个网络数据包的内存地址。任一网络数据包的内存地址用于指示任一网络数据包在第一客户端的存储空间中的存储位置,此处所提及的存储空间可以是指第一客户端的主服务进程所采用的用于存储内存地址的空间。进一步的,目标缓冲队列还可配置有以下至少一个变量:第一变量(PushIndex)、第二变量(PushIndex)以及第三变量(MaxPop Index),如图3a所示;这三个变量均是互斥变量,其变量值可由CAS原子性操作改变。
其中,第一变量的变量值可用于指示:目标缓冲队列中,用于缓存下一个需入队(Enque)的内存地址的缓冲区的区域标识;该第一变量的变量值初始可默认为0,且该第一变量的变量值在每次执行入队操作前被执行递增处理。第二变量的变量值可用于指示:目标缓冲队列中,缓存有下一个需出队(Deque)的内存地址的缓冲区的区域标识;该第二变量的变量值初始可默认为0,且该第二变量的变量值在每次执行出队操作后被执行递增处理。第三变量的变量值可用于指示:目标缓冲队列中,用于缓存最近入队的内存地址的缓冲区的区域标识;该第三变量的变量值初始可默认为0,且该第三变量的变量值在每次执行入队操作后被执行递增处理。需要说明的是,若第一变量的变量值和第三变量的变量值不一致,则表明有内存地址写入目标缓冲队列的操作没有完成,即表明存在生产者线程只申请了缓冲区但没有将内存地址写入缓冲区中。
例如,目标缓冲队列中依次入队了3个内存地址(内存地址A、内存地址B以及内存地址C),且各内存地址对应的区域标识为0、1、2;那么用于缓存下一个需入队的内存地址的缓冲区的区域标识可为3,即第一变量的变量值可用于指示区域标识“3”,而第三变量的变量值可用于指示第3个入队的内存地址C所对应的区域标识“2”;并且,由于第一变量的变量值和第三变量的变量值不一致,因此还可确定存在生产者线程申请了区域标识“3”所对应的缓冲区,但还未向该缓冲区写入内存地址。若目标缓冲队列依次出队了2个内存地址(内存地址A和内存地址B),则下一个需出队的内存地址便为内存地址C,那么第二变量的变量值可用于指示用于缓存内存地址C的缓冲区的区域标识“2”。
基于上述描述,若目标缓冲队列配置有第一变量,则在调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列的具体实施过程中,每次可调用多个生产者线程中的部分或全部生产者线程通过对第一变量执行第一原子操作来申请同一个缓冲区,只有成功执行第一原子操作的生产者线程才可成功申请到该缓冲区。然后,可调用成功执行第一原子操作的生产者线程将其负责的网络数据包的内存地址,写入其成功申请的缓冲区中。其中,第一原子操作可以是CAS操作;该第一原子操作可用于指示:当第一变量的预期值和第一变量的变量值相同时,对第一变量的变量值执行原子递增;其中,第一变量的预期值是指生产者线程所认为的第一变量的内存地址中所存储的值;第一变量的变量值是指第一变量的内存地址中存储的内存值,即第一变量的变量值是指第一变量的内存地址中所存储的实际的内存值。
下面以一个具体的例子对第一原子操作的原理作进一步说明:设在内存地址V中,存储的第一变量的变量值(即内存值)为10。若此时生产者线程1想要对第一变量执行第一原子操作,则生产者线程1可认为第一变量的预期值为A=10,通过原子递增所得到的新值(即新的变量值)B=11。假设在生产者线程1执行第一原子操作时,被生产者线程2抢先了一步,把内存地址V中的变量值率先更新成了11,那么当生产者线程1开始执行第一原子操作时,生产者线程1所获取到的第一变量的变量值为11,预期值仍为10。通过将A(预期值)和内存地址V的实际值(即变量值11)进行比较,便会发现A不等于内存地址V的实际值,此时生产者线程1无法执行对第一变量的变量值的原子递增处理,因此可认为生产者线程1执行第一原子操作失败。
需要说明的是:(1)本发明实施例所提及的“成功执行第一原子操作”的意思是指“成功对第一变量的变量值执行原子递增”。虽然可能存在至少两个生产者线程同时对第一变量执行第一原子操作的情况,但参见上述例子可知:由于只有在第一变量的预期值和变量值相同的情况下,才可对第一变量的变量值进行递增处理,因此必然只会存在一个生产者线程所获取到的预期值和变量值是相同的,从而使得必然只有一个生产者线程成功执行第一原子操作。
(2)任一生产者线程在成功申请到相应的缓冲区后,均可无需立即向其成功申请的缓冲区写入内存地址,只需满足各个生产者线程对目标缓存队列执行写操作的顺序和各个生产者成功申请到缓冲区的顺序一致即可。例如,设总共有4个生产者线程:成功申请到缓冲区1的生产者线程1、成功申请到缓冲区4的生产者线程2、成功申请到缓冲区2的生产者线程4、以及成功申请到缓冲区3的生产者线程3。由于在申请缓冲区时,是按照缓冲区1-4的顺序来申请的;因此可知,这4个生产者线程成功申请到缓冲区的顺序依次是:生产者线程1、生产者线程4、生产者线程3、生产者线程2。那么,这4个生产者线程只需遵循生产者线程1→生产者线程4→生产者线程3→生产者线程2的顺序来依次写入相应的内存地址即可,可无需在申请到相应缓冲区后就立马执行写操作。当然应理解的是,任一生产者线程在成功申请到缓冲区(假设缓冲区2)后,若该缓冲区2的前一个缓冲区(即缓冲区1)已被执行写操作,则该任一生产者线程也可立即对该缓冲区2执行写操作,以将相应的内存地址写入该缓冲区2中。
(3)任一网络数据包的内存地址只有在生产者线程从目标缓冲队列中成功申请到缓冲区,并由该生产者线程将其成功写入到该缓冲区后,才能被各个消费者线程读取到。因此,任一生产者线程在成功写入内存地址(假设内存地址B)后,还可对第三变量的变量值执行递增处理,以通过第三变量的变量值的更新变化来提示各个消费者线程目标缓冲队列中存在新被写入的内存地址(即内存地址B),从而使得各个消费者线程可及时地读取该新被写入的内存地址(即内存地址B),并基于读取到的内存地址执行后续的响应处理。
S202,异步调用多个消费者线程从目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从存储空间中获取对应的目标网络数据包。
由前述可知,目标缓冲队列可配置有第二变量;且第二变量的变量值用于指示:目标缓冲队列中,缓存有下一个需出队的内存地址的缓冲区的区域标识。那么在异步调用多个消费者线程从目标缓冲队列中读取一个或多个已缓存的内存地址的具体实施过程中,每次根据第二变量的变量值确定下一个需出队的内存地址所处的缓冲区,并调用多个消费者线程中的处于空闲状态的任一消费者线程来从确定的缓冲区中读取相应的内存地址。可选的,在成功读取内存地址后,还可调用所有或者部分消费者线程对第二变量执行第二操作,以使得第二变量的变量值进行递增,从而实现在目标缓冲队列中腾出刚出队的内存地址所对应的缓冲区,将这个缓冲区标记为可用状态(若一个缓冲区没有被申请且没有被写入内存地址,则该缓冲区处于可用状态))。其中,第二原子操作可以是CAS操作;该第二原子操作可用于指示:当第二变量的预期值和第二变量的变量值相同时,对第二变量的变量值执行原子递增;其中,第二变量的预期值是指消费者线程所认为的第二变量的内存地址中存储的内存值;第二变量的变量值是指第二变量的内存地址中存储的内存值,即第二变量的变量值是指第二变量的内存地址中所存储的实际的内存值。
下面以一个具体的例子对第二原子操作的原理作进二步说明:设在内存地址V中,存储的第二变量的变量值(即内存值)为5。若此时消费者线程1想要对第二变量执行第二原子操作,则消费者线程1可认为第二变量的预期值为A=5,通过原子递增所得到的新值(即新的变量值)B=6。假设在消费者线程1执行第二原子操作时,被消费者线程2抢先了一步,把内存地址V中的变量值率先更新成了6,那么当消费者线程1开始执行第二原子操作时,消费者线程1所获取到的第二变量的变量值为6,预期值仍为5。通过将A(预期值)和内存地址V的实际值(即变量值6)进行比较,便会发现A不等于内存地址V的实际值,此时消费者线程1无法执行对第二变量的变量值的原子递增处理,因此可认为消费者线程1执行第二原子操作失败。
需要说明的是:(1)本发明实施例所提及的成功执行第二原子操作的意思是,成功对第二变量的变量值执行原子递增。虽然可能存在至少两个消费者线程同时对第二变量执行第二原子操作的情况,但参见上述例子可知:由于只有在第二变量的预期值和变量值相同的情况下,才可对第二变量的变量值进行递增处理,因此必然只会存在一个消费者线程所获取到的预期值和变量值是相同的,从而使得必然只有一个消费者线程成功执行第二原子操作。
(2)本发明实施例所提及的“异步调用多个消费者线程”的意思是:在调用多个生产者线程向目标缓冲队列写入内存地址的过程中,只要目标缓冲队列中存在已缓存的内存地址,便可并发地执行消费者线程的调用操作;无需等待生产者线程将全部或部分内存地址存储至目标缓冲队列,使得目标缓冲队列无空闲的缓冲区后,再执行消费者线程的调用操作;通过异步调用消费者线程的方式,可及时地读取出内存地址以及时地执行网络数据包的响应处理,从而提升响应及时性。
S203,调用多个消费者线程对获取到的各个目标网络数据包进行响应处理。
在一种实施方式中,第一客户端可以是在通过步骤S202调用多个消费者获取到多个目标网络数据包后,再执行步骤S203的;此实施方式下,第一客户端在执行步骤S203时,可并行地调用各个消费者线程分别对各自所获取到的目标网络数据包进行响应处理。也就是说,此实施方式下:任一消费者线程在获取到一个目标网络数据包后,可等待其他消费线程均读取到各自对应的目标网络数据包后,再被调用执行对获取到的网络数据包进行响应处理的操作。
再一种实施方式中,第一客户端也可以是在通过步骤S202调用任一消费者线程获取到一个内存地址,并直接调用该任一消费者线程根据读取到的内存地址从存储空间中获取对应的目标网络数据包后,就执行步骤S203的;此实施方式下,第一客户端在执行步骤S203时,可直接调用该任一消费者线程对其获取到的目标网络数据包进行响应处理,且第一客户端还可并发地继续执行步骤S202以读取其他已缓存的内存地址。也就是说,此实施方式下:任一消费者线程每成功读取到一个内存地址后,该任一消费者线程则可被调用执行获取目标网络数据包的的操作,以及对获取到的网络数据包进行响应处理的操作;即任一消费者线程在读取到一个内存地址后,无需等待其他消费者线程均获取到内存地址后,再执行获取目标网络数据包的的操作以及对获取到的网络数据包进行响应处理的操作,这样可有效提升数据包响应的及时性。
需要说明的是,上述所提及的响应处理的具体实施方式是根据目标网络数据包的数据内容确定的。例如,若目标网络数据包的数据内容是一个票据获取请求,则响应处理可包括:为第二客户端向服务器申请票据的处理,或者为第二客户端生成票据的处理;又如,若目标网络数据包的数据内容是一个关于目标对象的身份验证请求,则响应处理可包括:对目标对象进行身份验证的处理;再如,若目标网络数据包的数据内容是一个关于目标图像的人脸识别请求,则响应处理可包括:对目标图像进行人脸识别的处理;再如,若目标网络数据包的数据内容是一个名单获取请求,则响应处理可包括:查询并获取目标名单的操作,等等。应理解的是,本发明实施例只是示例性地列举了几种响应处理的具体实施方式,并非穷举;并且,任一消费者线程在对目标网络数据包执行响应处理以得到处理结果后,还可将该处理结果返回给第二客户端。另外,任一消费者线程在成功读取内存地址后,还可异步回收该内存地址,以节省缓冲空间,如图3b所示。
本发明实施例中的第一客户端获取到同一个设备中的第二客户端发送的多个网络数据包后,可调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列中。目标缓冲队列中的第i个缓冲区是在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存该任一生产者存入的内存地址的;可见,任一生产者线程在缓存其负责的内存地址时,只需通过原子操作在目标缓冲队列中预定一个缓冲区,并在成功预定后写入该内存地址即可,整个缓存过程无需对生产者线程执行加锁操作,从而可有效降低因加锁而给生产者线程造成的性能影响,进而提升整个响应过程的稳定性。在对目标缓冲队列执行写入操作时,还可异步地调用多个消费者线程从目标缓冲队列中读取已缓存的内存地址;通过异步读取内存地址的方式,可以有效减少内存地址的读取时延,从而实现对整个响应过程进行有效加速。当任一消费者线程读取到一个内存地址后,便可根据该内存地址从存储空间中获取对应的目标网络数据包,并对获取的目标网络数包进行响应处理;这样可实现多个消费者线程对网络数据包的并行响应,进一步减少响应时延,提升响应及时性。并且,通过缓存内存地址,可避免生产者线程执行写操作以及消费者线程执行读操作时,因对目标缓冲队列执行数据拷贝操作而引起的性能消耗问题,可有效提升处理效率,进而加速响应过程。
请参见图4,是本发明实施例提供的另一种数据处理方法的流程示意图。该数据处理方法可以由上述所提及的第一客户端执行,第一客户端与第二客户端进行通信,且第一客户端和第二客户端运行在同一个设备中。请参见图4,该数据处理方法可包括以下步骤S401-S407:
S401,在获取到第二客户端发送的多个网络数据包后,调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列。
在本发明实施例中,目标缓冲队列可以是采用K个缓冲区所构成的循环队列,一个缓冲区具有一个区域标识;且第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存任一生产者存入的内存地址,i∈[1,K]。并且,该目标缓冲队列还可配置有第一变量(Push Index)、第二变量(Pop Index)以及第三变量(MaxPop Index)等至少三个变量。可选的,目标缓冲队列还配置有元素变量,该元素变量的变量值用于指示:目标缓冲队列中处于占用状态的缓冲区的数量;且元素变量的变量值在每次执行入队操作后被执行递增处理,并在每次执行出队操作后被执行递减处理。通过维护该元素变量,可在需要查询目标缓冲队列中的内存地址的总数量时,只需简单地读取该元素变量的变量值即可。
需说明的是,本发明实施例所提及的K的取值可以是任一正整数;优选的,K的取值可以是2的N次方(记作2^N)。其中,K的取值为2^N的理由如下:由于存储循环队列的最大容量的类型是uint32_t,而变量Push Index、Pop Index以及MaxPop Index的变量值是随着出队,入队这些操作实现原子性递增的,当这几个变量的变量值到达FFFFFFFF(即unit32_t对应的最大取值)后,这些变量的变量值会回滚到0,并从0开始递增;此情况下,需要求这几个变量所指向的位置(即缓冲区)不能发生变动,因为如果位置有变动,则可能会导致部分数据无法出队,从而引起数据丢失。如果循环数组的最大容量是2的N次方,则变量的任意一个变量值对最大容量取模运算或者对(最大容量-1)取与运算,均不会导致变量在目标缓冲对队列中指向的相对位置出现变动。反之如果目标缓冲队列的最大容量不是2的N次方,举例容量设置成100,若当前的位置是FFFFFFFF(4,294,967,295),则该变量在目标缓冲队列中实际指向的位置为4,294,967,295%100=95(即第95个缓冲区),当该变量递增时,这个变量回滚到0,指向的位置为0%100=0,于是目标缓冲队列中最后的第96、97、98和99这缓冲区没有利用到,容易引起数据丢失。
基于上述描述,调用多个生产者线程将一个网络数据包的内存地址缓存至目标缓冲队列的方式可以包括以下步骤s11-s14:
s11,从多个生产者线程中确定M个候选生产者线程,M为正整数。
其中,候选生产者线程是指:未成功申请到缓冲区的生产者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成写操作的生产者线程。在一种可选的实施方式中,第一客户端在执行步骤s11之前,可先检测目标缓冲队列是否处于队满状态。若目标缓冲队列处于队满状态,则可表明此时的目标缓冲队列中的各个缓冲区均缓存有内存地址,即此时的目标缓冲队列中不存在空闲的缓冲区来缓存新的内存地址,因此可直接确定入队失败。若目标缓冲队列未处于队满状态,则可表明此时的目标缓冲队列中存在至少一个空闲的缓冲区,因此可继续执行步骤s11。也就是说,步骤s11(即从多个生产者线程中确定M个候选生产者线程的步骤),是在检测到目标缓冲队列未处于队满状态后执行的。
其中,检测目标缓冲队列是否处于队满状态的一种方式可以为:获取第一变量的变量值,并确定第一变量的变量值在目标缓冲队列中所指示的第一参考缓冲区。另外,还可获取第二变量的第一当前变量值,并确定第一当前变量值在目标缓冲队列中所指示的第二参考缓冲区。若第一参考缓冲区的下一个缓冲区与第二参考缓冲区不同,则可确定目标缓冲队列未处于队满状态;若第一参考缓冲区的下一个缓冲区与第二参考缓冲区相同,则可确定目标缓冲队列处于队满状态,如图5a所示。可选的,检测目标缓冲队列是否处于队满状态的另一种方式可以为:获取第一变量的变量值,以及获取第二变量的第一当前变量值;然后,直接比较第一变量的变量值和第二变量的第一当前变量值是否相同。若第一变量的变量值和第二变量的第一当前变量值相同,则可确定目标缓冲队列处于队满状态;否则,则可确定目标缓冲队列未处于队满状态。需要说明的是,本发明实施例所提及的第二变量的第一当前变量值是指:在执行步骤s11之前,最近一次通过第二原子操作所得到的变量值。
s12,调用M个候选生产者线程对第一变量执行第一原子操作,并从M个候选生产者线程中确定目标生产者线程。
其中,目标生产者线程是指成功执行第一原子操作的候选生产者线程。各个候选生产者线程所执行的第一原子操作可以是CAS操作,且任一候选生产者线程在对第一变量执行第一原子操作时,均可调用关于CAS操作的函数对第一变量执行第一原子操作,此处所提及的关于CAS操作的函数可根据具体的操作系统确定。例如,当操作系统为Windows系统时,关于CAS操作的函数可以是SwitchToThread函数;当操作系统为Linux系统时,关于CAS操作的函数可以是sched_yield函数;具体的,SwitchToThread函数和sched_yield函数的函数原型可参见下述描述:
①关于CAS操作在Windows系统中的SwitchToThread函数的函数原型如下:
#define CAS(ptr,oldVal,newVal)(InterlockedCompareExchange(ptr,newVal,oldVal)==oldVal)
可见,Windows操作系统中的CAS操作是通过InterlockedCompareExchange这个API实现的;其中,InterlockedCompareExchange的第三个参数oldVal与第一个参数(指针ptr)指向的值相同,则用第二个参数所代表的值newVal取代第一个参数(指针ptr)指向的值。函数返回值为指针ptr的初始值,因此当返回值等于第三个参数oldVal时,则可表示CAS操作成功执行完毕。
②关于CAS操作在Linux系统中的sched_yield函数的函数原型如下:
#define CAS(ptr,oldVal,newVal)__sync_bool_compare_and_swap(ptr,oldVal,newVal)
其中,当指针ptr存储的内容值(*ptr)与oldVal相等时,则可将newVal的值刷新指针ptr存储的内容,当指针存储的内容值由oldVal被替换成了newVal时,则函数返回true,否则函数返回false。
之所以调用SwitchToThread或者(Linux平台使用sched_yield()),是因为生产者线程通过第1个CAS操作(即第一原子操作)成功申请缓冲区后,需将内存地址写入到刚成功申请的缓冲区中,然后执行第2个CAS操作通知其他消费者线程,内存地址已经写入完毕,可以出队供使用了。该CAS操作必须严格遵循先到先处理的顺序,即首先执行完第一个CAS操作的生产者线程需要首个执行完第2个CAS操作;如果某个生产者线程Thr1在执行完第一个CAS操作之后被挂起,然后另外一个生产者线程Thr2执行完第1个CAS操作,那么生产者线程Th2将无法完成第2个CAS操作,因为它要等待生产者线程Thr1先完成第2个CAS操作。基于此情况,在处理器数量少于线程数量的系统上,为了保证这个先到先处理顺序的顺利执行,则需要通过SwitchToThread()(Linux系统使用sched_yield()),使得其他生产者线程让出处理器,并通知操作系统尽快将处理器让给先执行完第1个CAS的生产者线程,让该生产者线程尽快的执行完它的第2个CAS操作。避免让其他生产者线程处于忙等状态。
s13,根据目标生产者线程执行第一原子操作时,所采用的第一变量的变量值,计算第一目标区域标识。
在具体实施过程中,步骤s13的具体实施方式可以是:采用目标生产者线程执行第一原子操作时,所采用的第一变量的变量值(采用x表示),对目标缓冲队列的容量值进行取模运算,得到第一目标区域标识。其中,目标缓冲队列的容量值可用于指示:目标缓冲队列中的缓冲区的总数量,即目标缓冲队列的容量值等于K的取值。以K的取值为2^N为例,那么在此实施方式下,第一目标区域标识(采用Index(x)表示)的计算方式可参见下述式1.1所示:
Index(x)=x%(2^N)式1.1
或者,步骤s13的具体实施方式可以是:采用目标生产者线程执行第一原子操作时,所采用的第一变量的变量值(采用x表示),对目标缓冲队列的运算值进行位运算,得到第一目标区域标识。其中,目标缓冲队列的运算值是根据目标缓冲队列的容量值(即K的取值)确定的;具体的,该目标缓冲队列的运算值可等于目标缓冲队列的容量值进行减一处理后的值。仍以K的取值为2^N为例,那么在此实施方式下,第一目标区域标识(采用Index(x)表示)的计算方式可参见下述式1.2所示:
Index(x)=x&(2^N-1) 式1.2
需要说明的是,在实际应用中,可任意采用式1.1或者式1.2所示的方式来确定第一目标区域标识。可选的,由于相比于式1.1所示的取模运算而言,式1.2所示的位运算的执行效果更好;因此在高并发的场景中,也可优先使用式1.2所示的具体实施方式来计算得到第一目标区域标识。为便于阐述,后续均以式1.2为例进行阐述。
s14,将目标缓冲队列中第一目标区域标识对应的第一目标缓冲区,分配给目标生产者线程;并调用目标生产者线程将对应的网络数据包的内存地址,缓存至第一目标缓冲区。
可选的,在调用目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区之后,第一客户端还可调用目标生产者线程对第三变量执行第三原子操作。其中,通过第三原子操作所得到的变量值用于通知多个消费者线程:第一目标缓冲区中缓存的内存地址处于可读取状态。该第三原子操作可以是CAS操作,该第三原子操作可用于指示:当第三变量的变量值和第一变量最近被执行第一原子操作之前的变量值相同时,对第三变量的变量值执行原子递增;其中,第三变量的变量值是指所述第三变量的内存地址中存储的内存值,即第三变量的变量值是指第三变量的内存地址中所存储的实际的内存值。
可选的,若目标缓冲队列还配置有元素变量,则在调用目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区之后,第一客户端还可调用目标生产者线程通过原子加(Fetch and Add,FAA)操作对元素变量的变量值进行递增处理。需说明的是,此处所提及的FAA操作在不同的操作系统中可具有不同的函数原型;例如,FAA操作在Linux系统中的函数原型如下:#define AtomicAdd(ptr,cnt)__sync_fetch_and_add(ptr,cnt);该函数原型的原理是:执行原子性操作,使得指针ptr指向的值可原子性地增加cnt,cnt的数值可根据经验值设置,例如设置为1。又如,FAA操作在Windows系统中的函数原型如下:#define AtomicAdd(ptr,cnt)InterlockedExchangeAdd(ptr,cnt);该函数原型的原理是:通过InterlockedExchangeAdd执行原子性操作,使得指针ptr指向的值原子性增加cnt。
基于上述步骤s11-s14的相关描述,下面以图5b所示的流程图,对向目标缓冲队列写入内存地址的具体入队过程作进一步阐述:
首先,可用两个临时变量PushIndex’和PopIndex’分别存储Push Index和PopIndex的变量值;具体的,可采用如下代码语句实现:Set PushIndex’=Push Index,SetPopIndex’=Pop Index。
然后,可判断目标缓冲队列是否队满,即判断目标缓冲队列是否处于队满状态。如果队列满(即目标缓冲队列处于队满状态),则入队失败;如果队列未满,则不断调用多个生产者线程通过循环执行第一原子操作(即第一个CAS操作),使得Push Index的变量值递增,这一步是为了使多个生产者线程在目标缓冲队列中申请空间(即缓冲区)。需要说明的是,每次只有一个生产者线程能够成功执行第一原子操作(CAS操作),使得Push Index的变量值递增;条件是:CAS(&Push Index,PushIndex’,(PushIndex’+1)返回值是TRUE(真)。
在任一生产者线程成功申请缓冲区后(上一步CAS操作(即第一原子操作)执行成功,即表明成功在目标缓冲队列中成功申请到了缓冲区),下一步就是将新的内存地址拷贝到刚成功申请到的缓冲区中。具体的,可设目标缓冲队列是theQue,ComputeIndex(变量)是根据第一变量的变量值计算成功申请到的缓冲区在目标缓冲队列中的区域标识的函数,curData是新的元素(即需要插入目标缓冲队列的内存地址),QUE_MAX_SIZE是目标缓冲队列的容量值,取值等于K(如2的N次方);那么,成功申请到缓冲区的任一生产者线程,可采用下述代码语句来计算其所成功申请到的缓冲区的区域标识:
在计算出区域标识后,便可将新的元素拷贝到该区域标识所指示的缓冲区中;在将新的元素拷贝到成功申请到的缓冲区这个操作完成之后,接下来是通过不断执行第三原子操作(即第二个CAS操作),使得MaxPop Index这个互斥变量的变量值进行递增。具体的,可采用下述代码语句来实现第三原子操作,从而实现MaxPop Index的变量值的递增:
在此代码语句中,MaxPop Index这个指针的值为第三变量的当前变量值,PushIndex’这个指针的值为第一变量在最近一次被执行第一原子操作之前的变量值;此代码语句的含义是指:先比较MaxPop Index这个指针的值和PushIndex’这个指针的值是否相同,若相同,则表明还未对第三变量(MaxPop Index)执行递增处理,那么此时可采用PushIndex’+1(即第一变量最近一次被执行第一原子操作后的变量值)来刷新第三变量的变量值,从而实现第三变量的递增处理,并返回处理结果为true。若不同,则表明已对第三变量执行了递增处理,此时可返回处理结果为false。
执行完第三原子操作后,还可通过FAA原子性操作将维护队列中当前元素总数的元素变量的变量值进行递增;至此,入队操作完成。
S402,异步调用多个消费者线程从目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从存储空间中获取对应的目标网络数据包。
在具体实施过程中,调用多个消费者线程从目标缓冲队列中读取一个已缓存的内存地址的方式可以包括以下步骤s21-s22:
s21,根据第二变量的第二当前变量值,计算第二目标区域标识。
在一种实施方式中,可直接根据第二变量的第二当前变量值,计算第二目标区域标识,其具体实施方式可参见上述步骤s13的具体实施方式,在此不再赘述。再一种实施方式中,第一客户端在执行步骤s21之前,可先检测目标缓冲队列是否处于队空状态。若目标缓冲队列处于队空状态,则可表明此时的目标缓冲队列中的各个缓冲区均未缓存内存地址,因此可直接确定出队失败。若目标缓冲队列未处于队空状态,则可表明此时的目标缓冲队列中存在至少一个缓冲区缓存有内存地址,因此可继续执行步骤s21。也就是说,步骤s21(即根据第二变量的第二当前变量值,计算第二目标区域标识的步骤),是在检测到目标缓冲队列未处于队空状态后执行的。
其中,检测目标缓冲队列是否处于队空状态的方式可以为:获取第二变量的第二当前变量值,以及第三变量的变量值;然后,直接比较第二变量的第二当前变量值和第三变量的变量值是否相同。若第二当前变量值和第三变量的变量值相同,则可表明用于缓存下一个需出队的内存地址的缓冲区和用于缓存最近一次入队的内存地址的缓冲度是同一个缓冲区(如图5c所示),因此可确定目标缓冲队列处于队空状态;否则,则可确定目标缓冲队列未处于队空状态。
需要说明的是,本发明实施例所提及的第二变量的第二当前变量值是指:在执行步骤s21之前,最近一次通过第二原子操作所得到的变量值。
s22,调用多个消费者线程中的目标消费者线程,从第二目标区域标识对应的第二目标缓冲区中,读取第二目标缓冲区所缓存的内存地址;其中,目标消费者线程可以是多个消费者线程中处于空闲状态的任一消费者线程。
可选的,在成功读取到第二目标缓冲区所缓存的内存地址之后,第一客户端还可通过多个消费者线程中的某个消费者线程将第二目标缓冲区标记为可用状态,以提示各个生产者线程可再次向第二目标缓冲区中写入内存地址。在一种实施方式中,可直接调用目标消费者线程对第二变量执行原子自增操作(即在当前的变量值上执行加一的操作),并在执行原子自增操作后,将第二目标缓冲区的状态设置为可用状态。
再一种实施方式中,第一客户端可从多个消费者线程中确定N个候选消费者线程,N为正整数;所谓的候选消费者线程是指:未成功申请到缓冲区的消费者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成读操作的消费者线程。其次,可调用N个候选消费者线程对第二变量执行第二原子操作;然后,调用成功执行第二原子操作的候选消费者线程,将第二目标缓冲区的状态设置为可用状态。其中,各个候选消费者所执行的第二原子操作可以是CAS操作,且任一候选消费者线程在对第二变量执行第二原子操作时,均可调用关于CAS操作的函数对第二变量执行第二原子操作,此处所提及的关于CAS操作的函数可参见上述步骤s12的相关描述,在此不再赘述。
可选的,若目标缓冲队列还配置有元素变量,则在执行步骤s22之后,第一客户端还可调用目标消费者线程通过原子减(Fetch and Sub)操作对元素变量的变量值进行递减处理。需说明的是,此处所提及的Fetch and Sub操作在不同的操作系统中可具有不同的函数原型;例如,Fetch and Sub操作在Linux系统中的函数原型如下:#define AtomicAdd(ptr,cnt)__sync_fetch_and_sub(ptr,cnt);该函数原型的原理是:执行原子性操作,使得指针ptr指向的值可原子性地减少cnt,cnt的数值可根据经验值设置,例如设置为1。又如,Fetch and Sub操作在Windows系统中的函数原型如下:#define AtomicSub(ptr,cnt)InterlockedExchangeAdd(ptr,cnt);该函数原型的原理是:通过InterlockedExchangeAdd执行原子性操作,使得指针ptr指向的值原子性减少cnt。
基于上述步骤s21-s22的相关描述,下面以图5d所示的流程图,对从目标缓冲队列读取内存地址的具体出队过程作进一步阐述:
首先,可用两个临时变量MaxPopIndex’和PopIndex’分别存储MaxPop Index和PopIndex的变量值;具体的,可采用如下代码语句实现:Set MaxPopIndex’=MaxPop Index,Set PopIndex’=Pop Index;
然后,可判断目标缓冲队列是否为空,即判断目标缓冲队列是否处于队空状态。如果队列空(即目标缓冲队列处于队空状态),则出队失败;如果队列非空,则可调用处于空闲状态的任一消费者线程取出Pop Index的变量值所指向的缓冲区中的内存地址作为出队的内存地址。下一步可不断调用一个或多个消费者线程通过循环执行第二原子操作(如CAS操作),使得Pop Index的变量值递增,这一步是为了在目标缓冲队列中腾出刚出队的内存地址对应的缓冲区,以将这个缓冲区标记为可用状态。需要说明的是,只有一个消费者线程能够成功执行第二原子操作(CAS操作)使得Pop Index的变量值递增;条件是:CAS(&PopIndex,PopIndex’,(PopIndex’+1)))返回值是TRUE(真)。
若上一步CAS操作(即第二原子操作)执行成功,则可表明已成功在目标缓冲队列中成功清除了用于缓存刚出队的内存地址的缓冲区;执行完成后,还可通过Fetch And Sub原子性操作(即原子减操作)将维护元素总数量的元素变量的变量值进行原子性地减一;至此,出队完成。
S403,调用多个消费者线程对获取到的各个目标网络数据包进行响应处理。
需要说明的是,步骤S403的具体实施方式可参见上述发明实施例中的步骤S203的相关描述,在此不再赘述。
在实际应用中,可能会存在因生产者线程缓存内存地址过快而消费者线程读取内存地址较慢,导致构成目标缓冲队列频繁被占满,从而导致生产者线程后续的内存地址存入目标缓冲队列失败的问题;基于此,本发明实施例还可提供以下两种策略解决该问题:
策略1:可统计第二客户端在历史时间段内每次产生的历史网络数据包的数量,从而统计第二客户端在历史时间段内一次产生历史数据包的数量的极值(即最大值);在使用该目标缓冲队列之前,可调整目标缓冲队列的容量值,使得调整后的容量值大于或等于统计得到的极值。在此情况下,前述所提及的目标缓冲队列的容量值K实质上是指调整后的容量值;可选的,调整后的容量值可满足2的N次方的约束。
策略2:在使用目标缓冲队列的过程中,定期或实时检测是否存在针对目标缓冲队列的队列扩容触发事件;若存在,则自动生成一个容量值大于目标缓冲队列的容量值的新的缓冲队列,并通过自动切换机制将目标缓冲队列中未读取的内存地址切换到新的缓冲队列中,以实现动态扩容,如图5e所示;可见,通过策略2可实现缓冲队列的自动扩容切换,有效提升缓冲队列的可用性。需要说明的是,在策略2中,目标缓冲队列的容量值K可以是通过策略1所统计得到的极值,也可以是根据第二客户端在历史时间段内每次产生的历史网络数据包的数量所计算得到的均值,还可以是根据经验值或者业务需求所自定义的数值,对此不作限制。当目标缓冲队列的容量值K设置为均值时,可使得构成目标缓冲队列的容量值不必设置得过大,可有效降低占用空间,支持处理高并发的通信场景。
下面将结合步骤S404-S407对策略2的实施过程作详细阐述:
S404,若检测到队列扩容触发事件,则根据目标缓冲队列的容量值构建新的缓冲队列。
由前述可知,目标缓冲队列还配置有元变量,该元素变量的变量值用于指示:目标缓冲队列中处于占用状态的缓冲区的数量;且元素变量的变量值在每次执行入队操作后被执行递增处理,并在每次执行出队操作后被执行递减处理。因此在具体实施过程中,第一客户端检测队列扩容触发事件的具体实施方式可以包括以下任一种:
①获取元素变量的当前变量值,直接将当前变量值和指定阈值进行比较;若元素变量的当前变量值大于指定阈值,则表明此时目标缓冲队列所缓存的内存地址的数量较多,因此可确定检测到了队列扩容触发事件。或者,进一步的,考虑到元素变量的当前变量值大于指定阈值这一情况可能是一次偶然的突发情况,那么为了提示队列扩容触发事件的检测准确性,可在检测到元素变量的当前变量值大于指定阈值时,对扩容计数值进行加一处理;该扩容计数值可用于指示已检测到当前变量值大于预设阈值的次数,即可用于指示已检测到目标缓冲队列所缓存的内存地址的数量较多的次数。若加一处理后的扩容计数值大于预设值,则可确定已多次检测到目标缓冲队列所缓存的内存地址的数量较多,因此可确定检测到队列扩容触发事件;若加一处理后的扩容计数值小于或等于预设值,则可继续定期或实时检测当前变量值是否大于指定阈值。
②获取元素变量的当前变量值,并根据元素变量的当前变量值计算目标缓冲队列的当前占用率;具体的,可计算当前变量值和目标缓冲队列的容量值之间的比值,得到当前占用率。然后,可将当前占用率和占用率阈值进行比较;若当前占用率大于占用率阈值,则可表明此时目标缓冲队列所缓存的内存地址的数量较多,因此可确定检测到队列扩容触发事件。或者,进一步的,考虑到当前占用率大于占用率阈值这一情况可能是一次偶然的突发情况,那么为了提示队列扩容触发事件的检测准确性,可在检测到当前占用率大于占用率阈值时,对扩容指示值进行加一处理,该扩容指示值可用于指示已检测到当前占用率大于占用率阈值的次数。若加一处理后的扩容指示值大于预设值,则可确定已多次检测到目标缓冲队列的占用率大于占用率阈值,因此可确定检测到队列扩容触发事件;若加一处理后的扩容指示值小于或等于预设值,则可继续定期或实时检测当前占用率是否大于占用率阈值。
需要说明的是,上述所提及的占用率阈值和预设值均可根据经验值设置。例如,设置占用率阈值为80%,预设值为3,那么第一客户端可在检测到目标缓冲队列所存储的内存地址的数量达到总容量的80%的次数超过3次后,确定检测到队列扩容触发事件。
在检测到队列扩容触发事件后,第一客户端便可通过步骤S404根据目标缓冲队列的容量值构建新的缓冲队列;其中,该新的缓冲队列是指一个未缓存任何内存地址的空缓冲队列,且该新的缓冲队列的容量值大于目标缓冲队列的容量值。在一种实施方式中,该新的缓冲队列的容量值可以等于目标缓冲队列的容量值的R倍,R为大于1的正整数。再一种实施方式中,该新的缓冲队列的容量值可以等于目标缓冲队列的容量值和参考容量值的总和;该参考容量值可根据经验值或者业务需求设置,或者根据在检测到队列扩容触发事件时,剩余未缓存的内存地址的数量设置,等等。需要说明的是,本发明实施例只是示例性地列举了几种新的缓冲队列的容量值和目标缓冲队列的容量值之间的关系,并非穷举。
S405,阻止多个消费者线程继续从目标缓冲队列中读取内存地址,并向多个生产者线程发送通知消息。
在构建新的缓冲队列之后,第一客户端可向各个消费者线程发送阻止指令,以阻止多个消费者线程继续从目标缓冲队列中读取内存地址;此处所提及的阻止多个消费者线程继续读取内存地址的意思是指:只允许各个消费者线程继续读取正在读取过程中的内存地址,当成功读取出该内存地址后,便不再对目标缓冲队列执行读操作。
另外,还可向多个生产者线程发送通知消息,以通知各个生产者线程停止向目标缓冲队列缓存内存地址。在一种实施方式中,若通知消息只用于通知停止向目标缓冲队列缓存内存地址;则在此实施方式下,各个生产者线程在接收到该通知消息后,便可停止执行写操作,并在下一次接收到允许写入新的缓冲队列的通知,将未缓存的剩余内存地址缓存至新的缓冲队列。再一种实施方式中,若通知消息除了用于通知停止向目标缓冲队列缓存内存地址之外,还可用于通知多个生产者线程:将待缓存的一个或多个内存地址,缓存至临时缓冲队列中;则在此实施方式下,各个生产者线程在接收到该通知消息后,可将待缓存的一个或多个内存地址缓存至临时缓冲队列中,不再向目标缓冲队列写入内存地址。其中,临时缓冲队列的容量值可根据经验值设置,且本发明实施例对临时缓冲队列的具体结构不作限制。
通过步骤S405停止各个线程(即生产者线程和消费者线程)对目标缓冲队列的动态操作后,可便于通过步骤S406将目标缓冲队列中未被读取的内存地址转移至新的缓冲队列中,进而便于后续可调用消费者线程从该新的缓冲队列中读取内存地址。
S406,确定目标缓冲队列中未被读取的内存地址,并将确定出的内存地址拷贝至新的缓冲队列中。
在具体实施过程中,第一客户端可遍历目标缓冲队列中的各个缓冲区,以确定出目标缓冲队列中未被读取的内存地址。或者,第一客户端可根据目标缓冲队列的第二变量的变量值和第一变量的变量值,定位出目标缓冲队列中未被读取的内存地址。具体的,由于第一变量的变量值用于指示:目标缓冲队列中,用于缓存下一个需入队的内存地址的缓冲区的区域标识;因此可知目标缓冲队列中位于第一变量的变量值所指示的缓冲区之前的缓冲区均被写入过内存地址,那么可将第一变量的变量值在目标缓冲队列中所指示的缓冲区的前一个缓冲区确定为末尾缓冲区。又由于第二变量的变量值用于指示:目标缓冲队列中,缓存有下一个需出队的内存地址的缓冲区的区域标识;因此可知目标缓冲队列中位于第二变量的变量值所指示的缓冲区之前的缓冲区均被执行了出队操作,且位于第二变量的变量值所指示的缓冲区之后的缓冲区以及第二变量的变量值所指示的缓冲区均未执行出队操作,那么可将第二变量的变量值在目标缓冲队列中所指示的缓冲区确定为起始缓冲区。然后,可将起始缓冲区中的内存地址、末尾缓冲区中的内存地址以及位于起始缓冲区和末尾缓冲区之间的各个缓冲区中的内存地址均确定为目标缓冲队列中未被读取的内存地址。
在确定出未被读取的内存地址后,第一客户端可按照未被读取的内存地址被写入至目标缓冲队列的先后,调用任一线程依次将确定出的内存地址拷贝至新的缓冲队列中。可选的,在完成内存地址的拷贝操作后,还可重置新的缓冲队列的各个变量的变量值;具体的,可根据从目标缓冲队列中拷贝至新的缓冲队列中的内存地址的数量(采用P表示),重置新的缓冲队列的第一变量的变量值等于P+1;可直接重置新的缓冲队列的第二变量的变量值等于0,以及根据从目标缓冲队列中拷贝至新的缓冲队列中的内存地址的数量(采用Z表示),重置新的缓冲队列的第三变量的变量值等于P。
S407,通知多个生产者线程将未缓存的剩余内存地址缓存至新的缓冲队列中,并通知多个消费者线程从新的缓冲队列中读取内存地址。
在一种实施方式中,若步骤S405所提及的通知消息只用于通知停止向目标缓冲队列缓存内存地址,则未缓存的剩余内存地址是指:多个网络数据包的内存地址中,除已缓存至所述目标缓冲队列以外的内存地址。在此实施方式下,第一客户端可直接调用多个生产者线程将未缓存的剩余内存地址缓存至新的缓冲队列中;需要说明的是,向新的缓冲队列写入内存地址的具体方式与向目标缓冲队列写入内存地址的方式类似,其具体可参见前述步骤S401的相关描述,在此不再赘述。
再一种实施方式中,若步骤S405所提及的通知消息不仅可用于通知停止向目标缓冲队列缓存内存地址之外,还可用于通知多个生产者线程:将待缓存的一个或多个内存地址,缓存至临时缓冲队列中;则未缓存的剩余内存地址是指:多个网络数据包的内存地址中,除已缓存至目标缓冲队列和临时缓冲队列以外的内存地址。在此实施方式下,第一客户端可调用多个生产者线程中的部分或全部生产者线程将未缓存的剩余内存地址缓存至新的缓冲队列中;并且,还可为临时缓冲队列分配一个生产者线程,并调用被分配的生产者线程将临时缓冲队列中的各个内存地址缓存至新的缓冲队列中。
需要说明的是,若第一客户端是调用多个生产者线程中的全部生产者将未缓存的剩余内存地址缓存至新的缓冲队列中的,则为临时缓冲队列分配的生产者线程可以是一个新的生产者线程;若第一客户端是调用多个生产者线程中的部分生产者将未缓存的剩余内存地址缓存至新的缓冲队列中的,则为临时缓冲队列分配的生产者线程可以是多个生产者线程中的一个生产者线程。并且,无论是负责未缓存的剩余内存地址的生产者线程,还是为临时缓冲队列分配的生产者线程,各个生产者线程在对新的缓冲队列执行写操作前,都需通过第一原子操作来向新的缓冲队列申请缓冲区,并在成功申请到缓冲区后才可执行内存地址的写操作。
还需说明的是,各个消费者线程从新的缓冲队列中读取内存地址的具体实施方式与各个消费者线程从目标缓冲队列读取内存地址的具体实施方式类似,在此不再赘述。并且,任一消费者线程从新的缓冲队列中读取到内存地址后,便可根据该内存地址去第一客户端的存储空间中获取相应的目标网络数据包,并对获取到的目标网络数据包执行响应处理。
在本发明实施例中,通过入队和出队利用原子操作重试,分开串行化,以及通过使用三个互斥变量在目标缓冲队列中单步单向串行前进实现内存地址的进出,实现非阻塞的目标缓冲队列作为第一客户端和第二客户端之间通信的缓冲结构,是一种无锁同步机制。由于避免了使用锁去保护核心资源,因此可显著降低不同工作线程之间的争抢频率,以及显著降低任务强制的频率,可有效缓解cache颠簸,提高并行处理的能力。并且,还可较好地实现缓冲队列的自动扩容切换,有效提升缓冲队列的可用性,有效避免因目标缓冲队列被频繁占满而导致服务中断的情况,可较好地支持处理高并发的通信场景。
基于上述图2和图4所示的数据处理方法的实施例描述,在实际应用中可根据实际业务需求将该数据处理方法,运用到任意需同一个设备中的两个客户端进行本地通信的场景中,如基于零信任系统的通信场景。其中,零信任系统是指基于零信任技术所搭建的系统;所谓的零信任是一种安全概念,中心思想是设备不应自动信任内部或外部的任何人/事/物,应在授权前对任何试图接入企业系统的人/事/物进行验证。
参见图6a所示,该零信任系统可至少包括:安全iOA客户端(后续简称iOA客户端)、代理客户端(或称为访问代理)、iOA服务器、智能网关,等等。其中,iOA客户端和代理客户端可运行在同一个用户设备中;且参见图6b所示,该iOA客户端可充当零信任网络安全服务提供方,通过代理客户端和智能网关为访问主体通过网络,请求访问客体的资源提供统一入口,并为该统一入口提供鉴权操作,只有通过鉴权的网络请求才能由代理客户端转发给智能网关,通过智能网关代理实际访问客体的访问。其中,访问主体是指在网络中,发起访问的一方,访问内网业务资源的人/设备/应用;相应的,访问客体则是指在网络中,被访问的一方,如业务站点(或称为业务系统,具体可包括业务服务器,限制访问设备等);访问客体的资源可以包括业务站点中的的企业内网业务资源,数据,开发测试环境,运维环境等等。
为便于理解,下面先分别对零信任系统中的各个部分的功能作具体介绍:
①iOA客户端:一种基于零信任策略的客户端,可以理解成是安装在用户设备中的安全Agent;主要负责验证用户设备上的用户可信身份,验证用户设备是否可信以及应用是否可信,并负责将未知的进程向服务器申请进程送检。
其中,零信任策略又可称为零信任访问控制策略;其可包括iOA客户端的登陆用户可使用的进程信息(应用信息),以及可访问的可达区域,所谓的可达区域是指用户可通过零信任网络访问的站点列表,该站点列表可包括至少一个站点的相关信息。在权限开通的情况下,用户可通过任何一个可信应用访问到任一个可达区域;零信任策略的粒度为登录用户,允许为不同的登录用户制定不同的零信任策略。具体的,该零信任策略可以是由业务站点的管理人员预先配置并下发给iOA客户端的;该零信任策略可用于确定用户终端中各应用对业务站点(或业务站点中的部分或全部功能)的访问权限。
如图6c所示,零信任策略可包括组织架构里的用户(或用户组),可信应用和业务站点这三方面的配置信息;其中,可信应用是指管理端(管理人员)授信的,用户设备可访问业务站点的应用载体;可信应用的配置信息可包括应用名(或称为进程名)、签名信息、版本、应用MD5(或称为进程MD5,MD5是一种消息摘要算法)和sha256(一种加密哈希算法),如图6d所示。业务站点的配置信息可包括:业务系统的系统名称、访问地址等;该访问地址可以是IP地址,该IP地址可通过图6e所示的界面图进行配置;或者,该访问地址可以是域名地址,域名地址可通过图6f所示的界面图进行配置。
由此可见,本发明实施例可基于人(身份)-应用-目标业务系统的组合策略控制零信任策略,实现流量过滤,支持泛域名、IP段、多端口,并且可基于用户组织架构可实现继承和扩展。在管理人员配置好业务系统和可信应用后,只需要选定需要下发的零信任策略(包括记录有可信应用的访问权限的访问权限信息),即可实现将零信任策略下发至iOA客户端。相应的,iOA客户端可接收该零信任策略;并在用户通过图6g所示的登录界面登录iOA客户端以使用零信任办公功能后,输出图6h所示的提示界面以提示用户已启动零信任策略。可选的,还可为用户输出图6i所示的应用信息界面,使得用户可看到管理用户下发的可信应用的详情信息。
②代理客户端:部署于用户终端中的发起安全访问的终端代理;主要负责访问主体可信身份验证的请求发起,验证身份可信,即可与访问网关建立加密的访问连接,同时也是访问控制的策略执行点。还可负责通过TUN/TAP(一种操作系统内核中的虚拟网络设备)虚拟网卡劫持设备流量,通过iOA客户端鉴权后负责将请求转发给智能网关,如果没有通过鉴权则中断连接。
③智能网关:部署在访问主体和数据资源的入口,负责对每一个用于访问数据资源的请求进行验证和请求转发。
④iOA服务器:可负责通过策略控制引擎对业务流量进行安全调度,按照人-设备-软件-应用颗粒度授权。另外,还可基于送检服务定期向威胁情报云查服务安知或tav定期发起文件送检,并在识别出恶意进程后通知iOA客户端执行异步阻断操作。需说明的是,iOA服务器还包括各种模块,如对用户身份进行验证的身份验证模块,验证设备硬件信息和设备安全状态的设备可信模块,检测应用进程是否安全,如是否有漏洞,是否有病毒木马等的应用检测模块,等等。
基于上述各个部分的具体描述,下面结合图6a对零信任系统的整体运行原理进行介绍:
当访问主体通过某个应用发起针对访问客体(业务站点)的网络请求时,代理客户端可劫持到网络请求,并向iOA客户端发起鉴权请求,以向iOA客户端申请当次网络请求的网络请求凭证(或称为票据);所谓的网络请求凭证是指iOA服务端为单个网络请求发放的授权信息,用于标识该网络请求的授权状态。其中,鉴权请求的请求参数可包括源IP或者域名,源端口,目的IP或者域名,目的端口,应用对应的进程PID(Process Identification,进程标识)。相应的,iOA客户端可通过代理客户端发送的进程PID采集进程的MD5,进程路径,进程最近修改时间,版权信息,签名信息等信息;将采集到的信息连同代理客户端传递过来的网络请求的源IP或者域名,源端口,目的IP或者域名,目的端口,向iOA服务端申请票据。如果申请成功,则将票据、票据最大使用次数以及票据有效时间作为响应发送给代理客户端。
相应的,代理客户端首先向访问网关发起Https(Hyper Text Transfer Protocolover SecureSocket Layer,超文本传输安全协议)请求,其中在Authorization首部字段中带上IOA客户端传递过来的票据;访问网关在收到代理客户端的Https请求后,解析出首部字段中的票据,并请求iOA服务端校验票据。如果校验成功,则访问网关跟代理客户端成功建立连接,之后代理客户端将原始网络请求发送给访问网关,由网关转发至到对应的业务站点,以代理实际的应用网络访问;如果校验票据失败,则代理客户端与访问网关的连接中断,针对零信任策略以外的应用访问特定站点的流量,则通过代理客户端直接向目标业务站点发起网络访问请求实现直连。
在上述零信任系统的运行过程中,代理客户端是通过TCP协议和iOA客户端建立TCP连接的,iOA客户端支持代理客户端同时发起多个TCP连接;每个连接以长链的方式进行通信,且同一个TCP连接允许发送多个网络请求(如鉴权请求),一个网络请求可视为一个网络数据包。应理解的是,代理客户端可与iOA建立单个长链接,或者多个长链接;为优化传输性能,代理客户端和iOA客户端应该尽可能地在同一个TCP连接上完成多次的请求和响应,不频繁创建和关闭连接。除非链接质量不好,才会重新发起链接来尝试恢复通讯。
在策略全量放开的情况下,即用户访问的站点为*(全部站点),应用为“任意应用”的情况下,如下所示:
可能存在代理客户端的请求频繁的情况,在此情况下,若iOA客户端若接收到代理客户端同时发送的多个网络数据包(即网络请求),则可采用该数据处理方法对多个网络数据包进行响应处理,以及时地向iOA服务器申请每个网络数据包对应的票据,并将申请得到的票据返回给代理客户端。也就是说,在将本发明实施例所提出的数据处理方法应用到基于该零信任系统的通信场景中时,零信任系统中的iOA客户端相当于第一客户端,而代理客户端相当于第二客户端。具体的,iOA客户端在采用该数据处理方法对多个网络数据包进行响应处理时,可引入非阻塞的目标缓冲队列作为缓冲结构,结合原子性操作实现多生产者多消费者的问题。
在具体实现中,iOA客户端在获取到代理客户端发送的多个网络数据包后,可调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列;其中,目标缓冲队列中的任一缓冲区是在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存任一生产者存入的内存地址。与此同时,还可异步调用多个消费者线程从目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从存储空间中获取对应的目标网络数据包。针对任一消费者线程在获取到目标网络数据包后,可调用该任一消费者线程对该目标网络数据包进行响应处理。具体的,可调用任一消费者线程解析该目标网络数据包,得到代理客户端发送的进程PID;然后,可根据进程PID采集进程的MD5,进程路径,进程最近修改时间,版权信息,签名信息等信息;将采集到的信息连同代理客户端传递过来的网络请求的源IP或者域名,源端口,目的IP或者域名,目的端口,向iOA服务器发送票据申请请求。最后,可接收iOA客户端返回的票据,并向代理客户端返回该票据。
由此可见,在将本发明实施例提出的数据处理方法应用到基于零信任系统的通信场景中时,可通过引入无锁的支持多生产者多消费者模型的目标缓冲队列,使得代理客户端发往iOA客户端的网络数据包均暂时存入该目标缓冲队列中作为缓冲,同时由对端(即iOA客户端)的消费者线程并行去消费,并异步乱序响应给代理客户端。这样可有效解决代理客户端与iOA客户端在通信时因为短时间内大量请求处理不及时引发的票据超时问题,从而可有效解决客户端之间网络通讯周期性异常断开,服务响应不及时等问题,且增强了零信任网络控制系统的稳定性和可用性。
基于上述数据处理方法的相关实施例的描述,本发明实施例还提出了一种数据处理装置,该数据处理装置可以是运行于第一客户端中的一个计算机程序(包括程序代码);所述第一客户端与第二客户端进行通信,且所述第一客户端和所述第二客户端运行在同一个设备中。该数据处理装置可以执行图2或图4所示的数据处理方法;请参见图7,所述数据处理装置可以运行如下单元:
缓存单元701,用于在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
读取单元702,用于异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
处理单元703,用于调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
在一种实施方式中,一个缓冲区具有一个区域标识;所述目标缓冲队列配置有第一变量,所述第一变量的变量值用于指示:所述目标缓冲队列中,用于缓存下一个需入队的内存地址的缓冲区的区域标识;
其中,所述第一原子操作是对所述第一变量执行的;所述第一原子操作用于指示:当所述第一变量的预期值和所述第一变量的变量值相同时,对所述第一变量的变量值执行原子递增,所述第一变量的变量值是指所述第一变量的内存地址中存储的内存值。
再一种实施方式中,缓存单元701在用于调用所述多个生产者线程将一个网络数据包的内存地址缓存至目标缓冲队列时,可具体用于:
从所述多个生产者线程中确定M个候选生产者线程,M为正整数;所述候选生产者线程是指:未成功申请到缓冲区的生产者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成写操作的生产者线程;
调用所述M个候选生产者线程对所述第一变量执行第一原子操作,并从所述M个候选生产者线程中确定目标生产者线程,所述目标生产者线程是指成功执行所述第一原子操作的候选生产者线程;
根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,计算第一目标区域标识;
将所述目标缓冲队列中所述第一目标区域标识对应的第一目标缓冲区,分配给所述目标生产者线程;并调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区。
再一种实施方式中,缓存单元701在用于根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的内存值,计算第一目标区域标识时,可具体用于:
采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的运算值进行位运算,得到第一目标区域标识;
或者,采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的容量值进行取模运算,得到第一目标区域标识;
其中,所述目标缓冲队列的运算值是根据所述目标缓冲队列的容量值确定的,所述目标缓冲队列的容量值可用于指示:所述目标缓冲队列中的缓冲区的总数量。
再一种实施方式中,所述从所述多个生产者线程中确定M个候选生产者线程的步骤,是在检测到所述目标缓冲队列未处于队满状态后执行的;
所述目标缓冲队列还配置有第二变量,所述第二变量的变量值在每次执行出队操作后被执行递增处理,且所述第二变量的变量值用于指示:所述目标缓冲队列中,缓存有下一个需出队的内存地址的缓冲区的区域标识;
其中,缓存单元701在用于检测所述目标缓冲队列是否处于队满状态时,可具体用于:
获取所述第一变量的变量值,并确定所述第一变量的变量值在所述目标缓冲队列中所指示的第一参考缓冲区;
获取所述第二变量的第一当前变量值,并确定所述第一当前变量值在所述目标缓冲队列中所指示的第二参考缓冲区;
若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区不同,则确定所述目标缓冲队列未处于队满状态;若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区相同,则确定所述目标缓冲队列处于所述队满状态。
再一种实施方式中,所述目标缓冲队列还配置有第三变量,所述第三变量的变量值用于指示:所述目标缓冲队列中,用于缓存最近入队的内存地址的缓冲区的区域标识;
相应的,在调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区之后,缓存单元701还可用于:
调用所述目标生产者线程对所述第三变量执行第三原子操作,所述第三原子操作用于指示:当所述第三变量的变量值和所述第一变量最近被执行所述第一原子操作之前的变量值相同时,对所述第三变量的变量值执行原子递增,所述第三变量的变量值是指所述第三变量的内存地址中存储的内存值;
其中,通过所述第三原子操作所得到的变量值用于通知所述多个消费者线程:所述第一目标缓冲区中缓存的内存地址处于可读取状态。
再一种实施方式中,一个缓冲区具有一个区域标识,所述目标缓冲队列配置有第二变量;相应的,读取单元702在用于调用多个消费者线程从所述目标缓冲队列中读取一个已缓存的内存地址时,可具体用于:
根据所述第二变量的第二当前变量值,计算第二目标区域标识;
调用所述多个消费者线程中的目标消费者线程,从所述第二目标区域标识对应的第二目标缓冲区中,读取所述第二目标缓冲区所缓存的内存地址。
再一种实施方式中,在成功读取到所述第二目标缓冲区所缓存的内存地址之后,读取单元702还可用于:
从所述多个消费者线程中确定N个候选消费者线程,N为正整数;所述候选消费者线程是指:未成功申请到缓冲区的消费者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成读操作的消费者线程;
调用所述N个候选消费者线程对所述第二变量执行第二原子操作,所述第二原子操作用于指示:当所述第二变量的预期值和所述第二变量的变量值相同时,对所述第二变量的变量值执行原子递增,所述第二变量的变量值是指所述第二变量的内存地址中存储的内存值;
调用成功执行所述第二原子操作的候选消费者线程,将所述第二目标缓冲区的状态设置为可用状态。
再一种实施方式中,所述目标缓冲队列还配置有第三变量,所述根据所述第二变量的第二当前变量值,计算第二目标区域标识的步骤,是在检测到所述目标缓冲队列未处于队空状态后执行的;
其中,读取单元702在用于检测所述目标缓冲队列是否处于队空状态时,可具体用于:
获取所述第二变量的第二当前变量值,以及所述第三变量的变量值;
若所述第二当前变量值与所述第三变量的变量值相同,则确定所述目标缓冲队列处于队空状态;否则,则确定所述目标缓冲队列未处于所述队空状态。
再一种实施方式中,任一消费者线程每成功读取到一个内存地址后,所述任一消费者线程则被调用执行获取目标网络数据包的的操作,以及对获取到的网络数据包进行响应处理的操作。
再一种实施方式中,处理单元703还可用于:
若检测到队列扩容触发事件,则根据所述目标缓冲队列的容量值构建新的缓冲队列,所述新的缓冲队列的容量值大于所述目标缓冲队列的容量值;
阻止所述多个消费者线程继续从所述目标缓冲队列中读取内存地址,并向所述多个生产者线程发送通知消息;所述通知消息用于通知停止向所述目标缓冲队列中缓存内存地址;
确定所述目标缓冲队列中未被读取的内存地址,并将确定出的内存地址拷贝至所述新的缓冲队列中;
通知所述多个生产者线程将未缓存的剩余内存地址缓存至所述新的缓冲队列中,并通知所述多个消费者线程从所述新的缓冲队列中读取内存地址。
再一种实施方式中,所述通知消息还用于通知所述多个生产者线程:将待缓存的一个或多个内存地址,缓存至临时缓冲队列中;所述未缓存的剩余内存地址是指:所述多个网络数据包的内存地址中,除已缓存至所述目标缓冲队列和所述临时缓冲队列以外的内存地址;
相应的,在将确定出的内存地址拷贝至所述新的缓冲队列中之后,处理单元703还可用于:
为所述临时缓冲队列分配一个生产者线程,并调用被分配的生产者线程将所述临时缓冲队列中的各个内存地址缓存至所述新的缓冲队列中。
再一种实施方式中,所述目标缓冲队列还配置有元素变量,所述元素变量的变量值用于指示:所述目标缓冲队列中处于占用状态的缓冲区的数量;且所述元素变量的变量值在每次执行入队操作后被执行递增处理,并在每次执行出队操作后被执行递减处理;
相应的,处理单元703还可用于:
获取所述元素变量的当前变量值,并根据所述元素变量的当前变量值计算所述目标缓冲队列的当前占用率;
若所述当前占用率大于占用率阈值,则确定检测到队列扩容触发事件;或者,若所述当前占用率大于占用率阈值,则对扩容指示值进行加一处理,若加一处理后的扩容指示值大于预设值,则确定检测到队列扩容触发事件。
根据本发明的一个实施例,图2或图4所示的方法所涉及的各个步骤均可以是由图7所示的数据处理装置中的各个单元来执行的。例如,图2中所示的步骤S201-步骤S203可分别由图7中所示的缓存单元701、读取单元702以及处理单元703执行。又如,图4中所示的步骤S401和步骤S402可分别由图7中所示的缓存单元701和读取单元702执行,步骤S403-步骤S407均可以由图7中所示的处理单元703执行,等等。
根据本发明的另一个实施例,图7所示的数据处理装置中的各个单元可以分别或全部合并为一个或若干个另外的单元来构成,或者其中的某个(些)单元还可以再拆分为功能上更小的多个单元来构成,这可以实现同样的操作,而不影响本发明的实施例的技术效果的实现。上述单元是基于逻辑功能划分的,在实际应用中,一个单元的功能也可以由多个单元来实现,或者多个单元的功能由一个单元实现。在本发明的其它实施例中,基于数据处理装置也可以包括其它单元,在实际应用中,这些功能也可以由其它单元协助实现,并且可以由多个单元协作实现。
根据本发明的另一个实施例,可以通过在包括中央处理单元(CPU)、随机存取存储介质(RAM)、只读存储介质(ROM)等处理元件和存储元件的例如计算机的通用计算设备上运行能够执行如图2或图4中所示的相应方法所涉及的各步骤的计算机程序(包括程序代码),来构造如图7中所示的数据处理装置设备,以及来实现本发明实施例的数据处理方法。所述计算机程序可以记载于例如计算机可读记录介质上,并通过计算机可读记录介质装载于上述计算设备中,并在其中运行。
本发明实施例中的第一客户端获取到同一个设备中的第二客户端发送的多个网络数据包后,可调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列中。目标缓冲队列中的第i个缓冲区是在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存该任一生产者存入的内存地址的;可见,任一生产者线程在缓存其负责的内存地址时,只需通过原子操作在目标缓冲队列中预定一个缓冲区,并在成功预定后写入该内存地址即可,整个缓存过程无需对生产者线程执行加锁操作,从而可有效降低因加锁而给生产者线程造成的性能影响,进而提升整个响应过程的稳定性。在对目标缓冲队列执行写入操作时,还可异步地调用多个消费者线程从目标缓冲队列中读取已缓存的内存地址;通过异步读取内存地址的方式,可以有效减少内存地址的读取时延,从而实现对整个响应过程进行有效加速。当任一消费者线程读取到一个内存地址后,便可根据该内存地址从存储空间中获取对应的目标网络数据包,并对获取的目标网络数包进行响应处理;这样可实现多个消费者线程对网络数据包的并行响应,进一步减少响应时延,提升响应及时性。并且,通过缓存内存地址,可避免生产者线程执行写操作以及消费者线程执行读操作时,因对目标缓冲队列执行数据拷贝操作而引起的性能消耗问题,可有效提升处理效率,进而加速响应过程。
基于上述方法实施例以及装置实施例的描述,本发明实施例还提供一种计算机设备。请参见图8,该计算机设备至少包括处理器801、输入接口802、输出接口803以及计算机存储介质804;可选的,计算机设备中可安装并运行第一客户端和第二客户端,且第一客户端和第二客户端之间可进行通信。其中,计算机设备内的处理器801、输入接口802、输出接口803以及计算机存储介质804可通过总线或其他方式连接。
计算机存储介质804可以存储在计算机设备的存储器中,所述计算机存储介质804用于存储计算机程序,所述计算机程序包括程序指令,所述处理器801用于执行所述计算机存储介质804存储的程序指令。处理器801(或称CPU(Central Processing Unit,中央处理器))是计算机设备的计算核心以及控制核心,其适于实现一条或多条指令,具体适于加载并执行一条或多条指令从而实现相应方法流程或相应功能;在一个实施例中,本发明实施例所述的处理器801可以用于进行一系列的数据处理,具体包括:在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理,等等。
本发明实施例还提供了一种计算机存储介质(Memory),所述计算机存储介质是计算机设备中的记忆设备,用于存放程序和数据。可以理解的是,此处的计算机存储介质既可以包括计算机设备中的内置存储介质,当然也可以包括计算机设备所支持的扩展存储介质。计算机存储介质提供存储空间,该存储空间存储了计算机设备的操作系统。并且,在该存储空间中还存放了适于被处理器801加载并执行的一条或多条的指令,这些指令可以是一个或一个以上的计算机程序(包括程序代码)。需要说明的是,此处的计算机存储介质可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器;可选的,还可以是至少一个位于远离前述处理器的计算机存储介质。
在一个实施例中,可由处理器801加载并执行计算机存储介质中存放的一条或多条指令,以实现上述有关数据处理方法实施例中的方法的相应步骤;具体实现中,计算机存储介质中的一条或多条指令由处理器801加载并执行如下步骤:
在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
在一种实施方式中,一个缓冲区具有一个区域标识;所述目标缓冲队列配置有第一变量,所述第一变量的变量值用于指示:所述目标缓冲队列中,用于缓存下一个需入队的内存地址的缓冲区的区域标识;
其中,所述第一原子操作是对所述第一变量执行的;所述第一原子操作用于指示:当所述第一变量的预期值和所述第一变量的变量值相同时,对所述第一变量的变量值执行原子递增,所述第一变量的变量值是指所述第一变量的内存地址中存储的内存值。
再一种实施方式中,在调用所述多个生产者线程将一个网络数据包的内存地址缓存至目标缓冲队列时,所述一条或多条指令可由处理器801加载并具体执行:
从所述多个生产者线程中确定M个候选生产者线程,M为正整数;所述候选生产者线程是指:未成功申请到缓冲区的生产者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成写操作的生产者线程;
调用所述M个候选生产者线程对所述第一变量执行第一原子操作,并从所述M个候选生产者线程中确定目标生产者线程,所述目标生产者线程是指成功执行所述第一原子操作的候选生产者线程;
根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,计算第一目标区域标识;
将所述目标缓冲队列中所述第一目标区域标识对应的第一目标缓冲区,分配给所述目标生产者线程;并调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区。
再一种实施方式中,在根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的内存值,计算第一目标区域标识时,所述一条或多条指令可由处理器801加载并具体执行:
采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的运算值进行位运算,得到第一目标区域标识;
或者,采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的容量值进行取模运算,得到第一目标区域标识;
其中,所述目标缓冲队列的运算值是根据所述目标缓冲队列的容量值确定的,所述目标缓冲队列的容量值可用于指示:所述目标缓冲队列中的缓冲区的总数量。
再一种实施方式中,所述从所述多个生产者线程中确定M个候选生产者线程的步骤,是在检测到所述目标缓冲队列未处于队满状态后执行的;
所述目标缓冲队列还配置有第二变量,所述第二变量的变量值在每次执行出队操作后被执行递增处理,且所述第二变量的变量值用于指示:所述目标缓冲队列中,缓存有下一个需出队的内存地址的缓冲区的区域标识;
其中,在检测所述目标缓冲队列是否处于队满状态时,所述一条或多条指令可由处理器801加载并具体执行:
获取所述第一变量的变量值,并确定所述第一变量的变量值在所述目标缓冲队列中所指示的第一参考缓冲区;
获取所述第二变量的第一当前变量值,并确定所述第一当前变量值在所述目标缓冲队列中所指示的第二参考缓冲区;
若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区不同,则确定所述目标缓冲队列未处于队满状态;若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区相同,则确定所述目标缓冲队列处于所述队满状态。
再一种实施方式中,所述目标缓冲队列还配置有第三变量,所述第三变量的变量值用于指示:所述目标缓冲队列中,用于缓存最近入队的内存地址的缓冲区的区域标识;
相应的,在调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区之后,所述一条或多条指令还可由处理器801加载并具体执行:
调用所述目标生产者线程对所述第三变量执行第三原子操作,所述第三原子操作用于指示:当所述第三变量的变量值和所述第一变量最近被执行所述第一原子操作之前的变量值相同时,对所述第三变量的变量值执行原子递增,所述第三变量的变量值是指所述第三变量的内存地址中存储的内存值;
其中,通过所述第三原子操作所得到的变量值用于通知所述多个消费者线程:所述第一目标缓冲区中缓存的内存地址处于可读取状态。
再一种实施方式中,一个缓冲区具有一个区域标识,所述目标缓冲队列配置有第二变量;相应的,在调用多个消费者线程从所述目标缓冲队列中读取一个已缓存的内存地址时,所述一条或多条指令可由处理器801加载并具体执行:
根据所述第二变量的第二当前变量值,计算第二目标区域标识;
调用所述多个消费者线程中的目标消费者线程,从所述第二目标区域标识对应的第二目标缓冲区中,读取所述第二目标缓冲区所缓存的内存地址。
再一种实施方式中,在成功读取到所述第二目标缓冲区所缓存的内存地址之后,所述一条或多条指令还可由处理器801加载并具体执行:
从所述多个消费者线程中确定N个候选消费者线程,N为正整数;所述候选消费者线程是指:未成功申请到缓冲区的消费者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成读操作的消费者线程;
调用所述N个候选消费者线程对所述第二变量执行第二原子操作,所述第二原子操作用于指示:当所述第二变量的预期值和所述第二变量的变量值相同时,对所述第二变量的变量值执行原子递增,所述第二变量的变量值是指所述第二变量的内存地址中存储的内存值;
调用成功执行所述第二原子操作的候选消费者线程,将所述第二目标缓冲区的状态设置为可用状态。
再一种实施方式中,所述目标缓冲队列还配置有第三变量,所述根据所述第二变量的第二当前变量值,计算第二目标区域标识的步骤,是在检测到所述目标缓冲队列未处于队空状态后执行的;
其中,在检测所述目标缓冲队列是否处于队空状态时,所述一条或多条指令可由处理器801加载并具体执行:
获取所述第二变量的第二当前变量值,以及所述第三变量的变量值;
若所述第二当前变量值与所述第三变量的变量值相同,则确定所述目标缓冲队列处于队空状态;否则,则确定所述目标缓冲队列未处于所述队空状态。
再一种实施方式中,任一消费者线程每成功读取到一个内存地址后,所述任一消费者线程则被调用执行获取目标网络数据包的的操作,以及对获取到的网络数据包进行响应处理的操作。
再一种实施方式中,所述一条或多条指令还可以由处理器801加载并具体执行:
若检测到队列扩容触发事件,则根据所述目标缓冲队列的容量值构建新的缓冲队列,所述新的缓冲队列的容量值大于所述目标缓冲队列的容量值;
阻止所述多个消费者线程继续从所述目标缓冲队列中读取内存地址,并向所述多个生产者线程发送通知消息;所述通知消息用于通知停止向所述目标缓冲队列中缓存内存地址;
确定所述目标缓冲队列中未被读取的内存地址,并将确定出的内存地址拷贝至所述新的缓冲队列中;
通知所述多个生产者线程将未缓存的剩余内存地址缓存至所述新的缓冲队列中,并通知所述多个消费者线程从所述新的缓冲队列中读取内存地址。
再一种实施方式中,所述通知消息还用于通知所述多个生产者线程:将待缓存的一个或多个内存地址,缓存至临时缓冲队列中;所述未缓存的剩余内存地址是指:所述多个网络数据包的内存地址中,除已缓存至所述目标缓冲队列和所述临时缓冲队列以外的内存地址;
相应的,在将确定出的内存地址拷贝至所述新的缓冲队列中之后,所述一条或多条指令还可由处理器801加载并具体执行:
为所述临时缓冲队列分配一个生产者线程,并调用被分配的生产者线程将所述临时缓冲队列中的各个内存地址缓存至所述新的缓冲队列中。
再一种实施方式中,所述目标缓冲队列还配置有元素变量,所述元素变量的变量值用于指示:所述目标缓冲队列中处于占用状态的缓冲区的数量;且所述元素变量的变量值在每次执行入队操作后被执行递增处理,并在每次执行出队操作后被执行递减处理;
相应的,所述一条或多条指令还可由处理器801加载并具体执行:
获取所述元素变量的当前变量值,并根据所述元素变量的当前变量值计算所述目标缓冲队列的当前占用率;
若所述当前占用率大于占用率阈值,则确定检测到队列扩容触发事件;或者,若所述当前占用率大于占用率阈值,则对扩容指示值进行加一处理,若加一处理后的扩容指示值大于预设值,则确定检测到队列扩容触发事件。
本发明实施例中的第一客户端获取到同一个设备中的第二客户端发送的多个网络数据包后,可调用多个生产者线程将多个网络数据包的内存地址缓存至目标缓冲队列中。目标缓冲队列中的第i个缓冲区是在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存该任一生产者存入的内存地址的;可见,任一生产者线程在缓存其负责的内存地址时,只需通过原子操作在目标缓冲队列中预定一个缓冲区,并在成功预定后写入该内存地址即可,整个缓存过程无需对生产者线程执行加锁操作,从而可有效降低因加锁而给生产者线程造成的性能影响,进而提升整个响应过程的稳定性。在对目标缓冲队列执行写入操作时,还可异步地调用多个消费者线程从目标缓冲队列中读取已缓存的内存地址;通过异步读取内存地址的方式,可以有效减少内存地址的读取时延,从而实现对整个响应过程进行有效加速。当任一消费者线程读取到一个内存地址后,便可根据该内存地址从存储空间中获取对应的目标网络数据包,并对获取的目标网络数包进行响应处理;这样可实现多个消费者线程对网络数据包的并行响应,进一步减少响应时延,提升响应及时性。并且,通过缓存内存地址,可避免生产者线程执行写操作以及消费者线程执行读操作时,因对目标缓冲队列执行数据拷贝操作而引起的性能消耗问题,可有效提升处理效率,进而加速响应过程。
需要说明的是,根据本申请的一个方面,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述图2或图4所示的数据处理方法实施例方面的各种可选方式中提供的方法。
并且,应理解的是,以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (15)
1.一种数据处理方法,其特征在于,所述数据处理方法由第一客户端执行,所述第一客户端与第二客户端进行通信,且所述第一客户端和所述第二客户端运行在同一个设备中;所述方法包括:
在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
2.如权利要求1所述的方法,其特征在于,一个缓冲区具有一个区域标识;所述目标缓冲队列配置有第一变量,所述第一变量的变量值用于指示:所述目标缓冲队列中,用于缓存下一个需入队的内存地址的缓冲区的区域标识;
其中,所述第一原子操作是对所述第一变量执行的;所述第一原子操作用于指示:当所述第一变量的预期值和所述第一变量的变量值相同时,对所述第一变量的变量值执行原子递增,所述第一变量的变量值是指所述第一变量的内存地址中存储的内存值。
3.如权利要求2所述的方法,其特征在于,调用所述多个生产者线程将一个网络数据包的内存地址缓存至目标缓冲队列的方式为:
从所述多个生产者线程中确定M个候选生产者线程,M为正整数;所述候选生产者线程是指:未成功申请到缓冲区的生产者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成写操作的生产者线程;
调用所述M个候选生产者线程对所述第一变量执行第一原子操作,并从所述M个候选生产者线程中确定目标生产者线程,所述目标生产者线程是指成功执行所述第一原子操作的候选生产者线程;
根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,计算第一目标区域标识;
将所述目标缓冲队列中所述第一目标区域标识对应的第一目标缓冲区,分配给所述目标生产者线程;并调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区。
4.如权利要求3所述的方法,其特征在于,所述根据所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的内存值,计算第一目标区域标识,包括:
采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的运算值进行位运算,得到第一目标区域标识;
或者,采用所述目标生产者线程执行所述第一原子操作时,所采用的第一变量的变量值,对所述目标缓冲队列的容量值进行取模运算,得到第一目标区域标识;
其中,所述目标缓冲队列的运算值是根据所述目标缓冲队列的容量值确定的,所述目标缓冲队列的容量值可用于指示:所述目标缓冲队列中的缓冲区的总数量。
5.如权利要求3所述的方法,其特征在于,所述从所述多个生产者线程中确定M个候选生产者线程的步骤,是在检测到所述目标缓冲队列未处于队满状态后执行的;
所述目标缓冲队列还配置有第二变量,所述第二变量的变量值在每次执行出队操作后被执行递增处理,且所述第二变量的变量值用于指示:所述目标缓冲队列中,缓存有下一个需出队的内存地址的缓冲区的区域标识;
其中,检测所述目标缓冲队列是否处于队满状态的方式为:
获取所述第一变量的变量值,并确定所述第一变量的变量值在所述目标缓冲队列中所指示的第一参考缓冲区;
获取所述第二变量的第一当前变量值,并确定所述第一当前变量值在所述目标缓冲队列中所指示的第二参考缓冲区;
若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区不同,则确定所述目标缓冲队列未处于队满状态;若所述第一参考缓冲区的下一个缓冲区与所述第二参考缓冲区相同,则确定所述目标缓冲队列处于所述队满状态。
6.如权利要求3-5任一项所述的方法,其特征在于,所述目标缓冲队列还配置有第三变量,所述第三变量的变量值用于指示:所述目标缓冲队列中,用于缓存已入队的最后一个内存地址的缓冲区的区域标识;
所述调用所述目标生产者线程将对应的网络数据包的内存地址,缓存至所述第一目标缓冲区之后,还包括:
调用所述目标生产者线程对所述第三变量执行第三原子操作,所述第三原子操作用于指示:当所述第三变量的变量值和所述第一变量于当前时刻之前最后一次被执行所述第一原子操作之前的变量值相同时,对所述第三变量的变量值执行原子递增,所述第三变量的变量值是指所述第三变量的内存地址中存储的内存值;
其中,通过所述第三原子操作所得到的变量值用于通知所述多个消费者线程:所述第一目标缓冲区中缓存的内存地址处于可读取状态。
7.如权利要求1-5任一项所述的方法,其特征在于,一个缓冲区具有一个区域标识,所述目标缓冲队列配置有第二变量;调用多个消费者线程从所述目标缓冲队列中读取一个已缓存的内存地址的方式为:
根据所述第二变量的第二当前变量值,计算第二目标区域标识;
调用所述多个消费者线程中的目标消费者线程,从所述第二目标区域标识对应的第二目标缓冲区中,读取所述第二目标缓冲区所缓存的内存地址。
8.如权利要求7所述的方法,其特征在于,在成功读取到所述第二目标缓冲区所缓存的内存地址之后,还包括:
从所述多个消费者线程中确定N个候选消费者线程,N为正整数;所述候选消费者线程是指:未成功申请到缓冲区的消费者线程,或者已成功申请到缓冲区并对已申请到的缓冲区完成读操作的消费者线程;
调用所述N个候选消费者线程对所述第二变量执行第二原子操作,所述第二原子操作用于指示:当所述第二变量的预期值和所述第二变量的变量值相同时,对所述第二变量的变量值执行原子递增,所述第二变量的变量值是指所述第二变量的内存地址中存储的内存值;
调用成功执行所述第二原子操作的候选消费者线程,将所述第二目标缓冲区的状态设置为可用状态。
9.如权利要求7所述的方法,其特征在于,所述目标缓冲队列还配置有第三变量,所述根据所述第二变量的第二当前变量值,计算第二目标区域标识的步骤,是在检测到所述目标缓冲队列未处于队空状态后执行的;
其中,检测所述目标缓冲队列是否处于队空状态的方式为:
获取所述第二变量的第二当前变量值,以及所述第三变量的变量值;
若所述第二当前变量值与所述第三变量的变量值相同,则确定所述目标缓冲队列处于队空状态;否则,则确定所述目标缓冲队列未处于所述队空状态。
10.如权利要求7所述的方法,其特征在于,任一消费者线程每成功读取到一个内存地址后,所述任一消费者线程则被调用执行获取目标网络数据包的操作,以及对获取到的网络数据包进行响应处理的操作。
11.如权利要求1所述的方法,其特征在于,所述方法还包括:
若检测到队列扩容触发事件,则根据所述目标缓冲队列的容量值构建新的缓冲队列,所述新的缓冲队列的容量值大于所述目标缓冲队列的容量值;
阻止所述多个消费者线程继续从所述目标缓冲队列中读取内存地址,并向所述多个生产者线程发送通知消息;所述通知消息用于通知停止向所述目标缓冲队列中缓存内存地址;
确定所述目标缓冲队列中未被读取的内存地址,并将确定出的内存地址拷贝至所述新的缓冲队列中;
通知所述多个生产者线程将未缓存的剩余内存地址缓存至所述新的缓冲队列中,并通知所述多个消费者线程从所述新的缓冲队列中读取内存地址。
12.如权利要求11所述的方法,其特征在于,所述通知消息还用于通知所述多个生产者线程:将待缓存的一个或多个内存地址,缓存至临时缓冲队列中;所述未缓存的剩余内存地址是指:所述多个网络数据包的内存地址中,除已缓存至所述目标缓冲队列和所述临时缓冲队列以外的内存地址;
所述将确定出的内存地址拷贝至所述新的缓冲队列中之后,还包括:
为所述临时缓冲队列分配一个生产者线程,并调用被分配的生产者线程将所述临时缓冲队列中的各个内存地址缓存至所述新的缓冲队列中。
13.如权利要求11所述的方法,其特征在于,所述目标缓冲队列还配置有元素变量,所述元素变量的变量值用于指示:所述目标缓冲队列中处于占用状态的缓冲区的数量;且所述元素变量的变量值在每次执行入队操作后被执行递增处理,并在每次执行出队操作后被执行递减处理;
所述方法还包括:
获取所述元素变量的当前变量值,并根据所述元素变量的当前变量值计算所述目标缓冲队列的当前占用率;
若所述当前占用率大于占用率阈值,则确定检测到队列扩容触发事件;或者,若所述当前占用率大于占用率阈值,则对扩容指示值进行加一处理,若加一处理后的扩容指示值大于预设值,则确定检测到队列扩容触发事件。
14.一种数据处理装置,其特征在于,所述数据处理装置运行在第一客户端中,所述第一客户端与第二客户端进行通信,且所述第一客户端和所述第二客户端运行在同一个设备中;所述装置包括:
缓存单元,用于在获取到所述第二客户端发送的多个网络数据包后,调用多个生产者线程将所述多个网络数据包的内存地址缓存至目标缓冲队列;所述目标缓冲队列包括K个缓冲区,第i个缓冲区在被任一生产者线程通过第一原子操作成功申请到后,接收并缓存所述任一生产者存入的内存地址;任一网络数据包的内存地址用于指示所述任一网络数据包在所述第一客户端的存储空间中的存储位置;K为正整数,且i∈[1,K];
读取单元,用于异步调用多个消费者线程从所述目标缓冲队列中读取一个或多个已缓存的内存地址,并根据读取到的各个内存地址从所述存储空间中获取对应的目标网络数据包;
处理单元,用于调用所述多个消费者线程对获取到的各个目标网络数据包进行响应处理。
15.一种计算机设备,包括输入接口和输出接口,其特征在于,还包括:
处理器,适于实现一条或多条指令;以及,
计算机存储介质,所述计算机存储介质存储有一条或多条指令,所述一条或多条指令适于由所述处理器加载并执行如权利要求1-13任一项所述的数据处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110151770.6A CN114928579B (zh) | 2021-02-01 | 2021-02-01 | 数据处理方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110151770.6A CN114928579B (zh) | 2021-02-01 | 2021-02-01 | 数据处理方法、装置、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114928579A CN114928579A (zh) | 2022-08-19 |
CN114928579B true CN114928579B (zh) | 2024-04-09 |
Family
ID=82804110
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110151770.6A Active CN114928579B (zh) | 2021-02-01 | 2021-02-01 | 数据处理方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114928579B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115292054B (zh) * | 2022-10-08 | 2022-12-06 | 湖北芯擎科技有限公司 | 数据处理方法、装置、系统级芯片及存储介质 |
CN115827252B (zh) * | 2023-01-10 | 2023-05-05 | 南京砺算科技有限公司 | 顶点数据处理方法、图形处理器、电子设备及存储介质 |
CN116303137B (zh) * | 2023-02-27 | 2024-09-06 | 深圳市步科电气有限公司 | 数据滤波方法、装置、电子设备及可读存储介质 |
CN116755891B (zh) * | 2023-08-21 | 2023-10-20 | 成都中科合迅科技有限公司 | 基于多线程的事件队列处理方法和系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105094751A (zh) * | 2015-07-20 | 2015-11-25 | 中国科学院计算技术研究所 | 一种用于流式数据并行处理的内存管理方法 |
CN112131002A (zh) * | 2020-09-24 | 2020-12-25 | 腾讯科技(深圳)有限公司 | 数据管理方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140068165A1 (en) * | 2012-09-06 | 2014-03-06 | Accedian Networks Inc. | Splitting a real-time thread between the user and kernel space |
US20190102223A1 (en) * | 2017-09-29 | 2019-04-04 | Niall Power | System, Apparatus And Method For Real-Time Activated Scheduling In A Queue Management Device |
-
2021
- 2021-02-01 CN CN202110151770.6A patent/CN114928579B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105094751A (zh) * | 2015-07-20 | 2015-11-25 | 中国科学院计算技术研究所 | 一种用于流式数据并行处理的内存管理方法 |
CN112131002A (zh) * | 2020-09-24 | 2020-12-25 | 腾讯科技(深圳)有限公司 | 数据管理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN114928579A (zh) | 2022-08-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114928579B (zh) | 数据处理方法、装置、计算机设备及存储介质 | |
JP7197612B2 (ja) | オンデマンドネットワークコード実行システム上での補助機能の実行 | |
Li et al. | Socksdirect: Datacenter sockets can be fast and compatible | |
US9276864B1 (en) | Dynamic network traffic throttling | |
US10432551B1 (en) | Network request throttling | |
CN108063813B (zh) | 一种集群环境下密码服务网络并行化的方法与系统 | |
Pipatsakulroj et al. | muMQ: A lightweight and scalable MQTT broker | |
AU2016201513B2 (en) | Low latency fifo messaging system | |
CN110351366B (zh) | 一种互联网应用的服务调度系统和方法及存储介质 | |
EP1474746A1 (en) | Management of message queues | |
US20140068165A1 (en) | Splitting a real-time thread between the user and kernel space | |
CN107797859B (zh) | 一种定时任务的调度方法及一种调度服务器 | |
CN106571978B (zh) | 数据包捕获方法及装置 | |
La Marra et al. | Improving MQTT by inclusion of usage control | |
CN113641410A (zh) | 一种基于Netty的高性能网关系统的处理方法及系统 | |
CN106533961B (zh) | 一种流量控制方法及装置 | |
CN111343102A (zh) | 流速控制方法、服务端服务器、客户端服务器和系统 | |
CN112506683A (zh) | 一种数据处理的方法、相关装置、设备以及存储介质 | |
CN114598658A (zh) | 一种流量限制方法及装置 | |
US11321135B2 (en) | Rate limiting compliance assessments with multi-layer fair share scheduling | |
CN117642724A (zh) | 使用无服务器计算系统的流式分析 | |
US11861386B1 (en) | Application gateways in an on-demand network code execution system | |
US10242174B2 (en) | Secure information flow | |
Lee et al. | Transparent many‐core partitioning for high‐performance big data I/O | |
EP2979196B1 (en) | System and method for network provisioning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40073685 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant |