CN106997304B - 输入输出事件的处理方法及设备 - Google Patents
输入输出事件的处理方法及设备 Download PDFInfo
- Publication number
- CN106997304B CN106997304B CN201610042065.1A CN201610042065A CN106997304B CN 106997304 B CN106997304 B CN 106997304B CN 201610042065 A CN201610042065 A CN 201610042065A CN 106997304 B CN106997304 B CN 106997304B
- Authority
- CN
- China
- Prior art keywords
- input
- poller
- event
- output event
- output
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/466—Transaction processing
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请的目的是提供一种输入输出事件的处理方法及设备,具体地,当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;利用轮询器进程查询是否有输入输出事件;若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。与现有技术相比,本申请的方案能够在同一时间调度业务处理进程处理输入输出事件的调度器线程的数量不限于一个,提高了输入输出事件的处理效率,从而能够及时处理大量的输入输出事。
Description
技术领域
本申请涉及计算机领域,尤其涉及一种输入输出事件的处理方法及设备。
背景技术
代理服务器用于连接前端用户和后端数据库,其性能直接影响用户的使用体验,考虑到快速迭代,稳定性,在线更新等因素,一般会采用Erlang(一种面向并发的编程语言)开发。在作为其具体实现的Erlang虚拟机中,N个调度器线程(scheduler)采用leader/follwer(领导者/追随者)模式轮流拥有管理套接字结构(pollset)的使用权,因此同一时间只能有一个调度器线程线程处理管理套接字结构的事件。在进行输入输出(IO)事件的处理时,其主要数据流如图1所示:
1)业务处理进程(process)在没有消息的时候通过接收原语挂起在scheduler上。
2)当有输入输出事件到来,角色为leader的scheduler-1对该输入输出事件进行处理。
3)scheduler-1通过相应的回调函数把输入输出事件的数据以消息的形式发送到某个process中。
由此可知,现有的方案中同一时间只能有一个调度器线程处理管理套接字结构的输入输出事件,处理效率较低。对于大输入输出压力的场景来说,新产生的输入输出事件有可能无法得到及时处理,由此将会造代理服务器的吞吐量较低,无法及时响应用户的请求,导致用户请求的处理延迟较大。
申请内容
本申请的一个目的是提供一种输入输出事件的处理方法及设备,用以解决现有技术中输入输出事件的处理效率较低,不能及时处理大量的输入输出事件的问题。
为实现上述目的,本申请提供了一种输入输出事件的处理方法,该方法包括:
当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;
利用轮询器进程查询是否有输入输出事件;
若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
基于本申请的另一方面,还提供了一种输入输出事件的处理设备,该设备包括:
信息添加装置,用于在业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;
轮询装置,用于利用轮询器进程查询是否有输入输出事件;
回调处理装置,用于在利用轮询器进程查询到有输入输出事件时,利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
本申请还提供了一种输入输出事件的处理设备,该设备包括:
处理器;
以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;利用轮询器进程查询是否有输入输出事件;若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
与现有技术相比,本申请的技术方案通过用于处理输入输出事件的轮询器进程,在利用轮询器进程查询到有输入输出事件时,可以利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程,使得同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量不限于一个,提高了输入输出事件的处理效率,从而能够及时处理大量的输入输出事件。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1为现有技术中进行输入输出事件处理时主要数据流的示意图;
图2为本申请实施例提供的一种输入输出事件的处理方法的流程图;
图3为本申请实施例提供的一种优选的输入输出事件的处理方法的流程图;
图4为本申请实施例提供的另一种优选的输入输出事件的处理方法的流程图;
图5为采用本申请方案进行输入输出事件处理时主要数据流的示意图;
图6为采用本申请方案进行业务处理进程绑定时主要数据流的示意图;
图7为本申请实施例提供的一种输入输出事件的处理设备的结构示意图;
图8为本申请实施例提供的一种优选的输入输出事件的处理设备的结构示意图;
附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
图2示出了一种输入输出事件的处理方法的处理流程,该方法包括以下步骤:
步骤S201,当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中。
步骤S202,利用轮询器进程查询是否有输入输出事件。
步骤S203,若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
所述轮询器进程和业务处理进程均为系统内运行的进程,运行于调度器线程,受其调度。两者的区别在于所述轮询器进程的唯一作用是处理输入输出事件,其优先级高于普通的业务处理进程,而业务处理进程则用于处理系统中的其它业务逻辑。
以Erlang虚拟机为例,所述业务处理进程用于处理普通的用户业务,而所述轮询器进程(poller)专门用于处理输入输出事件,优先级为high,高于所述业务处理进程,其任务仅仅是通过调用evrun()接口轮询事件库(libev)是否有输入输出事件需要处理,并根据不同的结果进行相应的处理。若结果为有输入输出事件,则利用轮询器进程通过相应的回调函数将输入输出事件的数据发送至所述事件循环结构体(ev_loop)中记录的文件描述符封装信息(ev_io)所对应的业务处理进程,即文件描述符封装信息的拥有者。作为该拥有者的业务处理进程在得到输入输出事件的数据以后,会等待调度器线程对其进行调度,从而进行相应的处理,例如数据发送、存储等。由于轮询器进程也属于进程,因此即使一直有输入输出事件,轮询器进程也不会一直抢占着调度器线程,当轮询器进程的reduction(表示Erlang虚拟机的软实时调度机制中为进程执行分配的时间片)消耗完时,根据Erlang虚拟机的软实时调度机制,就会强制调度其他业务处理进程运行,从而保证所有进程的公平性。
由此,本申请实施例中的处理方法通过用于处理输入输出事件的轮询器进程,在利用轮询器进程查询到有输入输出事件时,可以利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程,使得同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量不限于一个,提高了输入输出事件的处理效率,从而能够及时处理大量的输入输出事件。
在本方案中,管理套接字结构的数量可以是多个,并且当轮询器进程的数量与调度器线程的数量设置为一致时,可以达到最优效果。例如两者都为N个时,同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量也可以是N个。在实际应用中,也可以允许轮询器进程个数多于erlang虚拟机的调度器线程个数的,目的是通过提升轮询器进程的个数,使所有轮询器进程的总reduction增加,使得轮询器进程的reduction在所有进程的总reduction中的占比增加,从而间接地提高处理输入输出事件的时间占比。
进一步地,作为一种优选的实施方式,本申请实施例还提供了一种优选的输入输出事件的处理方法,该方法的处理流程如图3所示,包括以下步骤:
步骤S201,当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中。
步骤S202,利用轮询器进程查询是否有输入输出事件。
步骤S203,若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
步骤S204,若利用轮询器进程查询到无输入输出事件,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表。
步骤S205,唤醒监听线程,利用所述监听线程查询是否有输入输出事件。
步骤S206,若利用监听线程查询到有输入输出事件,则利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程。
步骤S207,利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
接上例,作为轮询器进程查询的另一种结果,若轮询器进程在调用evrun()接口进行轮询,发现没有输入输出事件待处理时,轮询器进程会阻塞在接收(receive)原语上,同时挂靠(Attach)在管理套接字结构的通知列表(mon_list)上。该通知列表为一个单向链表,若有多个轮询器进程需要挂靠,均会串在这个链表上。在将轮询器进程挂靠至通知列表后,会将监听线程(watcher)唤醒,利用所述监听线程查询是否有输入输出事件。监听线程在进行查询时,同样调用ev_run()接口轮询事件库是否有输入输出事件需要处理。
优选地,在上述方法中,所述轮询器进程以非阻塞的方式查询是否有输入输出事件,而所述监听线程以阻塞的方式查询是否有输入输出事件。例如在Erlang虚拟机中,轮询器进程以非阻塞的方式调用evrun(),以确保在无输入输出事件时,轮询器进程可以立即返回,不影响调度器线程调度其它的进程。而监听线程则以阻塞方式调用evrun(),因此在未获得结果(即无输入输出事件)时不会返回,只有在获得结果(即有输入输出事件)时才会返回。因此监听线程在从evrun()返回后,说明有输入输出事件到来,此时会通知挂靠在通知列表上的所有轮询器进程,以保证输入输出事件能够及时处理。在整个处理过程中,轮询器进程和监听线程对evrun()的调用是互斥的,即在同一时刻evrun()要么是由轮询器进程在调用,要么是由监听线程在调用。
在实际应用中,监听线程通过向挂靠在通知列表上的所有轮询器进程发送event(事件)消息的方式来唤醒轮询器进程,使其对到来的输入输出事件进行处理,即通过相应的回调函数将输入输出事件的数据发送至事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
作为一种优选的实施方式,由于轮询器进程以非阻塞的方式查询是否有输入输出事件,因此在利用轮询器进程查询是否有输入输出事件时,查询的次数可以是多次。其中,具体次数可以根据应用场景的实际需要设定,例如设定5次、10次等。由于轮询器进程以非阻塞的方式调用evrun()进行轮询,若一次调用没有从evrun()返回输入输出事件,则可以继续尝试一定次数的调用,只有在利用轮询器进程多次查询均无输入输出事件,才进行后续步骤的处理。由此,可以减少轮询器进程与监听线程之间切换的次数,降低事件抖动。相应地,该方案的具体处理流程如图4所示,具体包括:
步骤S401,当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中。
步骤S402,利用轮询器进程查询是否有输入输出事件,其中所述查询的次数为多次。
步骤S403,若在利用轮询器进程多次查询均无输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
步骤S404,若利用轮询器进程查询到无输入输出事件,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表。
步骤S405,唤醒监听线程,利用所述监听线程查询是否有输入输出事件。
步骤S406,若利用监听线程查询到有输入输出事件,则利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程。
步骤S407,利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
图5示出了采用本申请方案在Erlang虚拟机中在进行输入输出事件的处理时的主要数据流的示意图。为简明起见,图中示出的各类元素的数量可能小于实际场景中相应元素的数量,但这种省略无疑地是以不会影响对本发明进行清楚、充分的公开为前提的。
具体地,0)process在接收网络数据(通过recv())时,会通过调用enable_events()把自己的ev_io加入到ev_loop中,等待readable(可读)消息。
1)poller通过evrun()轮询libev是否有输入输出事件需要处理,如果没有则进行3)的流程,如果有则进行2)的流程。
2)当poller在调用evrun(),且有输入输出事件,在回调中把输入输出事件的数据通过消息(message)的形式发送给这个ev_io的拥有者,也就是ev_io对应的process。
3)当poller在调用evrun(),发现没有输入输出事件待处理时,poller会阻塞在receive原语上,同时挂靠在pollset的mon_list链表上。
4)在3)中把poller挂靠在mon_list上时,唤醒watcher。watcher以阻塞的方式调用libev的evrun()接口。
5)当4)中watcher从libev的接口ev_run()返回时,说明有输入输出事件需要处理,需要唤醒poller。此时,会向挂靠在mon_list上的所有poller发送event消息,唤醒poller,使其把输入输出事件的数据发送给相应的process。
在实际应用中,若业务处理进程没有与调度器线程进行绑定,会出现两个调度器线程之间的进程相互发送消息的情况,由此导致一个输入输出事件最终需要流经两个系统级线程(即两个调度器线程)才能彻底消费掉,由此导致处理性能降低。为解决该问题,本申请实施例还提供了一种更优选的处理方法,该方法进一步包括:当业务处理进程接收数据时,将所述业务处理进程与调度器线程进行绑定。此时,处理一条连接的业务处理进程和对应的套接字(socket)都在一个调度器线程上执行,因此一个输入输出事件的处理不需要线程间的切换即可完成。
若业务处理进程与记录其文件描述符封装信息的管理套接字结构的未绑定在一个调度器线程上也会导致处理性能降低,因此需要通过合理的绑定方式保证业务处理进程与记录其文件描述符封装信息的管理套接字结构的绑定在同一个调度器线程上。在本实施例中,将所述业务处理进程与调度器线程进行绑定的方式为:先将所述业务处理进程的套接字绑定至管理套接字结构,并将所述管理套接字结构对应的调度器线程的标记信息记录到所述套接字中;再根据所述业务处理进程的套接字中记录的所述标记信息,将所述业务处理进程绑定至所述标记信息对应的调度器线程。
在实际应用中,由于对业务处理进程进行绑定会导致多个调度器线程间的负载不均衡,因此将所述业务处理进程的套接字绑定至管理套接字结构之前,还需要根据预设的绑定策略确定待绑定的管理套接字结构,来尽量保证多个调度器线程间的负载能够均衡。
本申请实施例中提供了绑定策略包括但不限于以下两种:轮询或者最小值优先。所述轮询的绑定策略具体为:所有管理套接字结构依次轮流确定为待绑定的管理套接字结构。例如Erlang虚拟机中包含4个管理套接字结构,分别为pollset-1、pollset-2、pollset-3和pollset-4,在第一次进行绑定之前,先pollset-1确定为待绑定的管理套接字结构,在第二至四次进行绑定之前,分别确定pollset-2~pollset-4为待绑定的管理套接字结构,在后续的绑定过程中重复该过程。所述最小值优先的绑定策略具体为:查询所有管理套接字结构的事件循环结构体中已添加的文件描述符封装信息,并将文件描述符封装信息的数量最少的管理套接字结构,确定为待绑定的管理套接字结构。仍以场景为例,pollset-1、pollset-2、pollset-3和pollset-4中当前记录的ev_io的数量分别为2、3、4、3,则会将pollset-1确定为待绑定的管理套接字结构。在此,本领域技术人员应当能够理解上述绑定策略的描述仅为举例,其他现有的或今后可能出现的用于确定待绑定的管理套接字结构的绑定策略如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。
图6示出了采用本申请方案在Erlang虚拟机中在进行process绑定处理时的主要数据流的示意图。在图6中,scheduler-1处理2个process,pollset-1记录有这2个process对应的2个ev_io,scheduler-2处理另外3个process,pollset-2记录有这3个process对应的3个ev_io。为简明起见,图中示出的各类元素的数量可能小于实际场景中相应元素的数量,但这种省略无疑地是以不会影响对本发明进行清楚、充分的公开为前提的。
当业务处理进程接收数据时需要建立新的链接,因此新进程process-0需要选择一个scheduler和一个pollset。
1)pollset的绑定:当process-0的socket需要加入pollset中时,会从全局的一个小顶堆(min heap)中获取到当前处理ev_io最少的pollset,即pollset-1。然后把socket绑定到这个pollset-1上,同时把pollset-1对应scheduler的id记录到socket中。如上图中的bind-0。
2)scheduler的绑定:业务层的process从socket中取出socket所在的scheduler的id,然后把这个Process绑定到对应的scheduler上。如上图的bind-1。
由此,在上述方案中处理一条连接的业务处理进程和对应的套接字都在一个调度器线程上执行,一个输入输出事件的处理不需要线程间的切换即可完成,减少了线程切换和CPU cache miss(缓存未命中),提高了处理效率。
基于本申请的另一方面,还提供了一种输入输出事件的处理设备,该设备的结构如图7所示,包括信息添加装置710、轮询装置720和回调处理装置730。具体地,所述信息添加装置710用于在业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;所述轮询装置720用于利用轮询器进程查询是否有输入输出事件;所述回调处理装置730用于在利用轮询器进程查询到有输入输出事件时,利用轮询器进程将输入输出事件的数据发送至所述事件循环结构中记录的文件描述符封装信息所对应的业务处理进程。
所述轮询器进程和业务处理进程均为系统内运行的进程,运行于调度器线程,受其调度。两者的区别在于所述轮询器进程的唯一作用是处理输入输出事件,其优先级高于普通的业务处理进程,而业务处理进程则用于处理系统中的其它业务逻辑。
以Erlang虚拟机为例,所述业务处理进程用于处理普通的用户业务,而所述轮询器进程(poller)专门用于处理输入输出事件,优先级为high,高于所述业务处理进程,其任务仅仅是通过调用evrun()接口轮询事件库(libev)是否有输入输出事件需要处理,并根据不同的结果进行相应的处理。若结果为有输入输出事件,则利用轮询器进程通过相应的回调函数将输入输出事件的数据发送至所述事件循环结构体(ev_loop)中记录的文件描述符封装信息(ev_io)所对应的业务处理进程,即文件描述符封装信息的拥有者。作为该拥有者的业务处理进程在得到输入输出事件的数据以后,会等待调度器线程对其进行调度,从而进行相应的处理,例如数据发送、存储等。由于轮询器进程也属于进程,因此即使一直有输入输出事件,轮询器进程也不会一直抢占着调度器线程,当轮询器进程的reduction(表示Erlang虚拟机的软实时调度机制中为进程执行分配的时间片)消耗完时,根据Erlang虚拟机的软实时调度机制,就会强制调度其他业务处理进程运行,从而保证所有进程的公平性。
由此,本申请实施例中的处理设备通过用于处理输入输出事件的轮询器进程,在利用轮询器进程查询到有输入输出事件时,可以利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程,使得同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量不限于一个,提高了输入输出事件的处理效率,从而能够及时处理大量的输入输出事件。
在本方案中,管理套接字结构的数量可以是多个,并且当轮询器进程的数量与调度器线程的数量设置为一致时,可以达到最优效果。例如两者都为N个时,同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量也可以是N个。在实际应用中,也可以允许轮询器进程个数多于erlang虚拟机的调度器线程个数的,目的是通过提升轮询器进程的个数,使所有轮询器进程的总reduction增加,使得轮询器进程的reduction在所有进程的总reduction中的占比增加,从而间接地提高处理输入输出事件的时间占比。
进一步地,作为一种优选的实施方式,本申请实施例还提供了一种优选的输入输出事件的处理设备,该设备的结构如图8所示,除图7所示的信息添加装置710、轮询装置720和回调处理装置730之外,还包括:排队等待装置740、监听装置750、监听处理装置760。具体地,所述排队等待装置740用于在利用轮询器进程查询到无输入输出事件时,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表;所述监听装置750用于唤醒监听线程,利用所述监听线程查询是否有输入输出事件;所述监听处理装置760在利用所述监听线程查询到有输入输出事件时,利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程;所述回调处理装置730还用于在利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程之后,利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构中记录的文件描述符封装信息所对应的业务处理进程。
接上例,作为轮询器进程查询的另一种结果,若轮询器进程在调用evrun()接口进行轮询,发现没有输入输出事件待处理时,轮询器进程会阻塞在接收(receive)原语上,同时挂靠(Attach)在管理套接字结构的通知列表(mon_list)上。该通知列表为一个单向链表,若有多个轮询器进程需要挂靠,均会串在这个链表上。在将轮询器进程挂靠至通知列表后,会将监听线程(watcher)唤醒,利用所述监听线程查询是否有输入输出事件。监听线程在进行查询时,同样调用ev_run()接口轮询事件库是否有输入输出事件需要处理。
优选地,在上述设备中,所述轮询装置720用于利用轮询器进程以非阻塞的方式查询是否有输入输出事件,而所述监听装置750则用于利用所述监听线程以阻塞的方式查询是否有输入输出事件。例如在Erlang虚拟机中,轮询器进程以非阻塞的方式调用evrun(),以确保在无输入输出事件时,轮询器进程可以立即返回,不影响调度器线程调度其它的进程。而监听线程则以阻塞方式调用evrun(),因此在未获得结果(即无输入输出事件)时不会返回,只有在获得结果(即有输入输出事件)时才会返回。因此监听线程在从evrun()返回后,说明有输入输出事件到来,此时会通知挂靠在通知列表上的所有轮询器进程,以保证输入输出事件能够及时处理。在整个处理过程中,轮询器进程和监听线程对evrun()的调用是互斥的,即在同一时刻evrun()要么是由轮询器进程在调用,要么是由监听线程在调用。
在实际应用中,监听线程通过向挂靠在通知列表上的所有轮询器进程发送event消息的方式来唤醒轮询器进程,使其对到来的输入输出事件进行处理,即通过相应的回调函数将输入输出事件的数据发送至事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
作为一种优选的实施方式,由于轮询器进程以非阻塞的方式查询是否有输入输出事件,因此所述轮询装置720在利用轮询器进程查询是否有输入输出事件时,查询的次数可以是多次。其中,具体次数可以根据应用场景的实际需要设定,例如设定5次、10次等。由于轮询器进程以非阻塞的方式调用evrun()进行轮询,若一次调用没有从evrun()返回输入输出事件,则可以继续尝试一定次数的调用,只有在利用轮询器进程多次查询均无输入输出事件,才进行后续的处理。由此,可以减少轮询器进程与监听线程之间切换的次数,降低事件抖动。相应地,上述处理设备中的所述排队等待装置740会在利用轮询器进程多次查询均无输入输出事件时,才将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表。
在实际应用中,若业务处理进程没有与调度器线程进行绑定,会出现两个调度器线程之间的进程相互发送消息的情况,由此导致一个输入输出事件最终需要流经两个系统级线程(即两个调度器线程)才能彻底消费掉,由此导致处理性能降低。为解决该问题,本申请实施例还提供了一种更优选的处理设备,该设备进一步包括一绑定装置。该绑定装置用于在业务处理进程接收数据时,将所述业务处理进程与调度器线程进行绑定。此时,处理一条连接的业务处理进程和对应的套接字(socket)都在一个调度器线程上执行,因此一个输入输出事件的处理不需要线程间的切换即可完成。
若业务处理进程与记录其文件描述符封装信息的管理套接字结构的未绑定在一个调度器线程上也会导致处理性能降低,因此需要通过合理的绑定方式保证业务处理进程与记录其文件描述符封装信息的管理套接字结构的绑定在同一个调度器线程上。因此,在本实施例中,所述绑定装置,具体用于将所述业务处理进程的套接字绑定至管理套接字结构,并将所述管理套接字结构对应的调度器线程的标记信息记录到所述套接字中;以及根据所述业务处理进程的套接字中记录的所述标记信息,将所述业务处理进程绑定至所述标记信息对应的调度器线程。
在实际应用中,由于对业务处理进程进行绑定会导致多个调度器线程间的负载不均衡,因此所述绑定装置将所述业务处理进程的套接字绑定至管理套接字结构之前,还需要根据预设的绑定策略确定待绑定的管理套接字结构,来尽量保证多个调度器线程间的负载能够均衡。
本申请实施例中提供了绑定策略包括但不限于以下两种:轮询或者最小值优先。所述轮询的绑定策略具体为:所有管理套接字结构依次轮流确定为待绑定的管理套接字结构。例如Erlang虚拟机中包含4个管理套接字结构,分别为pollset-1、pollset-2、pollset-3和pollset-4,在第一次进行绑定之前,先pollset-1确定为待绑定的管理套接字结构,在第二至四次进行绑定之前,分别确定pollset-2~pollset-4为待绑定的管理套接字结构,在后续的绑定过程中重复该过程。所述最小值优先的绑定策略具体为:查询所有管理套接字结构的事件循环结构体中已添加的文件描述符封装信息,并将文件描述符封装信息的数量最少的管理套接字结构,确定为待绑定的管理套接字结构。仍以场景为例,pollset-1、pollset-2、pollset-3和pollset-4中当前记录的ev_io的数量分别为2、3、4、3,则会将pollset-1确定为待绑定的管理套接字结构。在此,本领域技术人员应当能够理解上述绑定策略的描述仅为举例,其他现有的或今后可能出现的用于确定待绑定的管理套接字结构的绑定策略如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。
此外,本申请实施例还提供了一种输入输出事件的处理设备,该设备包括:
处理器;
以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;利用轮询器进程查询是否有输入输出事件;若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
综上所述,本申请的技术方案通过用于处理输入输出事件的轮询器进程,在利用轮询器进程查询到有输入输出事件时,可以利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程,使得同一时间能够调度业务处理进程处理输入输出事件的调度器线程的数量不限于一个,提高了输入输出事件的处理效率,从而能够及时处理大量的输入输出事件。此外,在连接建立时,将业务处理进程和对应的调度器线程进行绑定,使得一个输入输出事件的处理不需要线程间的切换即可完成,减少了线程切换,进一步提高了处理的效率。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
Claims (17)
1.一种输入输出事件的处理方法,其中,该方法包括:
当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中,并将所述业务处理进程与调度器线程进行绑定;
利用轮询器进程查询是否有输入输出事件;
若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
2.根据权利要求1所述的方法,其中,利用轮询器进程查询是否有输入输出事件需要处理之后,还包括:
若利用轮询器进程查询到无输入输出事件,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表;
唤醒监听线程,利用所述监听线程查询是否有输入输出事件;
若利用监听线程查询到有输入输出事件,则利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程;
利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
3.根据权利要求1所述的方法,其中,利用轮询器进程查询是否有输入输出事件,包括:
利用轮询器进程以非阻塞的方式查询是否有输入输出事件。
4.根据权利要求3所述的方法,其中,利用轮询器进程查询是否有输入输出事件,包括:
利用轮询器进程查询是否有输入输出事件,其中所述查询的次数为多次;
利用轮询器进程查询是否有输入输出事件需要处理之后,还包括:
若利用轮询器进程多次查询均无输入输出事件,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表;
唤醒监听线程,利用所述监听线程查询是否有输入输出事件;
若利用监听线程查询到有输入输出事件,则利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程;
利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
5.根据权利要求2或4所述的方法,其中,利用所述监听线程查询是否有输入输出事件,包括:
利用所述监听线程以阻塞的方式查询是否有输入输出事件。
6.根据权利要求1所述的方法,其中,将所述业务处理进程与调度器线程进行绑定,包括:
将所述业务处理进程的套接字绑定至管理套接字结构,并将所述管理套接字结构对应的调度器线程的标记信息记录到所述套接字中;
根据所述业务处理进程的套接字中记录的所述标记信息,将所述业务处理进程绑定至所述标记信息对应的调度器线程。
7.根据权利要求6所述的方法,其中,将所述业务处理进程的套接字绑定至管理套接字结构之前,还包括:
根据预设的绑定策略确定待绑定的管理套接字结构。
8.根据权利要求7所述的方法,其中,所述预设的绑定策略包括以下任意一项:
将所有管理套接字结构依次轮流确定为待绑定的管理套接字结构;或
查询所有管理套接字结构的事件循环结构体中已添加的文件描述符封装信息,并将文件描述符封装信息的数量最少的管理套接字结构,确定为待绑定的管理套接字结构。
9.一种输入输出事件的处理设备,其中,该设备包括:
信息添加装置,用于在业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中;
绑定装置,用于在业务处理进程接收数据时,将所述业务处理进程与调度器线程进行绑定;
轮询装置,用于利用轮询器进程查询是否有输入输出事件;
回调处理装置,用于在利用轮询器进程查询到有输入输出事件时,利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
10.根据权利要求9所述的设备,其中,该设备还包括:
排队等待装置,用于在利用轮询器进程查询到无输入输出事件时,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表;
监听装置,用于唤醒监听线程,利用所述监听线程查询是否有输入输出事件;
监听处理装置,在利用所述监听线程查询到有输入输出事件时,利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程;
所述回调处理装置,还用于在利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程之后,利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
11.根据权利要求9所述的设备,其中,所述轮询装置,用于利用轮询器进程以非阻塞的方式查询是否有输入输出事件。
12.根据权利要求11所述的设备,其中,所述轮询装置,用于利用轮询器进程查询是否有输入输出事件,其中所述查询的次数为多次;
该设备还包括:
排队等待装置,用于在利用轮询器进程多次查询均无输入输出事件时,将所述轮询器进程阻塞在接收原语上,并挂靠在管理套接字结构的通知列表;
监听装置,用于唤醒监听线程,利用所述监听线程查询是否有输入输出事件;
监听处理装置,在利用所述监听线程查询到有输入输出事件时,利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程;
所述回调处理装置,还用于在利用所述监听线程唤醒挂靠在所述管理套接字结构的通知列表的轮询器进程之后,利用所述轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
13.根据权利要求10或12所述的设备,其中,所述监听装置,用于利用所述监听线程以阻塞的方式查询是否有输入输出事件。
14.根据权利要求9所述的设备,其中,所述绑定装置,用于将所述业务处理进程的套接字绑定至管理套接字结构,并将所述管理套接字结构对应的调度器线程的标记信息记录到所述套接字中;以及根据所述业务处理进程的套接字中记录的所述标记信息,将所述业务处理进程绑定至所述标记信息对应的调度器线程。
15.根据权利要求14所述的设备,其中,所述绑定装置,还用于在将所述业务处理进程的套接字绑定至管理套接字结构之前,根据预设的绑定策略确定待绑定的管理套接字结构。
16.根据权利要求15所述的设备,其中,所述绑定装置中所述预设的绑定策略包括以下任意一项:
将所有管理套接字结构依次轮流确定为待绑定的管理套接字结构;或
查询所有管理套接字结构的事件循环结构体中已添加的文件描述符封装信息,并将文件描述符封装信息的数量最少的管理套接字结构,确定为待绑定的管理套接字结构。
17.一种输入输出事件的处理设备,其中,该设备包括:
处理器;
以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:当业务处理进程接收数据时,将所述业务处理进程的文件描述符封装信息添加至管理套接字结构的事件循环结构体中,并将所述业务处理进程与调度器线程进行绑定;利用轮询器进程查询是否有输入输出事件;若利用轮询器进程查询到有输入输出事件,则利用轮询器进程将输入输出事件的数据发送至所述事件循环结构体中记录的文件描述符封装信息所对应的业务处理进程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610042065.1A CN106997304B (zh) | 2016-01-22 | 2016-01-22 | 输入输出事件的处理方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610042065.1A CN106997304B (zh) | 2016-01-22 | 2016-01-22 | 输入输出事件的处理方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106997304A CN106997304A (zh) | 2017-08-01 |
CN106997304B true CN106997304B (zh) | 2020-12-04 |
Family
ID=59428841
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610042065.1A Active CN106997304B (zh) | 2016-01-22 | 2016-01-22 | 输入输出事件的处理方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106997304B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181670B (zh) * | 2019-07-02 | 2023-04-11 | 西安诺瓦星云科技股份有限公司 | 进程间通讯方法及装置和Linux设备 |
WO2021217656A1 (zh) * | 2020-04-30 | 2021-11-04 | 深圳中砼物联网科技有限公司 | 快速开发软件的方法、计算机设备、及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101448006A (zh) * | 2008-12-25 | 2009-06-03 | 中兴通讯股份有限公司 | 一种实现流媒体服务器大量终端接入的方法及系统 |
CN102868736A (zh) * | 2012-08-30 | 2013-01-09 | 浪潮(北京)电子信息产业有限公司 | 一种云计算监控框架设计及实现方法及云计算处理设备 |
CN104702534A (zh) * | 2015-03-30 | 2015-06-10 | 无锡天脉聚源传媒科技有限公司 | 一种实现多进程共享端口的数据处理的方法及装置 |
-
2016
- 2016-01-22 CN CN201610042065.1A patent/CN106997304B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101448006A (zh) * | 2008-12-25 | 2009-06-03 | 中兴通讯股份有限公司 | 一种实现流媒体服务器大量终端接入的方法及系统 |
CN102868736A (zh) * | 2012-08-30 | 2013-01-09 | 浪潮(北京)电子信息产业有限公司 | 一种云计算监控框架设计及实现方法及云计算处理设备 |
CN104702534A (zh) * | 2015-03-30 | 2015-06-10 | 无锡天脉聚源传媒科技有限公司 | 一种实现多进程共享端口的数据处理的方法及装置 |
Non-Patent Citations (3)
Title |
---|
Epoll 机制和线程池技术在实弹射击自动报靶;邓玉文 等;《工业控制计算机》;20141231;第27卷(第3期);第46-47页 * |
基于epoll+线程池的服务器性能增强设计技术的研究;朱丹青 等;《武汉工业学院学报》;20130930;第32卷(第3期);第40-42页 * |
红光高清EICS服务器的设计与实现;齐彦鹏;《中国优秀硕士学位论文全文数据库 信息科技辑》;20130815;第I137-27页 * |
Also Published As
Publication number | Publication date |
---|---|
CN106997304A (zh) | 2017-08-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107479990A (zh) | 一种分布式软件服务系统 | |
WO2017016421A1 (zh) | 一种集群中的任务执行方法及装置 | |
US20080263554A1 (en) | Method and System for Scheduling User-Level I/O Threads | |
US20220283953A1 (en) | Method and system for low latency data management | |
EP3489815B1 (en) | Method and system for low latency data management | |
CN102915254A (zh) | 任务管理方法及装置 | |
CN107818012B (zh) | 一种数据处理方法、装置及电子设备 | |
CN107783842B (zh) | 一种分布式锁实现方法、设备及存储装置 | |
WO2021093365A1 (zh) | 一种gpu显存管理控制方法及相关装置 | |
US20160127382A1 (en) | Determining variable wait time in an asynchronous call-back system based on calculated average sub-queue wait time | |
WO2020119307A1 (zh) | 一种基于dsp的任务调度方法及装置 | |
WO2024016596A1 (zh) | 容器集群调度的方法、装置、设备及存储介质 | |
CN113641410A (zh) | 一种基于Netty的高性能网关系统的处理方法及系统 | |
WO2023011249A1 (zh) | Io多路复用方法、介质、设备和操作系统 | |
CN106997304B (zh) | 输入输出事件的处理方法及设备 | |
CN115617527A (zh) | 线程池的管理方法、配置方法、管理装置和配置装置 | |
US11144359B1 (en) | Managing sandbox reuse in an on-demand code execution system | |
CN112860387A (zh) | 分布式任务调度方法、装置、计算机设备及存储介质 | |
CN109388501B (zh) | 基于人脸识别请求的通信匹配方法、装置、设备及介质 | |
CN115878301A (zh) | 一种数据库网络负载性能的加速框架、加速方法及设备 | |
CN111309494A (zh) | 一种多线程事件处理组件 | |
CN111913792A (zh) | 一种业务处理方法和装置 | |
CN111552547A (zh) | 作业处理方法、装置以及计算机设备 | |
CN112416414A (zh) | 一种基于状态机的微服务架构容器化轻量级工作流系统 | |
CN110399206B (zh) | 一种基于云计算环境下idc虚拟化调度节能系统 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |