CN111475264A - 一种用户态无锁转发的实现方法及装置 - Google Patents
一种用户态无锁转发的实现方法及装置 Download PDFInfo
- Publication number
- CN111475264A CN111475264A CN202010131073.XA CN202010131073A CN111475264A CN 111475264 A CN111475264 A CN 111475264A CN 202010131073 A CN202010131073 A CN 202010131073A CN 111475264 A CN111475264 A CN 111475264A
- Authority
- CN
- China
- Prior art keywords
- thread
- red
- field
- forwarding
- data
- 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.)
- Granted
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/485—Task life-cycle, e.g. stopping, restarting, resuming execution
-
- 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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供一种用户态无锁转发的实现方法及装置,该方法包括:当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性,其中,该红区用于记录线程对数据的全部访问过程,该红区包括当前使用红区以及过期待处理红区,该当前使用红区存储待释放数据;根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。
Description
技术领域
本申请涉及通信技术领域,尤其涉及一种用户态无锁转发的实现方法及装置。
背景技术
随着互联网、4G、5G网络的普及推广,对于网络操作系统(英文:networkoperating system,简称:Nos)的转发性能要求越来越高。无论是运行在服务器或是路由器中,Nos充分利用多核中央处理器(英文:Central Processing Unit,简称:CPU)的能力。在多核CPU并发的情况下,会出现对关键数据的冲突访问,因此,提供一种多核无锁的转发方式,对于转发性能是至关重要的。
读-拷贝更新(英文:Read-Copy Update,简称:RCU),是在Linux内核态下提供的一种无锁并发访问方式,当多个上下文(例如,内核线程、软中断等)等并发访问数据时,对于读者无需加锁进行互斥处理,是一种非常高效的互斥方式。
RCU机制主要包括两部分:1)拷贝修改。如图1所示,以图1中的链表为例,在对链表中的某个节点更新时,先拷贝一个副本(new-one),对副本进行修改。然后,将副本挂在链表上旧节点(old-one)所在的位置。这个过程中,对旧节点的内容不做修改,包括旧节点的下一级节点的地址。因此,上述过程中,正在访问该链表的读者,依然可以通过旧节点安全的访问该链表,同时无需在修改的过程中加锁对读者进行屏蔽。2)延迟释放。在如图1修改过副本后,旧节点不会被立即释放,而是继续挂在链表上。在特定的时间,调用旧节点的释放回调函数,将旧节点释放。
由于并不知道当前有哪些上下文在访问某一个待释放的节点,因此,RCU机制通过优雅期(grace period)来确定释放的时机。即以优雅期为界,对关键数据的修改或删除操作在当前优雅期完成,那么在当前优雅期内,处于其他CPU上的读者可能访问到旧数据(在修改或删除完成前就查找并使用旧节点),也可能访问新数据(在修改或删除操作完成后才查找到新节点)。因此,在全部CPU都完成了一次上下文切换后,即可保证后续读者访问的是新节点,可将旧节点安全释放。
当前,主流的Nos在采用了用户态的系统后,则失去了高效安全的RCU机制。尽管用户态也有类似RCU的用户态RCU(英文:user-space read-copy update,简称:URCU)机制,但是,由于URCU无法获取CPU上的上下文切换,不能感知优雅期。因此,URCU对于编码的要求非常高,并且URCU需要暴露出很多实现细节,尤其是将Nos移植到用户态的时,适配URCU过程困难。
发明内容
有鉴于此,本申请提供了一种用户态无锁转发的实现方法及装置,解决用户态转发的无锁要求,提供了一种接近内核RCU的解决方案。
第一方面,本申请提供了一种用户态无锁转发的实现方法,该方法包括:
当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区(redzone)对应的结构属性,该红区用于记录线程对数据的全部访问过程,该红区包括当前使用红区以及过期待处理红区,该当前使用红区存储待释放数据;
根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;
如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。
结合第一方面,在第一种可能的实现方式中,当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性之前,该方法还包括:
创建线程以及线程对应的线程变量,该线程变量包括线程角色字段、线程编号字段;
如果线程为转发线程,则更新线程角色字段以及线程编号字段;
如果线程为非转发线程,则更新线程角色字段。
结合第一方面的第一种可能实现方式,在第二种可能的实现方式中,该结构属性包括当前使用红区中转发线程的状态字段;
根据线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果线程为转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;
获取转发线程的线程编号,更新当前使用红区中转发线程的状态字段。
结合第一方面的第一种可能实现方式,在第三种可能的实现方式中,该结构属性还包括当前使用红区中非转发线程的个数字段;
根据线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果线程为非转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;
更新当前使用红区中非转发线程的个数字段。
结合第一方面的第二种、第三种可能实现方式,在第四种可能的实现方式中,该线程变量还包括进入红区计数字段以及线程所在红区字段;
该方法还包括:
当线程对数据进行访问时,根据当前使用红区,更新线程所在红区字段以及进入红区计数字段;
当线程再次对数据进行访问时,再次更新进入红区计数字段;
当数据对数据访问结束时,更新进入红区计数字段;
若进入红区计数字段对应的值为0时,则根据线程角色,更新当前使用红区中转发线程的状态字段或者当前使用红区中非转发线程的个数字段。
第二方面,本申请提供了一种用户态无锁转发的实现装置,该装置包括:
更新单元,用于当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性,该红区用于记录线程对数据的全部访问过程,该红区包括当前使用红区以及过期待处理红区,该当前使用红区存储待释放数据;
判断单元,用于根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;
释放单元,用于如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。
结合第二方面,在第一种可能的实现方式中,该装置还包括:
创建单元,用于创建线程以及线程对应的线程变量,该线程变量包括线程角色字段、线程编号字段;
更新单元还用于,如果线程为转发线程,则更新线程角色字段以及线程编号字段;
如果线程为非转发线程,则更新线程角色字段。
结合第二方面的第一种可能实现方式,在第二种可能的实现方式中,该结构属性包括当前使用红区中转发线程的状态字段;
更新单元具体用于,如果线程为转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;
获取转发线程的线程编号,更新当前使用红区中转发线程的状态字段。
结合第二方面的第一种可能实现方式,在第三种可能的实现方式中,该结构属性还包括当前使用红区中非转发线程的个数字段;
更新单元具体用于,如果线程为非转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;
更新当前使用红区中非转发线程的个数字段。
结合第二方面的第二种、第三种可能实现方式,在第四种可能的实现方式中,该线程变量还包括进入红区计数字段以及线程所在红区字段;
更新单元还用于,当线程对数据进行访问时,根据当前使用红区,更新线程所在红区字段以及进入红区计数字段;
当线程再次对数据进行访问时,再次更新进入红区计数字段;
当数据对数据访问结束时,更新进入红区计数字段;
若进入红区计数字段对应的值为0时,则根据线程角色,更新当前使用红区中转发线程的状态字段或者当前使用红区中非转发线程的个数字段。
第三方面,本申请提供了一种网络设备,包括处理器和机器可读存储介质,机器可读存储介质存储有能够被处理器执行的机器可执行指令,处理器被机器可执行指令促使执行本申请第一方面所提供的方法。
因此,通过应用本申请提供的一种用户态无锁转发的实现方法及装置,当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性;根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。其中,红区用于记录线程对数据的全部访问过程。
本申请提出红区的概念,将线程对数据的访问模拟为线程进入红区,线程对数据访问结束后模拟为离开红区。红区持续迭代更新,待释放数据记录在当前使用红区中。通过判断过期待处理红区中是否存在访问的线程,如已未存在线程驻留,则可以释放当前使用红区中的待释放数据。解决用户态转发的无锁要求,提供了一种接近内核RCU的解决方案。
附图说明
图1为现有技术中提供的RCU拷贝修改示意图;
图2为本申请实施例提供的一种用户态无锁转发的实现方法的流程图;
图3为本申请实施例提供的一环形队列结构红区示意图;
图4为本申请实施例提供的一种线程、数据与红区关系示意图;
图5为本申请实施例提供的一种各线程访问过程时序图;
图6为本申请实施例提供的一种用户态无锁转发的实现装置结构图;
图7为本申请实施例提供的一种网络设备硬件结构图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施例并不代表与本申请相一致的所有实施例。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相对应的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
下面对本申请实施例提供的用户态无锁转发的实现方法进行详细地说明。参见图2,图2为本申请实施例提供的一种用户态无锁转发的实现方法的流程图。该方法应用在用户态Nos。本申请实施例提供的用户态无锁转发的实现方法可包括如下所示步骤。
步骤201、当线程对数据进行访问或访问结束时,根据所述线程的类别,更新已创建的红区对应的结构属性。
具体地,目前的Nos均是支持多核系统,其典型的模型是将CPU的多个核,区分为控制核和转发核。对于用户态Nos,整个转发动作都是在一个转发进程内完成。
在执行本步骤之前,需为多个核创建线程,在创建线程时,区分转发线程和非转发线程。独占转发核的用于转发报文的是转发线程,其他线程均属于非转发线程(例如,控制线程)。
在创建线程的同时,也为创建线程对应的线程变量,该线程变量包括线程角色字段以及线程编号字段。如下表1所示。
表1线程变量字段示意
thread.Role | 线程角色字段,转发线程或非转发线程 |
thread.No | 转发线程编号字段,Role为转发线程时有意义 |
可以理解的是,由于CPU的多个核中的转发核数N在系统运行时为固定的,因此,在本申请实施例中,转发线程的个数也是固定的。每个转发线程分配一个编号,即:0~N-1。
创建线程以及线程变量后,如果线程为转发线程,则更新线程角色字段以及所述线程编号字段;如果线程为非转发线程,更新线程角色字段。
进一步地,本申请实施例中,红区用于记录线程对数据的全部访问过程,红区包括当前使用红区、过期待处理红区以及空闲红区,当前使用红区、过期待处理红区存储待释放数据,空闲红区既不是当前使用红区也不是过期待处理红区,其上未存在驻留的线程,也未存在待释放数据(即“空闲红区”为对“过期待处理红区”处理之后的红区)。红区可以抽象为一个环形队列结构,同时,为环形队列申请内存存储,该环形队列可循环使用,如图3所示。图3为本申请实施例提供的一环形队列结构红区示意图。
创建全局变量,该全局变量包括当前使用红区字段以及过期待处理红区字段,可以理解的是,各字段可通过适当的数据定义(例如,在各字段中直接记录红区索引或者红区内存地址)。如下表2所示。
表2全局变量字段示意
Global.currentRedZone | 记录当前红区 |
Global.AgingRedZone | 记录已过期待处理的红区 |
同时,还创建控制线程(Red Zone Thread),该控制线程用于每隔固定时间(例如,1秒或500毫秒)将当前使用红区字段记录的当前使用红区,更新为环形队列里的下一个成员(可为当前使用红区的相邻成员)。之前的红区变为过期待处理红区(expired Redzone),当过期待处理红区中未存在访问的线程后,则将当前使用红区中待释放的数据进行释放处理,该已处理红区再次处于可用状态,此时将过期待处理红区字段更新为已处理红区的下一个成员(可为已处理红区的相邻成员)。
需要说明的是,之前的红区变为过期待处理红区后,在对该过期待处理红区进行老化处理时,将该过期待处理红区中存储的待释放数据转存至下一个当前使用红区中。后续,在过期待处理红区中未存在访问的线程后,则将在先转存至当前使用红区中的待释放数据进行释放处理。可以理解的,若还未对某一过期待处理红区进行老化处理时,在该过期待处理红区中仍存储待释放数据。
更进一步地,创建红区对应的结构属性,该结构属性包括当前使用红区中转发线程的状态字段、当前使用红区中非转发线程的个数字段以及待释放数据链表字段。如下表3所示。
表3结构属性字段示意
RedZone.State[N] | 记录当前使用红区的转发线程的状态 |
RedZone.AtomicCount | 记录当前使用红区的非转发线程个数,原子变量 |
RedZone.DeletingLink | 待释放数据链表 |
在本申请实施例中,线程对数据进行访问或结束访问,可将其过程模拟为线程进入或者离开红区,如图4所示,图4为本申请实施例提供的一种线程、数据与红区关系示意图。例如,线程对数据1进行访问时,可将该线程模拟为进入红区;线程对数据1结束访问时,可将该线程模拟为离开红区。在线程进入或者离开红区时,根据线程的类别,对应性更新上述结构属性包括的字段。
在一种实现方式中,根据线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果线程为转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;获取转发线程的线程编号,更新当前使用红区中转发线程的状态字段。
在另一种实现方式中,根据线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果线程为非转发线程,则通过已创建的全局变量,确定红区中的当前使用红区;更新当前使用红区中非转发线程的个数字段。
当线程为转发线程时,转发线程初次进入红区,转发线程通过全局变量包括的当前使用红区字段确定当前使用红区。转发线程获取自身的线程编号,同时,转发线程将当前使用红区的转发线程的状态字段中与线程编号对应的字段进行更新,标识该转发线程进入了当前使用红区。通过在当前使用红区的转发线程的状态字段中设置转发线程编号对应的字段,避免转发线程之间的并发互斥。
当线程为非转发线程时,非转发线程初次进入红区,非转发线程通过全局变量包括的当前使用红区字段确定当前使用红区。同时,通过原子操作更新当前使用红区中非转发线程的个数字段,即增加该个数字段的计数。
可以理解的是,线程在访问数据前后,需要显示调用接口RedZone_In()/RedZone_Out();调用时机与内核RCU的rcu_read_lock和rcu_read_unlock一致,在此不再复述。
步骤202、根据所述更新后的结构属性,判断所述过期待处理红区中是否存在访问的线程。
具体地,当访问的数据需要进行修改或删除时,在本申请实施例中,对修改或删除的数据暂不立即释放,而是将其挂接到结构属性包括的待释放数据链表字段中,在适当的时机将其释放。
进一步地,控制线程需针对已过期的红区进行老化处理。根据更新后的结构属性,控制线程判断过期待处理红区中是否存在访问的线程。若未存在,则执行步骤203。
更进一步地,控制线程通过已创建的全局变量、结构属性包括的当前使用红区中转发线程的状态字段、当前使用红区中非转发线程的个数字段,判断过期待处理红区字段对应的过期待处理红区中是否存在访问的线程。
步骤203、如果所述过期待处理红区中未存在访问的线程,则将所述当前使用红区存储的待释放数据进行释放处理。
具体地,根据前述步骤的判断,如果过期待处理红区中未存在访问的线程,则控制线程将结构属性包括的待释放数据链表字段对应的待释放数据进行释放处理,该已处理红区再次处于可用状态。同时,控制线程将全局变量包括的过期待处理红区字段更新为已处理红区的下一个成员(可为图3所示环形队列结构中已处理红区的相邻成员)。
步骤201中已说明的是,在对过期待处理红区进行老化处理时,将该过期待处理红区中存储的待释放数据转存至当前使用红区中。此时,在过期待处理红区中未存在访问的线程后,则将在先转存至当前使用红区中的待释放数据进行释放处理。可以理解的,若还未对某一过期待处理红区进行老化处理时,在该过期待处理红区中仍存储待释放数据。
因此,通过应用本申请实施例提供的一种用户态无锁转发的实现方法及装置,当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性;根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。其中,红区用于记录线程对数据的全部访问过程。
本申请实施例提出红区的概念,将线程对数据的访问模拟为线程进入红区,线程对数据访问结束后模拟为离开红区。红区持续迭代更新,待释放数据记录在当前使用红区中。通过判断过期待处理红区中是否存在访问的线程,如已未存在线程驻留,则可以释放当前使用红区中的待释放数据。解决用户态转发的无锁要求,提供了一种接近内核RCU的解决方案。
可选地,在本申请实施例中,步骤201中描述的线程变量还包括进入红区计数字段以及线程所在红区字段。前述方法还包括更新线程变量、结构属性以及全局变量。
具体地,前述步骤201中创建的线程变量还包括进入红区计数字段以及线程所在红区字段。如下表4所示。
表4线程变量字段示意
thread.Role | 线程角色字段,转发线程或非转发线程 |
thread.No | 转发线程编号字段,Role为转发线程时有意义 |
thread.Count | 进入红区计数 |
thread.RedZone | 当前线程所在红区 |
当线程进入红区(即,线程对数据进行访问)时,根据前述确定出的当前使用红区,线程更新线程所在红区字段以及进入红区计数字段,也即是将当前使用红区记录到线程所在红区字段,同时,增加进入红区计数;当线程再次进入红区(即,线程对数据再次进行访问)对数据进行访问时,线程再次更新进入红区计数字段。
当线程对数据访问结束(即,线程对数据访问结束)时,线程更新进入红区计数字段;此时,若进入红区计数字段对应的值为0,则线程根据线程角色,更新当前使用红区中转发线程的状态字段或者当前使用红区中非转发线程的个数字段。若进入红区计数字段对应的值不为0,则当前无需做处理,等待最后一次调用RedZone_Out()触发线程离开红区。
线程根据线程角色,更新当前使用红区中转发线程的状态字段或者当前使用红区中非转发线程的个数字段。可以理解的是,若进入红区计数字段对应的值为0,则说明当前使用红区内无访问驻留,同时,线程更新线程所在红区字段。
需要说明的是,对于非转发线程,通过原子操作更新当前使用红区中非转发线程的个数字段,即增加该个数字段的计数。同时,在线程变量包括的线程所在红区字段里记录非转发线程所在的当前使用红区,保证其在离开红区时对同一个redZone结构属性进行更新,并增加进入红区计数字段的计数。
前述步骤201中,RedZone_In()/RedZone_Out()支持多次调用,但每次调用后,需增加线程变量包括的进入红区次数字段。其中,最外层调用对应更新所在红区字段以及进入红区计数字段,中间的调用仅更新进入红区计数字段,调用最外层的RedZone_Out后,线程进入当前使用红区的次数为0。即线程离开红区。调用层次如下所示。
可选地,在本申请实施例中,由于各CPU上的线程为并发执行,在此,对用户态Nos无锁情况下的时序问题进行说明。
1)线程进入旧红区,待删除数据记录在新红区。
若线程在进入红区时,控制线程正在更新当前使用红区字段,此时,线程确定出的当前使用红区为更新之前的红区,导致该线程进入了过期待处理红区,而该线程需要访问的数据,由于需要更新(例如,删除或修改)而存储在更新之后的红区中。
对于前述问题,可通过对过期待处理红区的强制顺序老化解决,也即是,只有在更旧的红区完成老化后,再去处理下一个红区的老化,过期待处理红区依次进行老化。此时保证这种情况下,进入旧红区的线程已经离开了旧红区,较新的红区上的数据才能被更新。
2)线程进入新红区,待更新数据记录在旧红区
在缓存待更新数据时,数据管理线程获取到的是更新前的旧红区;而即将访问数据的线程确定出的当前使用红区为更新后的新红区。由于线程访问数据是通过索引表(例如,Hash表)获取到表项,因此,如图5所示,如果线程确定出的当前使用红区是已经更新过的,那么,通过索引表的方式,其不会获取到待更新的数据,因为待更新的数据已挂在旧红区中。
使用本申请实施例提出的用户态无锁转发的实现方法,除了在创建线程时需要特殊处理,例如,设置线程角色和线程编号。其他的操作都可以封装在红区的调用接口中。对于使用者来说,无需暴露过多实现。后续线程对于数据的访问,其用法与内核的RCU完全一致,并且对于转发线程来说,整个过程都是无锁无互斥的。在满足性能的同时,也减小了代码的复杂度。
基于同一发明构思,本申请实施例还提供了与上述用户态无锁转发的实现方法对应的用户态无锁转发的实现装置。参见图6,图6为本申请实施例提供的一种用户态无锁转发的实现装置结构图,该装置包括:
更新单元610,用于当线程对数据进行访问或访问结束时,根据所述线程的类别,更新已创建的红区对应的结构属性,所述红区用于记录线程对数据的全部访问过程,所述红区包括当前使用红区以及过期待处理红区,所述当前使用红区存储待释放数据;
判断单元620,用于根据所述更新后的结构属性,判断所述过期待处理红区中是否存在访问的线程;
释放单元630,用于如果所述过期待处理红区中未存在访问的线程,则将所述当前使用红区存储的待释放数据进行释放处理。
可选地,所述装置还包括:
创建单元640,用于创建所述线程以及所述线程对应的线程变量,所述线程变量包括线程角色字段、线程编号字段;
所述更新单元610还用于,如果所述线程为转发线程,则更新所述线程角色字段以及所述线程编号字段;
如果所述线程为非转发线程,则更新所述线程角色字段。
可选地,所述结构属性包括当前使用红区中转发线程的状态字段;
所述更新单元610具体用于,如果所述线程为转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
获取所述转发线程的线程编号,更新所述当前使用红区中转发线程的状态字段。
可选地,所述结构属性还包括当前使用红区中非转发线程的个数字段;
所述更新单元610具体用于,如果所述线程为非转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
更新所述当前使用红区中非转发线程的个数字段。
可选地,所述线程变量还包括进入红区计数字段以及线程所在红区字段;
所述更新单元610还用于,当所述线程对数据进行访问时,根据所述当前使用红区,更新所述线程所在红区字段以及所述进入红区计数字段;
当所述线程再次对所述数据进行访问时,再次更新所述进入红区计数字段;
当所述数据对所述数据访问结束时,更新所述进入红区计数字段;
若所述进入红区计数字段对应的值为0时,则根据所述线程角色,更新所述当前使用红区中转发线程的状态字段或者所述当前使用红区中非转发线程的个数字段。
因此,通过应用本申请实施例提供的一种用户态无锁转发的实现装置,当线程对数据进行访问或访问结束时,根据线程的类别,更新已创建的红区对应的结构属性;根据更新后的结构属性,判断过期待处理红区中是否存在访问的线程;如果过期待处理红区中未存在访问的线程,则将当前使用红区存储的待释放数据进行释放处理。其中,红区用于记录线程对数据的全部访问过程。
本申请实施例提出红区的概念,将线程对数据的访问模拟为线程进入红区,线程对数据访问结束后模拟为离开红区。红区持续迭代更新,待释放数据记录在当前使用红区中。通过判断过期待处理红区中是否存在访问的线程,如已未存在线程驻留,则可以释放当前使用红区中的待释放数据。解决用户态转发的无锁要求,提供了一种接近内核RCU的解决方案。
基于同一发明构思,本申请实施例还提供了一种网络设备,如图7所示,包括处理器710、收发器720和机器可读存储介质730,机器可读存储介质730存储有能够被处理器710执行的机器可执行指令,处理器710被机器可执行指令促使执行本申请实施例所提供的用户态无锁转发的实现方法。前述图7所示的用户态无锁转发的实现装置,可采用如图7所示的网络设备硬件结构实现。
上述计算机可读存储介质730可以包括随机存取存储器(英文:Random AccessMemory,简称:RAM),也可以包括非易失性存储器(英文:Non-volatile Memory,简称:NVM),例如至少一个磁盘存储器。可选的,计算机可读存储介质730还可以是至少一个位于远离前述处理器710的存储装置。
上述处理器710可以是通用处理器,包括中央处理器(英文:Central ProcessingUnit,简称:CPU)、网络处理器(英文:Network Processor,简称:NP)等;还可以是数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:ApplicationSpecific Integrated Circuit,简称:ASIC)、现场可编程门阵列(英文:Field-Programmable Gate Array,简称:FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
本申请实施例中,处理器710通过读取机器可读存储介质730中存储的机器可执行指令,被机器可执行指令促使能够实现处理器710自身以及调用收发器720执行前述本申请实施例描述的用户态无锁转发的实现方法。
另外,本申请实施例提供了一种机器可读存储介质730,机器可读存储介质730存储有机器可执行指令,在被处理器710调用和执行时,机器可执行指令促使处理器710自身以及调用收发器720执行前述本申请实施例描述的用户态无锁转发的实现方法。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
对于用户态无锁转发的实现装置以及机器可读存储介质实施例而言,由于其涉及的方法内容基本相似于前述的方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
Claims (10)
1.一种用户态无锁转发的实现方法,其特征在于,所述方法包括:
当线程对数据进行访问或访问结束时,根据所述线程的类别,更新已创建的红区对应的结构属性,所述红区用于记录线程对数据的全部访问过程,所述红区包括当前使用红区以及过期待处理红区,所述当前使用红区存储待释放数据;
根据所述更新后的结构属性,判断所述过期待处理红区中是否存在访问的线程;
如果所述过期待处理红区中未存在访问的线程,则将所述当前使用红区存储的待释放数据进行释放处理。
2.根据权利要求1所述的方法,其特征在于,所述当线程对数据进行访问或访问结束时,根据所述线程的类别,更新已创建的红区对应的结构属性之前,所述方法还包括:
创建所述线程以及所述线程对应的线程变量,所述线程变量包括线程角色字段、线程编号字段;
如果所述线程为转发线程,则更新所述线程角色字段以及所述线程编号字段;
如果所述线程为非转发线程,则更新所述线程角色字段。
3.根据权利要求2所述的方法,其特征在于,所述结构属性包括当前使用红区中转发线程的状态字段;
所述根据所述线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果所述线程为转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
获取所述转发线程的线程编号,更新所述当前使用红区中转发线程的状态字段。
4.根据权利要求2所述的方法,其特征在于,所述结构属性还包括当前使用红区中非转发线程的个数字段;
所述根据所述线程的类别,更新已创建的红区对应的结构属性,具体包括:
如果所述线程为非转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
更新所述当前使用红区中非转发线程的个数字段。
5.根据权利要求3或4所述的方法,其特征在于,所述线程变量还包括进入红区计数字段以及线程所在红区字段;
所述方法还包括:
当所述线程对数据进行访问时,根据所述当前使用红区,更新所述线程所在红区字段以及所述进入红区计数字段;
当所述线程再次对所述数据进行访问时,再次更新所述进入红区计数字段;
当所述数据对所述数据访问结束时,更新所述进入红区计数字段;
若所述进入红区计数字段对应的值为0时,则根据所述线程角色,更新所述当前使用红区中转发线程的状态字段或者所述当前使用红区中非转发线程的个数字段。
6.一种用户态无锁转发的实现装置,其特征在于,所述装置包括:
更新单元,用于当线程对数据进行访问或访问结束时,根据所述线程的类别,更新已创建的红区对应的结构属性,所述红区用于记录线程对数据的全部访问过程,所述红区包括当前使用红区以及过期待处理红区,所述当前使用红区存储待释放数据;
判断单元,用于根据所述更新后的结构属性,判断所述过期待处理红区中是否存在访问的线程;
释放单元,用于如果所述过期待处理红区中未存在访问的线程,则将所述当前使用红区存储的待释放数据进行释放处理。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括:
创建单元,用于创建所述线程以及所述线程对应的线程变量,所述线程变量包括线程角色字段、线程编号字段;
所述更新单元还用于,如果所述线程为转发线程,则更新所述线程角色字段以及所述线程编号字段;
如果所述线程为非转发线程,则更新所述线程角色字段。
8.根据权利要求7所述的装置,其特征在于,所述结构属性包括当前使用红区中转发线程的状态字段;
所述更新单元具体用于,如果所述线程为转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
获取所述转发线程的线程编号,更新所述当前使用红区中转发线程的状态字段。
9.根据权利要求7所述的装置,其特征在于,所述结构属性还包括当前使用红区中非转发线程的个数字段;
所述更新单元具体用于,如果所述线程为非转发线程,则通过已创建的全局变量,确定所述红区中的所述当前使用红区;
更新所述当前使用红区中非转发线程的个数字段。
10.根据权利要求8或9所述的装置,其特征在于,所述线程变量还包括进入红区计数字段以及线程所在红区字段;
所述更新单元还用于,当所述线程对数据进行访问时,根据所述当前使用红区,更新所述线程所在红区字段以及所述进入红区计数字段;
当所述线程再次对所述数据进行访问时,再次更新所述进入红区计数字段;
当所述数据对所述数据访问结束时,更新所述进入红区计数字段;
若所述进入红区计数字段对应的值为0时,则根据所述线程角色,更新所述当前使用红区中转发线程的状态字段或者所述当前使用红区中非转发线程的个数字段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010131073.XA CN111475264B (zh) | 2020-02-28 | 2020-02-28 | 一种用户态无锁转发的实现方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010131073.XA CN111475264B (zh) | 2020-02-28 | 2020-02-28 | 一种用户态无锁转发的实现方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111475264A true CN111475264A (zh) | 2020-07-31 |
CN111475264B CN111475264B (zh) | 2023-05-12 |
Family
ID=71748056
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010131073.XA Active CN111475264B (zh) | 2020-02-28 | 2020-02-28 | 一种用户态无锁转发的实现方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111475264B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116996438A (zh) * | 2023-09-22 | 2023-11-03 | 新华三技术有限公司 | 流表管理方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080281886A1 (en) * | 2007-05-08 | 2008-11-13 | Microsoft Corporation | Concurrent, lock-free object copying |
US20120192194A1 (en) * | 2011-01-21 | 2012-07-26 | Raymond Richardson | Lock Free Acquisition and Release of a Semaphore in a Multi-Core Processor Environment |
CN103294753A (zh) * | 2012-01-30 | 2013-09-11 | 辉达公司 | 无锁先入先出 |
CN104216767A (zh) * | 2014-09-18 | 2014-12-17 | 东软集团股份有限公司 | 多线程之间访问共享数据的方法及装置 |
CN106681836A (zh) * | 2016-12-28 | 2017-05-17 | 华为技术有限公司 | 一种信号量的创建方法及装置 |
CN109388499A (zh) * | 2017-08-04 | 2019-02-26 | 东软集团股份有限公司 | 报文转发方法及装置、计算机可读存储介质、电子设备 |
-
2020
- 2020-02-28 CN CN202010131073.XA patent/CN111475264B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080281886A1 (en) * | 2007-05-08 | 2008-11-13 | Microsoft Corporation | Concurrent, lock-free object copying |
US20120192194A1 (en) * | 2011-01-21 | 2012-07-26 | Raymond Richardson | Lock Free Acquisition and Release of a Semaphore in a Multi-Core Processor Environment |
CN103294753A (zh) * | 2012-01-30 | 2013-09-11 | 辉达公司 | 无锁先入先出 |
CN104216767A (zh) * | 2014-09-18 | 2014-12-17 | 东软集团股份有限公司 | 多线程之间访问共享数据的方法及装置 |
CN106681836A (zh) * | 2016-12-28 | 2017-05-17 | 华为技术有限公司 | 一种信号量的创建方法及装置 |
CN109388499A (zh) * | 2017-08-04 | 2019-02-26 | 东软集团股份有限公司 | 报文转发方法及装置、计算机可读存储介质、电子设备 |
Non-Patent Citations (4)
Title |
---|
周末: "DPDK结构下类Socket接口研究与设计", 《中国优秀硕士学位论文全文数据库-信息科技辑》 * |
孙明刚: "一种使用环形缓存和环形队列实现UDP高效并发的方法", 《中国新技术新产品》 * |
张宇: "基于DPDK的路由器用户态网络驱动的设计与实现", 《中国优秀硕士学位论文全文数据库-信息科技辑》 * |
黄益彬等: "网络数据包高性能并行处理技术研究", 《计算机与现代化》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116996438A (zh) * | 2023-09-22 | 2023-11-03 | 新华三技术有限公司 | 流表管理方法及装置 |
CN116996438B (zh) * | 2023-09-22 | 2023-12-22 | 新华三技术有限公司 | 流表管理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN111475264B (zh) | 2023-05-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9430388B2 (en) | Scheduler, multi-core processor system, and scheduling method | |
US6772155B1 (en) | Looking data in a database system | |
KR100910821B1 (ko) | 아토믹 명령어없이 많은 수의 프로세서들을 무리없이유연하게 처리하는 판독-복사 갱신 유예 기간 검출 방법 | |
US8924655B2 (en) | In-kernel SRCU implementation with reduced OS jitter | |
JP5142995B2 (ja) | メモリページ管理 | |
US20100325630A1 (en) | Parallel nested transactions | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US20060265373A1 (en) | Hybrid multi-threaded access to data structures using hazard pointers for reads and locks for updates | |
US20170308565A1 (en) | Locking concurrent commands in a database management system | |
JPH0318935A (ja) | データリストに対するアクセスの直列化方式 | |
US7865912B2 (en) | Method and system for managing tables that are used by network processors to control traffic through a network | |
CN111475264A (zh) | 一种用户态无锁转发的实现方法及装置 | |
US11741081B2 (en) | Method and system for data handling | |
CN111639076B (zh) | 一种跨平台高效键值存储方法 | |
US11138231B2 (en) | Method and system for data handling | |
CN115454653B (zh) | 一种基于嵌入式实时操作系统的rcu实现方法 | |
US11886343B2 (en) | Lock-free ring buffer | |
US20140173200A1 (en) | Non-blocking caching technique | |
US7904438B2 (en) | Updating first data value before second data value | |
JP5553685B2 (ja) | 情報処理装置および情報処理方法 | |
US20060156305A1 (en) | Multiple task access to an ordered data structure | |
CN111814007B (zh) | 双向链表数据处理方法、装置、设备及机器可读存储介质 | |
CN112667652B (zh) | 基于区块链的模拟交易方法、装置、设备和可读存储介质 | |
JP2011248469A (ja) | 情報処理装置および情報処理方法 | |
Lê | Kahn process networks as concurrent data structures: lock freedom, parallelism, relaxation in shared memory |
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 |