CN117407183A - 线程间通信的方法及电子设备 - Google Patents

线程间通信的方法及电子设备 Download PDF

Info

Publication number
CN117407183A
CN117407183A CN202211164272.6A CN202211164272A CN117407183A CN 117407183 A CN117407183 A CN 117407183A CN 202211164272 A CN202211164272 A CN 202211164272A CN 117407183 A CN117407183 A CN 117407183A
Authority
CN
China
Prior art keywords
thread
interrupt
interrupt event
data
processed
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.)
Pending
Application number
CN202211164272.6A
Other languages
English (en)
Inventor
廖畅
张建华
郭寒军
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202211164272.6A priority Critical patent/CN117407183A/zh
Publication of CN117407183A publication Critical patent/CN117407183A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication

Abstract

提供一种线程间通信的方法及电子设备,涉及终端技术领域。该方法可以基于硬件中断通知服务线程处理数据,并且将硬件中断控制器的硬件地址映射到客户线程的用户态地址空间。每当客户线程有数据要进行处理时,客户线程可以在用户态直接触发中断事件,中断事件会通知对应的服务线程,服务线程处理中断事件时会在用户态直接对待处理的数据进行处理,而无需在内核态进行处理,从而可以减小线程间通信的时延。

Description

线程间通信的方法及电子设备
技术领域
本申请涉及终端技术领域,尤其涉及一种线程间通信的方法及电子设备。
背景技术
目前,在电子设备中,一个应用程序通常可以将一个任务切分成多个小任务(例如进程、线程等),并将多个小任务分发到多个中央处理器上运算。这样,既能减小处理任务的时延,也能提高处理数据的吞吐量。
在多个中央处理器分别处理进程、线程时,各进程之间、线程之间也可以进行通信,从而完成一些进程间的任务或者线程间的任务。并且,电子设备的操作系统也可以为进程间或者线程间的通信提供多种通信机制。然而,目前的多种通信机制,都存在着通信过程时延较大的问题。
发明内容
本申请实施例提供一种线程间通信的方法及电子设备,在客户线程有数据要处理时,客户线程能够在用户态直接触发中断事件,使服务线程及时处理待处理的数据。并且服务线程也可以在用户态处理数据。这样,无需依赖操作系统内核来实现中断事件的触发和中断事件的通知等,从而减小线程间通信的时延。
为达到上述目的,本申请的实施例采用如下技术方案:
第一方面,提供一种线程间通信的方法,还方法可以应用于电子设备,电子设备包括中断控制器、客户线程和服务线程。该方法中,客户线程发起数据处理请求时,在用户态基于客户线程对应的用户态地址触发中断事件。其中,用户态地址与中断控制器的硬件地址之间具有映射关系。响应于中断事件,中断事件对应的目标服务线程在用户态获取待处理数据,并处理待处理数据。
该方法可以基于硬件中断通知服务线程处理数据,并且将硬件中断控制器的硬件地址映射到客户线程的用户态地址空间。每当客户线程有数据要进行处理时,客户线程可以在用户态直接触发中断事件,中断事件会通知对应的服务线程,服务线程处理中断事件时会在用户态直接对待处理的数据进行处理,而无需在内核态进行处理。
在第一方面的一种可实现方式中,客户线程还可以将待处理数据,保存在客户线程和服务线程的共享内存中。采用共享内存的方式保存待处理的数据,客户线程触发中断事件后,会将待处理的数据保存在共享内存中,服务线程处理中断事件时会直接从共享内存中读取待处理的数据。可见,客户线程和服务线程都能访问共享内存获取到数据,从而实现通过零拷贝数据进行数据处理的目的,可以适用于大数据传输与处理的场景。
在第一方面的一种可实现方式中,电子设备上保存有中断事件与其对应的目标处理器之间的关联关系。若目标服务线程响应于中断事件被唤醒,则目标服务线程在中断事件对应的目标处理器上运行。这种实现方式中,通过中断事件与其对应的目标处理器之间的关联关系确定中断事件对应的目标处理器,从而在该处理器上产生中断事件。这样的方式可以改善采用IPC路由过程而造成的时延的问题。
在第一方面的一种可实现方式中,若中断事件被触发时,目标服务线程当前未在目标处理器上运行,则更新中断事件与目标处理器之间的关联关系。其中,更新后的关联关系中目标处理器表示当前正在运行目标服务线程的处理器。当中断事件再次被触发时,可以根据更新后的关联关系快速定位到处理中断事件的目标处理和目标服务线程,从而使目标服务线程快速处理中断事件。这样的方式也无需经过电子设备操作系统的内核进行IPC路由等操作,可以改善采用IPC路由过程而造成的时延的问题。
在第一方面的一种可实现方式中,目标服务线程在内核态被注入中断事件对应的回调函数,以及目标服务线程在用户态通过执行回调函数从共享内存中获取待处理数据。这种实现方式中,目标服务线程在执行回调函数时回到用户态,从而实现在用户态进行中断事件处理的目的。
在第一方面的一种可实现方式中,在客户线程保存待处理数据之后,回调函数对应的栈帧指针指向共享内存中待处理数据的地址。从而,目标服务线程在执行回调函数时,回调函数可以在栈帧指针指向的地址中获取到待处理数据。
在第一方面的一种可实现方式中,若中断事件被触发时,目标服务线程当前正在运行,则目标服务线程被打断并在内核态被注入回调函数;或者,若中断事件被触发时,目标服务线程当前未运行,则目标服务线程被唤醒并在内核态被注入回调函数。可见,无论被调用的目标服务线程当前处于运行状态还是未运行状态,在中断事件被触发之后,目标服务线程都会被注入回调函数并执行该回调函数,从而实现快速处理中断事件的目的。
在第一方面的一种可实现方式中,在客户线程发起数据处理请求之前,多个服务线程还可以分别注册对应的中断事件。经过注册之后,中断事件的硬件中断号与注册中断事件的服务线程的线程号之间具有映射关系,以及硬件中断号与线程号之间的映射关系保存在进程间通信处理信息中。从而中断事件被触发后,可以根据进程间通信处理信息快速地确定对应的目标服务线程。
在第一方面的一种可实现方式中,经过注册之后,中断事件被配置对应的回调函数,以及中断事件的硬件中断号被配置对应的虚拟中断号;中断事件的硬件中断号与回调函数相关联,回调函数通过虚拟中断号获取待处理数据。
在第一方面的一种可实现方式中,若目标服务线程具有待处理中断标记,则目标服务线程在内核态被注入中断事件对应的回调函数。这种实现方式中,待处理中断标记表示目标服务线程有待处理的中断事件。
在第一方面的一种可实现方式中,电子设备在目标服务线程在被注入回调函数之后,删除待处理中断标记。从而表示目标服务线程处理完当前的中断事件后就没有其他的中断事件要处理,可以被继续处理其他的中断事件。
在第一方面的一种可实现方式中,在中断事件被触发后,目标服务线程被设置防嵌套标记。这种实现方式中,防嵌套标记表示禁止目标服务线程在处理中断事件时被注入其他中断事件对应的回调函数,从而避免目标服务线程在处理中断事件时被其他的中断事件打断,保证目标服务线程能完整处理一个中断事件。
在第一方面的一种可实现方式中,电子设备在目标服务线程在处理完待处理数据之后,删除防嵌套标记。
在第一方面的一种可实现方式中,电子设备在目标服务线程在执行完回调函数之后,卸载回调函数,以便使目标服务线程恢复到原执行流继续运行。
在第一方面的一种可实现方式中,服务线程可以通过第一调用函数注册对应的中断事件。
在第一方面的一种可实现方式中,服务线程可以通过第二调用函数放弃当前占用的处理器,等待被中断事件唤醒。
在第一方面的一种可实现方式中,电子设备可以用过第三调用函数从目标服务线程中卸载回调函数。
第二方面,提供一种电子设备,电子设备包括存储器、一个或多个处理器;存储器与处理器耦合;其中,存储器中存储有计算机程序代码,计算机程序代码包括计算机指令,当计算机指令被处理器执行时,使得电子设备执行如第一方面任一实现方式中的线程间通信的方法。
第三方面,提供一种计算机可读存储介质,包括计算机指令,当计算机指令在电子设备上运行时,使得电子设备执行如第一方面任一实现方式中的线程间通信的方法。
第四方面,提供一种计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行如第一方面任一实现方式中的线程间通信的方法。
可以理解地,上述提供的第二方面所述的电子设备,第三方面所述的计算机可读存储介质,第四方面所述的计算机程序产品所能达到的有益效果,可参考第一方面及其任一种可能的设计方式中的有益效果,此处不再赘述。
附图说明
图1为本申请实施例示出的一种无通知功能的进程间通信的示意图;
图2为本申请实施例示出的一种有通知功能的进程间通信的示意图;
图3为本申请实施例示出的一种进程间直接通信的示意图;
图4为本申请实施例示出的一种电子设备的系统架构示意图;
图5为本申请实施例示出的一种中断注册模块的功能示意图;
图6为本申请实施例示出的一种中断路由模块的功能示意图;
图7为本申请实施例示出的一种中断处理模块的功能示意图;
图8为本申请实施例示出的一种中断注入模块的功能示意图;
图9为本申请实施例示出的一种内存映射模块的功能示意图;
图10为本申请实施例示出的一种线程通信的方法示意图;
图11为本申请实施例示出的一种用户态工作线程与用户态网络协议栈之间的通信示意图;
图12为本申请实施例示出的一种协议栈线程收包过程的示意图;
图13为本申请实施例示出的一种协议栈线程发包过程的示意图;
图14为本申请实施例示出的一种电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。其中,在本申请的描述中,除非另有说明,“/”表示前后关联的对象是一种“或”的关系,例如,A/B可以表示A或B;本申请中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况,其中A,B可以是单数或者复数。并且,在本申请的描述中,除非另有说明,“多个”是指两个或多于两个。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,或a-b-c,其中a,b,c可以是单个,也可以是多个。另外,为了便于清楚描述本申请实施例的技术方案,在本申请的实施例中,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。同时,在本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念,便于理解。
此外,本申请实施例描述的业务场景是为了更加清楚的说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定,本领域普通技术人员可知,随着新业务场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
为了更好的理解本申请的方案,以下介绍本申请实施例所涉及的术语:
(1)中央处理器(central processing unit,CPU)特权级
目前,通用芯片都会支持用户态和内核态两种CPU特权级。在不同CPU特权级下运行着各种软件系统。这些软件系统对底层硬件有不同的访问权限,例如,运行在内核态下的操作系统(operating system,OS)能直接操作打印机和网卡;运行在用户态下的程序依靠操作系统操作硬件设备,比如文本编辑器打印文件、网页浏览器访问互联网等。
当一个任务(例如进程、线程等)因执行系统调用而陷入内核代码中执行时,该任务可以被称为处于内核运行态(或简称为内核态)。而当一个任务在执行非内核代码(例如应用程序代码)时,该任务可以被称为处于用户运行态(或简称为用户态)。
(2)内核
内核是操作系统的内部核心程序,它向外部提供了对计算机等设备的核心管理调用。内核所在的地址空间称为内核空间。
(3)中断事件
中断事件是一种由硬件触发的事件,该事件发生时将打断CPU当前的执行流,并使CPU执行新的执行流。其中,执行流表示CPU上执行的代码流、指令流等。执行流可以由CPU上的进程、线程等运行。
(4)线程
线程是操作系统用来执行业务程序和进行调度的最小单位。一条线程指的是一个单一顺序的执行流。
(5)线程上下文
线程执行每条指令都对应一组通用寄存器(general purpose register,GPR)值,这些GPR值就形成了线程运行状态的快照。当线程的执行流被中断事件打断后,操作系统将打断时的GPR值保存在内存里。以便线程处理完中断事件后,恢复原来的执行流继续执行。
(6)线程调度
当操作系统中运行的线程数量超过CPU核心数量时,操作系统就会定期选择一个线程放到CPU上运行,其他线程就暂停运行,这个过程就是线程调度。
(7)线程迁移
在多CPU的操作系统里,当CPU的工作负载过重,操作系统会将该CPU运行队列里的任务迁移到其他CPU的运行队列里,由其他CPU运行,这个过程就是线程迁移。
近年来,随着芯片制造技术的发展,一台计算机里集成的CPU数量越来越多。应用程序为了挖掘这些CPU的并行计算能力,大多数也从单线程执行演化成多线程执行。通过多线程化,应用程序可以将一个任务切分成多个小任务(例如进程、线程等),并将多个小任务分发到多个CPU上运算。这种多CPU+多线程化的好处是:(1)减小时延,例如,一台计算机可以用更少的时间完成同样规模的业务;(2)提高吞吐量,例如,一台计算机可以在单位时间内完成更多的业务。
但是,应用程序的多条进程、线程之间也需要通信。通常,线程间的通信都发生在一条客户(Client)线程和一条服务(Server)线程间。其中,Client线程表示在通信时发起数据处理请求的线程,而Server线程表示在通信时响应于数据处理请求对Client线程提供的数据进行处理的线程。在通信时,Client线程将数据传递给Server线程,Server线程接收这些数据并处理。操作系统可以提供多种进程间通信(inter process communication,IPC)机制,例如共享内存(shared memory)、信号(Signal)、有名管道(named pipe)、事件文件(Eventfd)、套接字(Socket)、多路事件等待机制(Epoll)等。这些IPC机制各有特点,但大致上分为两种类型:无通知功能的IPC和有通知功能的IPC。
如图1所示,基于无通知功能的IPC机制进行线程间通信时,Client线程先将待处理的数据准备好,并将数据和Server线程编号一并存入数据缓存区。由于Client线程不会通知Server线程数据已经准备好,因此,Server线程需要通过轮询的方式从数据缓存区中获取Server线程编号和待处理的数据。当Server线程编号和当前发起轮询的Server线程相匹配时,Server线程才会开始处理对应的待处理数据。
在图1所示的线程间通信过程中,Server线程依靠轮询的方式并不能及时地发现待处理的数据,很可能造成Server线程响应不及时的问题,从而增加IPC的时延。
如图2所示,基于有通知功能的IPC机制进行线程间通信时,Client线程准备好数据后,会将待处理的数据和Server线程编号一并存入数据缓存区。之后,Client线程再通过操作系统通知Server线程数据已备好,从而使Server线程对待处理数据进行处理。在此过程中,首先,操作系统的内核会通过负载均衡算法选择运行Server线程的CPU,并将对应的Server线程加入到任务队列中。然后,内核通过轮询任务队列的方式确定出将要执行任务的Server线程以及待处理的数据。最后,由确定出的Server线程对待处理的数据进行处理。
在图2所示的线程间通信过程中,可以组合几种IPC机制来实现一个高效和功能丰富的IPC方案。例如,共享内存+事件文件+多路事件等待机制。Client线程通过共享内存机制将数据传递给Server线程。Server线程通过多路事件等待机制等待Client线程的通知,数据传递完毕后,Client线程通过事件文件机制通知Server线程,并且需通过内核进行通知。
可见,上述图2这套IPC方案利用内核做通信中继,IPC的主要环节(例如,发起,路由和响应等)都依赖内核。Client线程要依靠内核给Server线程发通知,Server线程也要定期陷入内核查询通知,这样依靠内核进行通信的方式,同样无法使Server线程及时处理数据,从而增加IPC响应的耗时。再有,内核要利用负载均衡算法来挑选一个CPU执行Server线程,会增加IPC路由过程的时延。另外,内核要利用调度器安排Server线程上线运行的时机,当系统负载较大时,上线时机不可预测性,这样也会增加IPC调度过程的时延。
在目前的一些IPC方案中,可以通过简化IPC的处理逻辑来减小IPC时延,或者在硬件方面进行改进从而减小IPC时延。
示例性的,参见图3,通过简化IPC的处理逻辑来减小IPC时延时,可以采用一种进程间直接切换的方案。这种方案是一种纯软件方案,可以通过内核进行IPC处理。其中,内核可以针对性地将IPC的处理逻辑进行最简化,只包含必要的阶段。在执行进程调用的时候,内核跳过进程调度阶段,将进程直接切换到对应的上下文中执行。这种方案可以在被调用者处于准备状态时,简单有效地避免内核调度带来的不确定的延时。然而,该方案仍然需要内核干预来完成上下文切换,依然存在增加IPC时延的问题。并且,该方案需要通过拷贝的方式来传输数据,并不适合大数据传输的应用场景。此外,如果调用者和被调用者被运行在不同的核上,那么需要通过核间中断等方式来通知被调用者运行,这样也会增加IPC时延。
再示例性的,在硬件方面进行改进来减小IPC时延时,可以采用一种硬件协同方案。这套方案首先设计了一套跨进程调用的硬件架构,并且基于该架构提出了对应的软件设计方案。该方法在底层硬件中对于上下文切换以及快速数据传输均提供了支持。这样由硬件支持的跨进程调用的上下文切换原语的方案,可以实现类似于函数调用的上下文切换方式,从而减小内核干预上下文切换而造成的IPC的时延。并且,硬件支持零拷贝数据传输机制,可以减小数据拷贝传输而造成的IPC时延。然而,该方案需要对CPU内的内存管理单元(memory management unit,MMU)模块等做较大修改,硬件部分实现起来的难度较大。
由上述内容可知,目前的IPC方案中,都存在着增加IPC时延的问题,或者存在着硬件上难以实现的问题。
基于上述内容,本申请实施例提供了一种线程间通信的方法,该方法可以基于硬件中断通知Server线程处理数据,并且将硬件中断控制器的硬件地址映射到Client线程的用户态地址空间。每当Client线程有数据要进行处理时,Client线程可以在用户态直接触发中断事件,中断事件会通知对应的Server线程,Server线程处理中断事件时会在用户态直接对待处理的数据进行处理,而无需在内核态进行处理。
由于硬件中断具有异步性、通知性和及时性,每当Client线程有数据需要处理时,Server线程能及时地响应并处理,并且,Client线程可以在用户态触发中断事件,Server线程也可以在用户态处理中断事件,无需依赖内核进行通知,从而可以减小线程间通信的时延。再有,通过中断事件对应的CPU关联关系(例如CPU亲和性)可以直接确定运行Server线程CPU,从而在该CPU上产生中断,此后,在该CPU上运行的Server线程可以开始处理待处理的数据,直至处理完毕。这样的方式可以改善采用IPC路由过程而造成的时延的问题,并且当中断事件被触发时,CPU会改变线程当前的执行流优先处理中断事件。
另外,上述方法采用共享内存的方式保存待处理的数据,Client线程触发中断事件后,会将待处理的数据保存在共享内存中,Server线程处理中断事件时会直接从共享内存中读取待处理的数据。可见,Client线程和Server线程都能访问共享内存获取到数据,从而实现通过零拷贝数据进行数据处理的目的,可以适用于大数据传输与处理的场景。
本申请实施例中的线程间通信的方法,可以应用于包括中断控制器以及一个或多个CPU的电子设备上,例如计算机、笔记本电脑、服务器、手机、平板电脑等。
以上述电子设备是计算机为例,参见图4,该电子设备可以包括应用层、用户态层、内核态层和硬件层。
其中,应用层可以包括依赖IPC的多种应用程序。例如,使用管道(Pipe)、信号(Signal)、快速用户空间互斥(fast userspace mutex,Futex)等机制进行通信的应用程序(简称为应用1、应用2、应用N等)。
在一些实施例中,触发中断事件的Client线程和被调用的Server线程可以来自于应用层中的应用程序。
用户态层可以包括IPC调用接口模块和内存映射模块。这两个模块会提供应用程序所需的通信接口,并将中断控制器的内存映射输入/输出(memory-mapped I/O,MMIO)寄存器文件映射到用户态地址,从而将中断控制器的硬件地址映射到触发中断事件的线程的用户态地址空间。并且,IPC调用接口模块和内存映射模块还会提供和共享内存类似的使用接口。
在一些实施例中,IPC调用接口模块和内存映射模块也能使应用层中的Client线程和Server线程在用户态完成中断事件的处理。
内核态层可以包括中断注册模块、中断路由模块、中断处理模块和中断注入模块。其中,中断注册模块用于为被调用的Server线程注册对应的中断事件和回调函数。中断路由模块用于在中断事件被触发后确定出处理中断事件的目标CPU。中断处理模块用于响应中断事件并使中断事件对应的目标Server线程处理中断事件,以及目标Server线程运行在目标CPU上。中断注入模块用于为目标Server线程在内核态注入中断事件对应的回调函数,目标Server线程在返回用户态时立即通过该回调函数获取到中断事件对应的待处理的数据,并处理该数据。其中,中断事件对应的待处理数据即为触发中断事件的Client线程所提供的数据。
内核态层中的上述中断注册模块、中断路由模块、中断处理模块和中断注入模块所能实现的功能也可以看作是操作系统的内核所能实现的功能。
硬件层可以包括作为硬件结构的中断控制器(generic interrupt controller,GIC)。其中,中断控制器可以产生硬件中断,即中断事件,并传递与中断事件对应的待处理的IPC数据(例如待处理数据)。
本申请实施例中,中断事件的作用是使Server线程及时处理IPC数据,并且,Server线程处理IPC数据的过程,也可以看作是Server线程处理中断事件的过程。中断事件由Server线程注册,由Client线程触发。
在一些实施例中,参见图5,Server线程注册中断事件时,上述中断注册模块可以实现如下几种功能:
(1)查询可用中断号:中断注册模块通过查询中断控制器,获取一个未被占用的中断事件的硬件中断号。
(2)绑定虚拟中断号:中断注册模块为中断事件的硬件中断号分配一个虚拟中断号。其中,虚拟中断号可以作为中断事件的回调函数的参数,Server线程通过回调函数可以获取中断事件对应的待处理数据,并且回调函数可以根据中断事件的虚拟中断号获取到中断事件对应的待处理数据时。
本申请实施例中,硬件中断号由硬件结构提供或者使用,虚拟中断号由操作系统中的软件、内核、进程、线程等提供或者使用。
(3)绑定回调函数:中断注册模块为中断事件的硬件中断号绑定回调函数,或者设置回调函数,即一个中断事件可以对应一个回调函数。其中,回调函数是用户态回调函数,Server线程在处理中断事件时,可以在用户态执行该中断事件对应的回调函数,从而在用户态获得待处理数据并进行处理。
(4)绑定当前线程号:中断注册模块为中断事件的硬件中断号绑定线程号,其中,线程号可以表示注册中断事件的Server线程的线程号,即一个中断事件可以对应一个Server线程。当中断事件被触发时,可以由中断事件对应的目标Server线程对该中断事件进行处理。
绑定线程号的过程中,还可以通过中断控制器设置中断事件的CPU亲和性,从而在中断事件被触发后,可以根据中断事件的CPU亲和性确定对应的目标CPU,以及在目标CPU上运行中断事件对应的目标Server线程以处理待处理数据。其中,中断事件的CPU亲和性可以表示中断事件与对应的CPU之间的关联关系、对应关系等,通常一个中断事件可以对应一个CPU。在一些实施中,可以通过中断事件的硬件中断号与目标CPU的CPU编号之间的映射关系等表示中断事件的CPU亲和性。
当中断事件对应的目标Server线程当前未在中断事件对应的目标CPU上运行时,中断控制器还可以更新中断事件对应的CPU亲和性,将正在运行目标Server线程的CPU更新为目标CPU。
当中断事件对应的目标Server线程当前未运行时,则可以将目标Server线程唤醒,并控制目标Server线程在中断事件对应的目标CPU上运行。
由上述几种功能可知,中断事件经过注册后,一个中断事件对应一个回调函数、一个目标Server线程和一个目标CPU,并且目标Server线程运行在目标CPU上。并且,中断事件与其对应的目标Server线程之间具有映射关系,中断事件的硬件中断号与中断事件对应的目标Server线程的线程号之间也具有映射关系。
在一些实施例中,还可以在内核态层里引入包括上述映射关系的IPC处理信息,例如IPC处理表(IPC process table)等,该表中可以包含以下字段:分配给Server线程的硬件中断号、处理IPC数据的Server线程号、处理IPC数据的回调函数和回调函数对应的栈帧指针等。上述中断注册模块可以通过IPC处理表在Server线程号和中断事件的硬件中断号之间建立一对一的映射关系。即,通过IPC处理表可以根据Server线程确定对应的中断事件,也可以根据中断事件确定对应的Server线程。
本申请实施例中,作为被调用(或者称为IPC接收端)的Server线程可以发起中断事件的注册过程,并且由上述中断注册模块来实现具体的注册过程。
除了上述几种关键功能外,在一些实施例中,还可以引入一个第一调用函数作为中断注册模块的用户态编程接口,例如系统调用:bind_uirq。该第一调用函数由Server线程发起,接收两个参数分别是:回调函数和回调函数对应的栈帧指针。其中,回调函数可以根据中断事件的虚拟中断号获取待处理的数据。栈帧指针指向内存区块,并将该内存区块将作为执行回调函数时的栈帧,该内存区块可以保存回调函数对应的中断事件的待处理数据。内存区块表示一个独立的内存空间,待处理的数据由Client线程存入该内存空间,再由Server线程执行上述回调函数,从该内存空间中读取待处理的数据,从而实现数据的零拷贝的目的。当Server线程发起上述第一调用函数后,可以使内核态层中的中断注册模块实现上述的功能,即Server线程可以通过上述第一调用函数注册中断事件。当上述第一调用函数成功执行时,表明完成中断事件的注册,则上述第一调用函数会给Server线程返回一个中断事件的虚拟中断号。
在一些实施例中,在中断事件被触发后,上述中断路由模块可以通过中断控制器提供的中断事件的CPU亲和性接口来追踪处理中断事件的目标CPU,即追踪运行目标Server线程的目标CPU。在另一些实施例中,参见图6,如果目标CPU上未运行目标Server线程,则说明目标Server线程被迁移到新的CPU上运行,此时,需要通过中断控制器的编程接口去更新中断事件的CPU亲和性,将中断事件的路由目标设置成目标Server线程迁移后的新的CPU,即将中断事件与新的CPU的CPU编号相关联或者相对应等。
在一些实施例中,参见图7,在目标Server线程响应中断事件开始处理中断事件时,上述中断处理模块可以实现如下几种功能:
(1)查询IPC处理表:中断处理模块从中断控制器读取被触发的中断事件(即待处理的中断事件)的硬件中断号,然后去查询IPC处理表中是否存在对应的硬件中断号。如果可以查询到,就意味着该中断事件是一个可以用于处理IPC数据的中断事件,应该由Server线程在用户态处理进行处理。
(2)设置服务线程的待处理中断标记:中断处理模块设置目标Server线程对应的待处理中断标记(Pending UIRQ)。由于被调用的目标Server线程可能已经被调度出去处理其他的数据或者事件,并不能及时处理IPC数据,为其配置待处理中断标记,可以使目标Server线程被唤醒或者中断当前执行流后,能及时地处理对应的中断事件或者IPC数据。
(3)检测服务线程的运行状态:中断处理模块检测目标Server线程被调用时的运行状态。如果目标Server线程正在运行执行流,则可以打断目标Server线程运行的执行流并通过本申请实施例中的中断注入模块实现目标Server线程快速处理IPC数据的目的。如果目标Server线程未在运行,则中断处理模块要主动唤醒目标Server线程,当目标Server线程被调入中断事件对应的目标CPU后,可以通过本申请实施例中的中断注入模块实现目标Server线程快速处理IPC数据的目的。
在一些实施例中,为了平衡响应时延和系统吞吐量,Server线程在处理完关键业务后会主动放弃CPU,避免CPU空转耗能,从而Server线程会处于未运行状态,当需要Server线程再次运行时,需要将其唤醒。
除了上述几个关键功能外,在一些实施例中,还可以引入一个第二调用函数作为用户态编程接口,例如系统调用:wait_uirq。Server线程可以调用该第二调用函数放弃CPU,同时会监听所有通过上述第一调用函数注册的虚拟中断号,等待被虚拟中断号对应的中断事件唤醒。
当Server线程注册的中断事件被Client线程触发时,Server线程的执行流将被立即打断,开始处理中断事件,即处理待处理的IPC数据。并且,在中断事件被触发之后,上述中断处理模块也会及时通知被调用的Server线程处理IPC数据。
在一些实施例中,参见图8,在目标Server线程响应中断事件处理中断事件时,上述中断注入模块可以实现如下几种功能:
(1)检测服务线程的待处理中断标记:目标Server线程当前的执行流被打断时,中断注入模块可以检测目标Server线程的待处理中断标记。
(2)保存原用户态上下文:如果目标Server线程设置了待处理中断标记,说明目标Server线程有待处理的中断事件或者IPC数据需要处理。此时,中断注入模块就可以往目标Server线程中注入中断事件对应的回调函数。目标Server线程在处理中断事件时,可以在用户态执行回调函数并通过回调函数获取到待处理的IPC数据。
并且,为了不破坏目标Server线程原有的执行流,中断注入模块还可以在内核态层保存原有执行流的用户态上下文,从而使目标Server线程处理完中断事件后能继续运行原有的执行流。
(3)替换新用户态上下文:在注入回调函数后,中断注入模块还可以将目标Server线程当前的用户态上下文里回调函数指针PC和栈帧指针SP设置成回调函数地址和待处理的IPC数据的地址。回调函数指针和栈帧指针通过上述第一调用函数注册到内核态层的IPC处理表中。
替换新用户态上下文后,目标Server线程就可以回调函数指针执行回调函数,以及根据栈帧指针获得待处理的IPC数据。
(4)设置防嵌套标记:为了避免中断注入模块反复往用户态层安装中断事件对应的回调函数,即为了避免在目标Server线程的执行流里注入回调函数,本申请实施例中可以在目标Server线程里引入一个防嵌套标记(Injected)。并且,在中断事件被触发后以及在目标Server线程开始执行回调函数前,要设置该标记。从而避免目标Server线程在处理中断事件时被其他的中断事件打断而再次被注入其他中断事件对应的回调函数,保证目标Server线程能完整处理一个中断事件。
(5)删除服务线程的待处理中断标记:因为在目标Server线程的执行流将被立即打断后,中断注入模块开始向目标Server线程的执行流注入回调函数,注入后,目标Server线程在处理中断事件时就可以执行回调函数。那么在注入回调函数后,就可以删除目标Server线程的待处理中断标记,从而表示目标Server线程处理完当前的中断事件后就没有其他的中断事件要处理,可以被继续处理其他的中断事件。
(6)恢复原用户态上下文:当目标Server线程的回调函数执行完毕后,中断注入模块会在目标Server线程执行流里卸载该回调函数,以便使目标Server线程恢复到原执行流继续运行。
(7)删除防嵌套标记:因为回调函数已经执行完毕,也就不存在反复注入中断的问题,那么中断注入模块也会在回调函数执行完毕后,删除目标Server线程的防嵌套标记。或者,中断注入模块也可以在目标Server线程处理完待处理的IPC数据后,删除目标Server线程的防嵌套标记。
除了上述的几个关键功能外,在一些实施例中,还可以引入一个第三调用函数作为用户态编程接口,例如系统调用:uirq_exit。中断注入模块通过该第三调用函数从目标Server线程的执行流里卸载回调函数。
上述内容中,为了让目标Server线程尽快开始处理IPC数据,上述中断注入模块往目标Server线程的执行流里注入回调函数。
在一些实施例中,在中断事件被触发时,如果中断事件对应的目标Server线程当前正在运行,那么目标Server线程运行的执行流会被打断,并且中断注入模块会向目标Server线程的执行流里注入回调函数。这样,无论目标Server线程在哪一个CPU上运行,本申请实施例中的方法都可以对目标Server线程进行打断,并注入回调函数。
在另一些实施例中,在中断事件被触发时,如果中断事件对应的目标Server线程当前未在运行,那么目标Server线程会被唤醒并被调度到中断事件对应的目标CPU上,中断注入模块会向目标Server线程的执行流里注入回调函数。
当目标Server线程开始处理中断事件后,可以直接执行回调函数,获取待处理的IPC数据并处理该数据。
在一些实施例中,参见图9,因为Client线程触发的中断事件是由Server线程来响应的,所以Server线程调用bind_uirq系统调用来注册中断事件时,会在文件系统里生成与中断事件对应的虚拟的MMIO寄存器文件。上述内存映射模块可以将中断控制器的硬件地址映射到Client线程的用户态地址的地址空间,其中,硬件地址与用户态地址之间的映射关系可以保存在MMIO寄存器文件中,即将中断控制器的硬件地址以MMIO寄存器文件的形式暴露到用户态。从而Client线程可以在用户态基于Client线程对应的用户态地址触发中断事件。示例性的,Client线程可以在用户态访问MMIO寄存器文件,由于MMIO寄存器文件中包括硬件地址与用户态地址之间的映射关系,因此通过映射关系可以将Client线程发起的数据处理请求或者控制信号等发送给硬件地址,从而控制中断控制器产生中断事件,实现触发中断事件的目的。
在一些实施例中,中断控制器还可以为中断事件的触发提供接口,并且这些接口可以是中断控制器的MMIO寄存器的编程接口。这种情况下,MMIO寄存器文件中可以保存硬件接口和用户态地址之间的映射关系等。
Client线程通过该MMIO寄存器文件触发的中断事件就只会通知到注册MMIO寄存器文件的目标Server线程上。Client线程在用户态可以直接控制中断控制器触发中断事件。这样在用户态直接触发中断事件的操作,无需依赖内核来通知目标Server线程处理中断事件,进一步改善了IPC发起环节的性能。
其中,内存映射模块可以利用操作系统内核的用户态设备输入输出(UIO)编程接口访问中断控制器的MMIO寄存器,从而实现将中断控制器的硬件地址映射到用户态地址的目的。
在一些实施例中,上述IPC调用接口模块可以为中断事件的触发提供接口。并且,IPC调用接口模块利用不同硬件平台上MMIO寄存器的编程接口来触发对应的中断事件,比如在ARM GIC上,IPC调用接口模块只需要往一个无符号32位整性指针里写入一个非零值即可触发中断事件。
基于上述图4所示的电子设备实现本申请实施例提供的线程间通信的方法时,参见图10,可以包括如下步骤S11-S13。
S11、电子设备中的Server线程注册中断事件。
其中,Server线程注册中断事件可以通过内核态层中的中断注册模块来实现。并且如果电子设备中存在多个Server线程,那么每个Server线程都可以对应注册一个中断事件。
注册中断事件的过程中,中断注册模块为中断事件的硬件中断号分配虚拟中断号,并为硬件中断号绑定对应的回调函数。其中,每个中断事件对应一个回调函数,中断事件的虚拟中断号可以作为回调函数的参数。回调函数可以根据中断事件的虚拟中断号获取到中断事件对应的待处理数据。
另外,中断事件的硬件中断号与注册中断事件的Server线程的线程号具有映射关系。从而当中断事件被触发时,可以根据中断事件的硬件中断号找到处理中断事件的线程号,根据线程号确定对应的目标Server线程。中断注册模块还可以将被注册的中断事件的硬件中断号和对应的线程号都保存在IPC处理信息(例如IPC表)中,以便查找。
以及,Server线程在注册中断事件时,可以由内存映射模块将中断控制器的硬件地址映射到Client线程的用户态地址,或者将中断控制器的MMIO寄存器文件映射到Client线程的地址空间。
S12、电子设备中的Client线程发起数据处理请求时,在用户态基于Client线程对应的用户态地址触发中断事件。
在一些实施例中,Client线程发起数据处理请求时,也可以在用户态访问用户态的MMIO寄存器文件从而触发中断事件。
在一些实施例中,Client线程在接收到电子设备的应用程序发送的数据后,可以发起数据处理请求,触发中断事件,从而调用Server线程来处理Client线程提供的待处理数据。其中,待处理数据可以是Client线程对应用程序发送的数据进行数据准备或者预处理后的数据。
在触发中断事件时,可以由上述IPC调用接口模块来为中断事件的触发提供接口,实现Client线程与中断控制器之间的通信。
在前述实施例中,内存映射模块可以将中断控制器的硬件地址映射到Client线程的用户态地址,那么Client线程基于用户态地址就可以对应访问到中断控制器的硬件地址,从而触发中断控制器产生中断事件。当电子设备中有IPC数据要处理时,可以先将IPC数据发送给Client线程,Client线程会在用户态来触发中断事件,而不会依赖操作系统内核来触发中断事件,可以减小线程间通信的时延。
在一些实施例中,Client线程触发中断事件后,还可以将待处理的IPC数据保存在可共享的预设内存区块中,等待被目标Server线程读取并处理。其中,预设内存区块可以共享给Client线程和Server线程,从而Client线程和Server线程都可以向预设内存区块中存入数据,也可以从预设内存区块中读取数据。
在一些实施例中,Client线程触发的中断事件可以是前述实施例中多个Server线程注册的多个中断事件中的任意一个。
S13、在电子设备中,响应于中断事件,中断事件对应的目标Server线程在用户态获取待处理数据,并处理待处理数据。
中断事件被触发后,电子设备中的中断事件对应的目标Server线程会响应中断事件,并且目标Server线程的执行流被打断,开始处理中断事件。在确定目标Server线程时,电子设备中的中断处理模块等可以根据中断事件的硬件中断号在IPC处理信息中查找对应的线程号,并将查找到的线程号对应的Server线程确定为目标Server线程。
由于硬件中断具有异步性、通知性和及时性,每当Client线程有数据需要处理时,Server线程能及时地响应并处理,并且,Client线程可以在用户态触发中断事件,Server线程也可以在用户态处理中断事件,无需依赖内核进行通知,从而可以减小线程间通信的时延。
在一些实施例中,中断事件被触发后,电子设备中的中断控制器会根据中断事件的CPU亲和性确定处理中断事件的目标CPU,通常,目标CPU上运行的是目标Server线程,如果目标Server线程没有在目标CPU上运行,则中断控制器可以更新中断事件的CPU亲和性,将中断事件与当前正在运行目标Server线程的CPU,将这个CPU作为新的目标CPU。当中断事件再次被触发时,可以根据中断事件的CPU亲和性快速定位到处理中断事件的目标CPU和目标Server线程,从而使目标Server线程快速处理中断事件。这样的方式也无需经过电子设备操作系统的内核进行IPC路由等操作,可以改善采用IPC路由过程而造成的时延的问题。例如IPC路由环节的时延可以从5~10us减小到100ns,极大提高了线程间通信的数据吞吐量。
在另一些实施例中,中断事件被触发后,电子设备中的中断处理模块可以从中断控制器读取中断事件的硬件中断号,然后去查询IPC处理表中是否存在对应的硬件中断号。如果可以查询到,说明该中断事件已经被注册并且可以用于处理IPC数据,则可以由目标Server线程在用户态处理进行处理。而如果查询不到,则说明该中断事件未被注册并且不可以用于处理IPC数据,那么中断控制器可以重新产生一个中断事件。之后,中断处理模块可以再次在IPC处理表中查询,直至查询到中断事件的硬件中断号为止。从而保证中断事件有对应的Server线程可以处理,保证中断事件的有效性。
在一些实施例中,中断事件被触发并且中断处理模块在IPC处理表中找到与中断事件对应的目标Server线程后,电子设备中的中断处理模块可以为目标Server线程配置对应的待处理中断标记。从而在目标Server线程被唤醒或者中断当前执行流后,能及时地处理对应的中断事件或者IPC数据。并且在目标Server线程在被注入回调函数之后,电子设备的中断注入模块可以删除目标Server线程待处理中断标记。
在一些实施例中,中断事件被触发并且中断处理模块在IPC处理表中找到与中断事件对应的目标Server线程时,电子设备中的中断处理模块还可以检测目标Server线程当前的运行状态。如果目标Server线程当前正在运行执行流,则中断控制器可以打断目标Server线程的执行流,并且中断注入模块可以在目标Server线程中注入回调函数,从而目标Server线程可以在用户态执行回调函数,并通过回调函数从预设内存区块中读取待处理的IPC数据。
而如果目标Server线程当前并未在运行,则中断处理模块可以主动唤醒目标Server线程,当目标Server线程被中断处理模块调入对应的目标CPU时,中断注入模块就可以在目标Server线程中注入回调函数,从而目标Server线程可以在用户态执行回调函数,并通过回调函数从预设内存区块中读取待处理的IPC数据。
可见,无论被调用的目标Server线程当前处于运行状态还是未运行状态,在中断事件被触发之后,目标Server线程都会被注入回调函数并执行该回调函数,从而实现快速处理中断事件的目的。
目标Server线程执行回调函数时处于用户态,从而目标Server线程可以在用户态处理待处理的IPC数据。
在一些实施例中,目标Server线程在用户态获取待处理数据时,可以通过回调函数从上述预设内存区块中读取Client线程存入的待处理数据。这样采用共享内存保存待处理的数据的方式中,Client线程能访问共享内存存入数据,而目标Server线程能访问共享内存获取到数据,从而实现通过零拷贝数据进行数据处理的目的,可以适用于大数据传输与处理的场景。
本申请实施例的上述线程间通信的方法,可以电子设备可以基于硬件中断来处理IPC数据,并将中断控制器的硬件地址映射到用户态地址。每当Client线程有IPC数据要进行处理时,Client线程可以在用户态直接触发中断事件,Server线程处理中断事件时会在用户态直接获取待处理的数据并处理,而无需在内核态进行处理,从而实现无需依赖内核的线程间通信,可以减小线程间通信的时延。
前述实施例中,由于中断注册模块、中断路由模块、中断处理模块、中断注入模块、内核、客户线程、服务线程等都包括在电子设备中,因此中断注册模块、中断路由模块、中断处理模块、中断注入模块、内核、客户线程、服务线程等进行处理过程,也可以看作是电子设备的处理过程。
以下以用户态工作线程与用户态网络协议栈之间的通信为例,对本申请实施例的上述线程间通信的方法进行说明。
目前,很多对网络性能敏感的应用程序都会利用用户态网络协议栈(Lwip)来旁路掉内核协议栈,提高自身的网络性能。参见图11,Lwip协议栈可以创建若干协议栈线程,例如协议栈线程1、协议栈线程2、协议栈线程3等,每个协议栈线程可以通过内存读写底层网卡的硬件队列,例如硬件队列1、硬件队列2、硬件队列3等。网络应用程序包含若干工作线程,每个工作线程都会创建网络连接,这些网络连接的上下行数据都要路由到协议栈线程来处理。出于性能考虑,协议栈线程会一直监听硬件队列来处理数据,当某个网络连接的数据经过协议栈线程处理后发给工作线程处理时,协议栈线程会通知用户态路由线程,让用户态路由线程来唤醒工作线程来处理网络数据。
因为协议栈线程、用户态路由线程和工作线程之间存在大量的IPC通信。传统的IPC机制会将有大量的时间消耗在内核里。为了改善工作线程和协议栈线程之间的IPC通信效率,本申请实施例中可以利用中断事件加速协议栈线程和工作线程之间的IPC效率,并且用中断控制器来替代用户态路由线程,从而消除协议栈线程和路由线程、路由线程和工作线程间的IPC通知时延等。
上述协议栈线程可以包括收包和发包两个过程。
参见图12,在协议栈线程收包的过程中,可以包括如下步骤S21-S27。其中,协议栈线程可以看作是前述实施例中的Client线程,而工作线程可以看作是前述实施例中的Server线程。
S21、工作线程为每个网络连接注册一个中断事件。
每当网络连接收到报文时,协议栈线程会通过中断事件通知工作线程处理报文对应的数据。其中,报文对应的数据可以看作是前述实施例中的待处理数据,或者待处理的IPC数据等。
S22、协议栈线程轮询网卡硬件队列,从里面读取原始报文,并将原始报文对应的待处理数据保存在大页内存中。
其中,大页内存对工作线程和协议栈线程是共享的,可以实现数据零拷贝。大页内存也可以看作前述实施例中的预设内存区块,或者共享内存等。
S23、协议栈线程处理完原始报文后,访问MMIO寄存器文件触发中断。即,协议栈线程通过访问MMIO寄存器文件而控制中断控制器产生中断事件。
S24、电子设备的中断路由模块通过中断事件的CPU亲和性确定出运行工作线程的目标CPU。其中,目标CPU上运行着中断事件对应的工作线程。
S25、中断控制器在目标CPU上产生中断,打断工作线程的执行流。
S26、电子设备的中断注入模块会在工作线程中注入回调函数。
S27、工作线程可以在用户态通过回调函数从大页内存中读取待处理的数据并处理。
在上述S25中,如果中断事件对应的工作线程处于未运行执行流程的空闲状态,那么电子设备的中断处理模块还可以将工作线程唤醒,从而使工作线程迁移到目标CPU上运行。之后,在工作线程中注入回调函数。
在上述S25中,如果中断事件对应的工作线程并未运行在目标CPU上,中断控制器会在运行工作线程的CPU上产生中断事件,并且中断控制器可以同步更新中断事件的CPU亲和性,即,将中断事件与当前的CPU相关联或者相对应。
在一些实施例中,经过上述S21-S27的步骤后,本申请实施例中依赖中断事件的协议栈收包过程的性能与目前常用依赖内核的协议栈收包过程的性能可以参见下表1和表2:
表1
表2
由上述表1和表2的内容可知,本申请实施例中依赖中断事件的协议栈收包过程的吞吐量相比于目前常用依赖内核的协议栈收包过程的吞吐量有着很大的提高。
参见图13,在协议栈线程发包的过程中,可以包括如下步骤S31-S37。其中,协议栈线程可以看作是前述实施例中的Server线程,而工作线程可以看作是前述实施例中的Client线程。
S31、协议栈线程注册一个硬件中断。
每当工作线程需要通过网络连接发送数据时,工作线程会通过中断事件通知协议栈线程。其中,待发送的数据可以看作是前述实施例中的待处理数据,或者待处理的IPC数据等。
S32、工作线程将待发送的数据放到大页内存中。
其中,大页内存对工作线程和协议栈线程是共享的,可以实现数据零拷贝。大页内存也可以看作前述实施例中的预设内存区块,或者共享内存等。
S33、工作线程访问MMIO寄存器文件触发中断。即,工作线程通过访问MMIO寄存器文件而控制中断控制器产生中断事件。
S34、电子设备的中断路由模块通过中断事件的CPU亲和性确定出运行协议栈线程的目标CPU。其中,目标CPU上运行着中断事件对应的协议栈线程。
S35、中断控制器在目标CPU上产生中断,打断协议栈线程的执行流。
S36、电子设备的中断注入模块会在协议栈线程中注入回调函数。
S37、协议栈线程可以在用户态通过回调函数从大页内存里读取待发送的数据并处理。
在上述S35中,如果中断事件对应的协议栈线程处于未运行执行流程的空闲状态,那么电子设备的中断处理模块还可以将协议栈线程唤醒,从而使协议栈线程迁移到目标CPU上运行。之后,在协议栈线程中注入回调函数。
在上述S35中,如果中断事件对应的协议栈线程并未运行在目标CPU上,中断控制器会在运行协议栈线程的CPU上产生中断事件,并且中断控制器可以同步更新中断事件的CPU亲和性,即,将中断事件与当前的CPU相关联或者相对应。
在一些实施例中,经过上述S31-S37的步骤后,本申请实施例中依赖中断事件的协议栈发包过程的性能与目前常用依赖内核的协议栈发包过程的性能可以参见下表3和表4:
表3
表4
由上述表3和表4的内容可知,本申请实施例中依赖中断事件的协议栈发包过程的吞吐量相比于目前常用依赖内核的协议栈发包过程的吞吐量有着很大的提高,并且本申请实施例中依赖中断事件的协议栈发包过程的时延相比于目前常用依赖内核的协议栈发包过程的时延也有着很大的改善。
由上述内容可知,本申请实施例中的依赖硬件中断的线程间通信方法中,每当Client线程有IPC数据要进行处理(例如上述收包、发包等)时,Client线程可以在用户态直接触发中断事件,Server线程处理中断事件时会在用户态直接获取待处理的数据进行处理,而无需在内核态进行处理,从而实现无需依赖内核的线程间通信,可以减小线程间通信的时延。
另外,中断控制器通过中断事件对应的CPU亲和性可以直接确定运行Server线程CPU,从而在该CPU上产生中断,此后,在该CPU上运行的Server线程可以开始处理待处理的数据,直至处理完毕。这样的方式可以改善采用IPC路由过程而造成的时延的问题。
并且,目标Server线程可以从预设内存区块中直接读取到待处理的IPC数据,而无需将IPC数据拷贝过来,从而实现数据的零拷贝的目的。
上述实施例中,以用户态工作线程与用户态网络协议栈处理网络数据为例,对本申请实施例中的线程间通信的方法进行示例性说明。在其他一些实施例中,本申请实施例中的线程间通信的方法也可以应用于其他的数据处理场景中,例如应用于人工智能领域的处理数据等。其具体的处理过程可以参见前述实施例的内容,并且也能达到上述实施例的效果,此处不再赘述。
可以理解的是,为了实现上述功能,电子设备包含了执行各个功能相应的硬件和/或软件模块。结合本文中所公开的实施例描述的各示例的算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以结合实施例对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
本实施例可以根据上述方法示例对电子设备进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块可以采用硬件的形式实现。需要说明的是,本实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
本申请实施例还提供一种电子设备,如图14所示,该电子设备可以包括一个或者多个处理器1001、存储器1002和通信接口1003。
其中,存储器1002、通信接口1003与处理器1001耦合。例如,存储器1002、通信接口1003与处理器1001可以通过总线1004耦合在一起。
其中,通信接口1003用于与其他设备进行数据传输。存储器1002中存储有计算机程序代码。计算机程序代码包括计算机指令,当计算机指令被处理器1001执行时,使得电子设备执行本申请实施例中的线程间通信的方法。
其中,处理器1001可以是处理器或控制器,例如可以是中央处理器(CentralProcessing Unit,CPU),通用处理器,数字信号处理器(Digital Signal Processor,DSP),专用集成电路(Application-Specific Integrated Circuit,ASIC),现场可编程门阵列(Field Programmable Gate Array,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等等。
其中,总线1004可以是外设部件互连标准(Peripheral ComponentInterconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。上述总线1004可以分为地址总线、数据总线、控制总线等。为便于表示,图14中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
本申请实施例还提供一种计算机可读存储介质,该计算机存储介质中存储有计算机程序代码,当上述处理器执行该计算机程序代码时,电子设备执行上述方法实施例中的相关方法步骤。
本申请实施例还提供了一种计算机程序产品,当该计算机程序产品在计算机上运行时,使得计算机执行上述方法实施例中的相关方法步骤。
其中,本申请提供的电子设备、计算机存储介质或者计算机程序产品均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
通过以上实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上内容,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (16)

1.一种线程间通信的方法,其特征在于,应用于电子设备,所述电子设备包括中断控制器、客户线程和服务线程;所述方法包括:
所述客户线程发起数据处理请求时,在用户态基于所述客户线程对应的用户态地址触发中断事件,所述用户态地址与所述中断控制器的硬件地址之间具有映射关系;
响应于所述中断事件,所述中断事件对应的目标服务线程在用户态获取待处理数据,并处理所述待处理数据。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
所述客户线程将所述待处理数据,保存在所述客户线程和所述服务线程的共享内存中。
3.根据权利要求1-2任一项所述的方法,其特征在于,所述电子设备上保存有所述中断事件与其对应的目标处理器之间的关联关系;所述方法还包括:
若所述目标服务线程响应于所述中断事件被唤醒,则所述目标服务线程在所述中断事件对应的目标处理器上运行。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
若所述中断事件被触发时,所述目标服务线程当前未在所述目标处理器上运行,则更新所述中断事件与所述目标处理器之间的关联关系;更新后的所述关联关系中所述目标处理器表示当前正在运行所述目标服务线程的处理器。
5.根据权利要求2所述的方法,其特征在于,所述中断事件对应的目标服务线程在用户态获取所述待处理数据,包括:
所述目标服务线程在内核态被注入所述中断事件对应的回调函数;
所述目标服务线程在用户态通过执行所述回调函数从所述共享内存中获取所述待处理数据。
6.根据权利要求5所述的方法,其特征在于,在所述客户线程保存所述待处理数据之后,所述回调函数对应的栈帧指针指向所述共享内存中所述待处理数据的地址。
7.根据权利要求5所述的方法,其特征在于,所述目标服务线程在内核态被注入所述中断事件对应的回调函数,包括:
若所述中断事件被触发时,所述目标服务线程当前正在运行,则所述目标服务线程被打断并在内核态被注入所述回调函数;
或者,
若所述中断事件被触发时,所述目标服务线程当前未运行,则所述目标服务线程被唤醒并在内核态被注入所述回调函数。
8.根据权利要求1-7任一项所述的方法,其特征在于,在所述客户线程发起数据处理请求之前,还包括:
多个所述服务线程分别注册对应的中断事件;经过注册之后,所述中断事件的硬件中断号与注册所述中断事件的所述服务线程的线程号之间具有映射关系,以及所述硬件中断号与所述线程号之间的映射关系保存在进程间通信处理信息中。
9.根据权利要求8所述的方法,其特征在于,经过注册之后,所述中断事件被配置对应的回调函数,以及所述中断事件的硬件中断号被配置对应的虚拟中断号;所述中断事件的硬件中断号与所述回调函数相关联,所述回调函数通过所述虚拟中断号获取所述待处理数据。
10.根据权利要求5所述的方法,其特征在于,所述目标服务线程在内核态被注入所述中断事件对应的回调函数,包括:
若所述目标服务线程具有待处理中断标记,则所述目标服务线程在内核态被注入所述中断事件对应的回调函数;所述待处理中断标记表示所述目标服务线程有待处理的中断事件。
11.根据权利要求10所述的方法,其特征在于,所述方法还包括:
在所述目标服务线程在被注入所述回调函数之后,删除所述待处理中断标记。
12.根据权利要求1-11任一项所述的方法,其特征在于,在所述中断事件被触发后,所述目标服务线程被设置防嵌套标记;所述防嵌套标记表示禁止所述目标服务线程在处理所述中断事件时被注入其他中断事件对应的回调函数。
13.根据权利要求12所述的方法,其特征在于,所述方法还包括:
在所述目标服务线程在处理完所述待处理数据之后,删除所述防嵌套标记。
14.根据权利要求1-13任一项所述的方法,其特征在于,所述方法还包括:
在所述目标服务线程在执行完所述回调函数之后,卸载所述回调函数。
15.一种电子设备,其特征在于,所述电子设备包括存储器、一个或多个处理器;所述存储器与所述处理器耦合;其中,所述存储器中存储有计算机程序代码,所述计算机程序代码包括计算机指令,当所述计算机指令被所述处理器执行时,使得所述电子设备执行如权利要求1-14任一项所述的线程间通信的方法。
16.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在计算机上运行时,使得计算机可以执行如权利要求1-14任一项所述的线程间通信的方法。
CN202211164272.6A 2022-09-23 2022-09-23 线程间通信的方法及电子设备 Pending CN117407183A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211164272.6A CN117407183A (zh) 2022-09-23 2022-09-23 线程间通信的方法及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211164272.6A CN117407183A (zh) 2022-09-23 2022-09-23 线程间通信的方法及电子设备

Publications (1)

Publication Number Publication Date
CN117407183A true CN117407183A (zh) 2024-01-16

Family

ID=89485881

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211164272.6A Pending CN117407183A (zh) 2022-09-23 2022-09-23 线程间通信的方法及电子设备

Country Status (1)

Country Link
CN (1) CN117407183A (zh)

Similar Documents

Publication Publication Date Title
US10949249B2 (en) Task processor
US6715016B1 (en) Multiple operating system control method
WO2021217529A1 (zh) 一种进程间通信的方法及系统
US20080104296A1 (en) Interrupt handling using simultaneous multi-threading
US7366814B2 (en) Heterogeneous multiprocessor system and OS configuration method thereof
JP2007156824A (ja) プロセッサシステム、タスク制御方法
JPWO2008023426A1 (ja) タスク処理装置
US20110219373A1 (en) Virtual machine management apparatus and virtualization method for virtualization-supporting terminal platform
JPWO2008023427A1 (ja) タスク処理装置
WO2021022964A1 (zh) 一种基于多核系统的任务处理方法、装置及计算机可读存储介质
EP3770759A1 (en) Wake-up and scheduling of functions with context hints
US7765548B2 (en) System, method and medium for using and/or providing operating system information to acquire a hybrid user/operating system lock
Humphries et al. A case against (most) context switches
US8141077B2 (en) System, method and medium for providing asynchronous input and output with less system calls to and from an operating system
WO2024007934A1 (zh) 中断处理方法、电子设备和存储介质
CN117407183A (zh) 线程间通信的方法及电子设备
Ruocco Real-time programming and L4 microkernels
Mauroner et al. EventQueue: An event based and priority aware interprocess communication for embedded systems
Nakajima et al. Operating systems for building robust embedded systems
JP2003330873A (ja) 情報処理装置及び入出力方法並びにプログラム
US20240004696A1 (en) Synchronizing concurrent tasks using interrupt deferral instructions
Bozyigit et al. A kernel integrated task migration infrastructure for clusters of workstations
JP2630239B2 (ja) 分散処理システム
addin Al-maweri et al. Runtime CPU scheduler customization framework for a flexible mobile operating system
Subramaniam et al. A communication library using active messages to improve performance of PVM

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