CN109543429A - 一种适用于期望链接的双链表保护方法及装置 - Google Patents
一种适用于期望链接的双链表保护方法及装置 Download PDFInfo
- Publication number
- CN109543429A CN109543429A CN201811391957.8A CN201811391957A CN109543429A CN 109543429 A CN109543429 A CN 109543429A CN 201811391957 A CN201811391957 A CN 201811391957A CN 109543429 A CN109543429 A CN 109543429A
- Authority
- CN
- China
- Prior art keywords
- target
- hash
- chained list
- node
- lock
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/604—Tools and structures for managing or administering access control systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Health & Medical Sciences (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Automation & Control Theory (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例示出一种适用于期望链接的双链表保护方法及装置,所述方法包括:将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;根据所述目标预置加锁规则,更新链表。可见本申请实施例示出的技术方案将一把全局锁拆分成多个普通锁和hash锁,对两个链表使用不同的锁进行保护,普通链表使用各自的普通锁,hash链表使用hash锁。并且为了解决使用不同锁保护时出现的锁嵌套死锁问题,通过预置加锁规则限制了加锁的先后顺序。在多个用户同时修改链表的环境下,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能,弥补了现有方式的不足。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种适用于期望链接的双链表保护方法及装置。
背景技术
ftp下载的过程中,因为ftp区分控制链接和数据链接,控制链接是由内网PC主动向外网的ftp服务器发起,数据链接可以是由外网的ftp服务器发起。因为在防火墙的存在,设备上会默认屏蔽外网主动发起的链接,所以设备需要解析控制链接的内容得到数据链接的特征,然后在收到外网主动发起的链接后,确定此链接是否存在匹配期望的数据链接的特征,如果存在,则对链接正常转发,否则才丢弃。为了提高匹配的效率,通常设备上需要创建一个期望链接的数据结构,此数据结构由控制链接触创建,通常此数据结构中会包含两个链表:一个hash链表一个普通链表。hash链表用于根据数据链接的特征能够快速查找到对应的期望链接,因为期望链接在创建时,先根据数据链接的特征hash计算一个索引值,再将此期望链接插入到索引值对应的链表上,这样在查找时,无需匹配所有期望链接,只需对相同索引值的部分期望链接进行比对。普通链表用于记录期望链接是属于哪条控制链接。为了确保期望链接的有效性,需要实时的更新所述期望链接的链表,所述更新包括:链表节点的增加,删除,以及,替换。
链表节点的增加或删除需要修改本节点的指针域和前、后节点的指针域,以确保各节点的指针域中记录的都是相邻节点。但本节点、前节点、后节点的指针域无法同时完成更新。在并发环境下,线程A正在增删节点M修改指针域时,若有线程B要增删节点M的前、后节点,很容易出现指针域被错误赋值的现象,导致节点指针域记录的不是相邻节点而是已删除节点或者其它节点,链表中各节点就不再连续,出现异常。所以在并发环境情况下,需要添加保护机制来避免链表增加或删除节点时的指针域异常。
通常采用锁保护的方法来避免指针域异常的问题的出现,现有技术示出两种锁保护的方案。方式一使用一把全局锁,在所有增删改查期望链接节点前进行加锁,在执行完毕后进行解锁。来避免多个线程同时增删同一个链表,指针域异常问题的出现。
方式二使用全局锁和RCU结合的方式,在增删改期望链接节点前进行加锁,在执行完毕后进行解锁;在查找使用期望链接节点时无需加锁,而是通过RCU的机制进行保护。
以方式一进行保护时,受锁保护限制,并发环境下在同一时刻只有一个线程被允许对期望链接进行增删改查的操作。随着硬件水平发展,CPU核数线程数越来越多,但受限于同一时刻只有一个线程被允许操作期望链接,程序性能将无法随着线程数的增长而提高。
以方式二进行保护时,在增删改期望链接节点不频繁时,加锁频率不高,程序性能可以随着线程数的增长而提高。但在复杂的大流量网络环境中,会有频繁的期望链接节点变更,从而出现大量锁冲突引起程序性能下降。
发明内容
本发明的发明目的在于提供一种适用于期望链接的双链表保护方法及装置,以解现有技术锁保护的方法存在的技术问题。
本申请实施例第一方面示出一种适用于期望链接的双链表保护方法,所述方法包括:
将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
根据所述目标预置加锁规则,更新链表。
可选择的,所述根据链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
确定所述链表更新指令对应待处理数据的类型;
如果所述待处理数据的类型为:插入期望链接节点,则确定插入加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除期望链接节点,则确定删除加锁规则为目标预置加锁规则。
可选择的,所述删除加锁规则包括:
如果所述待处理数据的类型为:删除预知期望链接节点,则确定预知删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除普通链表下的全部期望链接节点,则确定普通-全部删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除hash链表下的全部期望链接节点,则确定hash-全部删除加锁规则为目标预置加锁规则。
可选择的,所述插入加锁规则具体为:
根据所述链表更新指令,确定插入节点的内容;
根据所述插入节点的内容计算出插入索引值;
根据所述插入索引值确定目标插入hash链表,以及,目标插入普通链表;
将所述目标插入hash链表的hash锁加锁,将所述目标插入普通链表的普通锁加锁;
将所述插入节点挂在目标插入普通链表上,解锁所述目标插入普通链表的普通锁;
将所述插入节点挂在目标插入hash链表的链表头上,解锁所述目标插入hash链表的hash锁。
可选择的,所述预知删除加锁规则具体为:
使用原子操作对所述删除节点的内容设置删除标记;
判断所述删除标记是否设置成功;
若设置失败,直接退出;
若设置成功,根据所述链表更新指令,确定删除节点的内容;
根据所述删除节点的内容计算出删除索引值;
根据所述删除索引值确定第一目标删除hash链表,以及,目标删除普通链表;
将所述第一目标删除hash链表的hash锁加锁,将所述目标删除普通链表的普通锁加锁;
将所述删除节点从所述目标删除普通链表中删除,解锁所述目标删除普通链表的普通锁;
将所述删除节点从第一目标删除hash链表中删除,解锁所述第一目标删除hash链表的hash锁。
可选择的,所述普通-全部删除加锁规则具体为:
根据所述链表更新指令,确定目标普通链表头;
获取所述目标普通链表头第一个目标普通链接节点;
删除目标普通链接节点;
获取目标普通链表头的下一个目标普通链接节点;
删除目标普通链接节点;
直至从目标普通链表头上获取不到下一个目标普通链接节点。
可选择的,所述获取目标普通链表头的下一个目标普通链接节点的步骤包括:
使用RCU机制,遍历所述目标普通链表头,获取下一个目标普通链接节点。
可选择的,所述hash-全部删除加锁规则具体为:
根据所述链表更新指令,确定第二目标删除hash链表,对所述第二目标删除hash链表的hash锁加锁;
获取所述第二目标删除hash链表的第一个目标hash链表头;
获取所述目标hash链表头的第一个目标hash链接节点,对所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点;
再次获取所述目标hash链表头下一个目标hash链接节点,所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点,直至从目标hash链表头上获取不到下一个目标hash链接节点;
获取所述第二目标删除hash链表的下一个目标hash链表头,获取所述第二目标删除hash链表的下一个目标hash链表头,直至获取到第二目标删除hash链表最后一个链表头,解锁所述第二目标删除hash链表的hash锁。
可选择的,所述获取所述第二目标删除hash链表的下一个目标hash链表头的步骤具体为:
使用RCU机制,遍历目标hash链表头,获取第二目标删除hash链表的下一个目标hash链表头。
本申请实施例第二方面示出一种适用于期望链接的双链表保护装置,所述装置包括:
接收单元,用于将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
确定单元,用于根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
更新单元,用于根据所述目标预置加锁规则,更新链表。
由以上技术方案可知,本申请实施例示出一种适用于期望链接的双链表保护方法及装置,所述方法包括:将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;根据所述目标预置加锁规则,更新链表。可见本申请实施例示出的技术方案将一把全局锁拆分成多个普通锁和hash锁,对两个链表使用不同的锁进行保护,普通链表使用各自的普通锁,hash链表使用hash锁。并且为了解决使用不同锁保护时出现的锁嵌套死锁问题,通过预置加锁规则限制了加锁的先后顺序。在多个用户同时修改链表的环境下,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能,弥补了现有方式的不足。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为根据一优选实施例示出的一种适用于期望链接的双链表保护方法的流程图;
图2为根据一优选实施例示出的步骤S2的详细流程图;
图3为根据一优选实施例示出的步骤S22的详细流程图;
图4为根据一优选实施例示出的一种链表示意图;
图5为根据一优选实施例示出的步骤S23的详细流程图;
图6为根据又一优选实施例示出的步骤S23的详细流程图;
图7为根据又一优选实施例示出的一种链表示意图;
图8为根据再一优选实施例示出的步骤S23的详细流程图;
图9为根据一优选实施例示出的一种hash链表示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请实施例中,链表:是一种期望链接,由链表头和一组数据节点组成。每个节点包含两个部分,值域和指针域,值域中记录本节点的数据,指针域记录相邻节点的指针。
hash链表:是n个链表的集合。hash链表使用节点的某个数据特征作为索引值,将具有相同索引值的节点插入到本索引值对应的链表上。这样当要获取某个特定节点时,先根据要获取的数据特征计算一个索引值,根据索引值得到特定节点所在的链表,再遍历此链表上的节点进行数据匹配,即可找到特定节点。
会话:用于标识一条报文流的期望链接,存储在网络设备上,由报文流的首个报文触发会话的创建,后续报文通过匹配会话,执行与首个报文相同的转发动作。
期望链接:是linux系统里一种与会话相关的数据结构。
RCU(Read-Copy Update)是数据同步的一种方式,主要针对的数据对象是链表,目的是允许节点的只读操作不加锁保护,提高遍历读取数据的效率。在节点删除时,通过延迟释放已删除节点的方式,确保只读操作仍能读取数据不会异常;在节点修改时,通过用新节点替换旧节点的方式,允许新旧节点临时同时存在,确保只读操作不会异常。
实施例1:
为了解决现有技术存在的技术问题,本申请时实施例示出一种适用于期望链接的双链表保护方法,具体的,请参阅图1,所述方法包括:
S1将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
S2根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
其中,所述待处理数据的类型包括:待处理数据的更新类型,以及,所述待处理数据所属的链表类型;
根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则的步骤具体为:请参阅图2:
S21确定所述链表更新指令对应待处理数据的类型;
S22如果所述待处理数据的类型为:插入期望链接节点,则确定插入加锁规则为目标预置加锁规则;
S23如果所述待处理数据的类型为:删除期望链接节点,则确定删除加锁规则为目标预置加锁规则。
其中,所述删除加锁规则包括3种情况,具体的:
如果所述待处理数据的类型为:删除预知期望链接节点,则确定预知删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除普通链表下的全部期望链接节点,则确定普通-全部删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除hash链表下的全部期望链接节点,则确定hash-全部删除加锁规则为目标预置加锁规则。
S3根据所述目标预置加锁规则,更新链表。
具体的,目标预置加锁规则为:
网络设备监听ftp控制链接的内容得到pc到ftp服务器的数据链接将是1.1.1.1:5678->1.1.1.254:2321(tcp),就会创建一个期望链接。此期望链接数据节点将挂在hash链表的“hash链表头”和控制链接的“普通链表头”上。
先根据hash计算,得到索引值,再对“hash锁”加锁,再对“普通锁”加锁,再将期望链接节点(对应待处理数据)插入“普通链表”,对“普通锁”解锁,再将期望链接节点插入“hash链表”,对“hash锁”解锁。
网络设备收到外网ftp服务器发过来的数据链接时,先进行期望链接的匹配。先根据数据链接进行hash计算,得到索引值,得到“hash链表头”,开始使用RCU机制遍历链表匹配期望链接节点的内容是否与数据链接相同,相同则认为匹配成功。
匹配成功后,此期望链接节点的将被删除。先使用原子操作atomic_cmpxchg()对节点内容中的删除标记进行设置,若设置失败,则说明节点正被其它线程删除,直接退出。设置成功则先根据目标预置加锁规则对“hash锁”加锁,再对控制链接的“普通锁”加锁,再将节点从控制链接的“普通链表”里摘除,再对控制链接的“普通锁”解锁,再将节点从“hash链表”里摘除,再对“hash锁”解锁。然后使用kfree_rcu()对节点进行延迟释放。
可见本申请实施例示出的技术方案根据链表更新指令对应待处理数据的类型的不同制定一系列预置加锁规则,在对待处理链表更新的过程,根据目标预置加锁规则的加锁先后顺序,即使在多用户并行更改链表的环境下,也不会出现的锁嵌套死锁问题,能够降低因期望链接锁冲突引起的CPU等待,充分利用各CPU的计算能力,尽可能使程序性能能够随着线程数的增加呈现线性增长。
本申请实施例示出的技术方案将一把全局锁拆分成多个普通锁和hash锁,对两个链表使用不同的锁进行保护,普通链表使用各自的普通锁,hash链表使用hash锁。并且为了解决使用不同锁保护时出现的锁嵌套死锁问题,通过预置加锁规则限制了加锁的先后顺序。在多个用户同时修改链表的环境下,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能,弥补了现有方式的不足。
实施例2:hash链表插入在期望链接节点:
请参阅图3,实施例2示出的技术方案与实施例1示出的技术方案具有相似的步骤,唯一的区别在于实施例1示出的技术方案中所述插入加锁规则具体为:
S221根据所述链表更新指令,确定插入节点的内容;
S222根据所述插入节点的内容计算出插入索引值;
本申请实施例示出的技术方案采用hash算法计算出插入索引值;
举例说明,请参阅图4,图4为现有技术示出的链表,其中包括:hash链表1-hash链表n,以及,普通链表,图中普通链表以普通链表头,以及,链表节点方式表示;
S223根据所述插入索引值确定目标插入hash链表,以及,目标插入普通链表;
采用hash算法计算出插入索引值为:姓名=张三,确定hash链表1为目标插入Hash链表;
目标插入普通链表的指针域分别为图4中的链接节点11-链接节点1n,为了方便描述,在本申请实施例中,链接节点11-链接节点1n即为目标插入普通链表;
S224将所述目标插入hash链表的hash锁加锁,将所述目标插入普通链表的普通锁加锁;
hash链表1的hash锁加锁,链接节点11的普通锁加锁;
S225将所述插入节点挂在目标插入普通链表上,解锁所述目标插入普通链表的普通锁;
将所述链表更新指令中插入节点挂在所述链接节点11上;解锁所述链接节点11的普通锁;
然后,将链接节点12的普通锁加锁,将所述链表更新指令中插入节点挂在所述链接节点12上;解锁所述链接节点12的普通锁,依次类推,直至将链接节点1n的普通锁加锁,将所述链表更新指令中插入节点挂在所述链接节点1n上;解锁所述链接节点1n的普通锁。
S226将所述插入节点挂在目标插入hash链表的链表头上。
将所述链表更新指令中插入节点挂在hash链表1的链表头上,解锁所述hash链表1的hash锁。
如果采用现有技术示出的技术方案,直接将hash链表1的hash锁,链接节点11-链接节点1n的普通锁加锁;
待将所述链表更新指令中插入节点全部挂在hash链表1链表头上,以及,链接节点11-链接节点1n的操作完成后,再进行解锁工作。显然,并发环境下在同一时刻只有一个线程被允许对期望链接进行增删改查的操作。随着硬件水平发展,CPU核数线程数越来越多,但受限于同一时刻只有一个线程被允许操作期望链接,程序性能将无法随着线程数的增长而提高。
相比较之下,本申请实施例示出的技术方案,对于链接节点11-链接节点1n每个链接节点处理后,立即解锁,解锁后的链表节点可被其他线程组操作,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能。
现有技术示出的另一个方案为:hash链表1加锁,插入节点挂在目标插入hash链表的链表头上,hash链表1解锁,链接节点11加锁,插入节点挂在目标插入链接点11链接节点11解锁,hash链表1加锁,插入节点挂在目标插入hash链表的链表头上,hash链表1解锁,链接节点12加锁,插入节点挂在目标插入链接点12链接节点12解锁,直至链接节点1n加锁,插入节点挂在目标插入链接点1n链接节点1n解锁。
在增删改期望链接节点不频繁时,加锁频率不高,现有技术频繁的对hash链表1加锁,解锁尚可以实现。但在复杂的大流量网络环境中,会有频繁的期望链接节点变更,从而出现大量锁冲突引起程序性能下降。
本申请实施例示出的技术方案,通过设置hash锁和普通锁,并限定限制了加锁,解锁的先后顺序,在一定程度上,降低了hash链表加锁解锁的次数,低锁冲突引起的等待,使程序有更好的性能。本发明对现有期望链接的双链表保护方式进行改进,弥补了现有方式的不足。
实施例3:删除链表中一个已知(预知)的期望链接节点:
请参阅图5,实施例3示出的技术方案与实施例1示出的技术方案具有相似的步骤,唯一的区别在于实施例1示出的技术方案中所述删除预知加锁规则具体为:
S2311使用原子操作对所述删除节点的内容设置删除标记;
S2312判断所述删除标记是否设置成功;
S2313若设置失败,直接退出;
S2314若设置成功,根据所述链表更新指令,确定删除节点的内容;
为了避免同一个节点被重复摘链的问题,使用原子操作atomic_cmpxchg对待删除节点内容中的删除标记进行设置。若设置成功,则说明此节点可以删除,可以进行下一步骤。若设置失败,则说明有其它线程正在删除此节点,无需重复删除,直接退出。
S2315根据所述删除节点的内容计算出删除索引值;
本申请实施例示出的技术方案采用hash算法计算出删除索引值;
S2316根据所述删除索引值确定第一目标删除Hash链表,以及,目标删除普通链表;
请继续参阅图4采用hash算法计算出删除索引值为:年龄=33岁
hash链表2的索引为:姓名=A,年龄=33岁,职业=工人。
删除节点对应的内容为:年龄=33岁
确定hash链表2为目标删除hash链表;
第一目标删除普通链表的指针域分别为:图4中的链接节点21-链接节点2n;为了方便描述,在本申请实施例中,链接节点21-链接节点2n即为第一目标删除普通链表。
S2317将所述第一目标删除hash链表的hash锁加锁,将所述目标删除普通链表的普通锁加锁;
对hash链表2的hash锁加锁,对链接节点21的普通锁加锁;
S2318将所述删除节点从所述目标删除普通链表中删除,解锁所述目标删除普通链表的普通锁;
将所述删除节点对应的内从链接节点21中删除,解锁所述链接节点21的普通锁;
然后对链接节点22的普通锁加锁,将所述删除节点对应的内容重链接节点21中删除,依次类推,直至对链接节点22的普通锁加锁,将删除节点对应的内容从链接节点2n;解锁所述链接节点2n的普通锁。
S2319将所述删除节点从第一目标删除hash链表中删除,解锁所述第一目标删除hash链表的hash锁。
将删除节点对应的内容从hash链表2中删除,解锁所述hash链表2的hash锁。
相比较之下,本申请实施例示出的技术方案,对于链接节点21-链接节点2n每个链接节点处理后,立即解锁;解锁后的链表节点可继续被处理,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能。
本申请实施例示出的技术方案,通过设置hash锁和普通锁,并限定限制了加锁,解锁的先后顺序,在一定程度上,降低了hash链表加锁解锁的次数,低锁冲突引起的等待,使程序有更好的性能。本发明对现有期望链接的双链表保护方式进行改进,弥补了现有方式的不足。
实施例4:
请参阅图6,实施例4示出的技术方案与实施例1示出的技术方案具有相似的步骤,唯一的区别在于实施例1示出的技术方案中所述普通-全部删除加锁规则具体为:
S2321根据所述链表更新指令,确定目标普通链表头;
请继续参阅图4,根据链表更新指令,确定目标普通链表头为员工职位链表,即普通链表头1;
S2322获取所述目标普通链表头第一个目标普通链接节点;
普通链表头1的第一个目标普通链接节点为链接节点11;
S2323删除目标普通链接节点;
删除链接节点11;
S2324获取目标普通链表头的下一个目标普通链接节点;
此时对应的链表为图7所示。显然普通链表头1下一个目标普通链接节点为链接节点21;
S2325删除目标普通链接节点;
删除链接节点21;
S2326直至从目标普通链表头上获取不到下一个目标普通链接节点。
依次类推直至删除链接节点n1
可选择的,所述获取目标普通链表头的下一个目标普通链接节点的步骤包括:
使用RCU机制,遍历所述目标普通链表头,获取下一个目标普通链接节点。
本申请实施例示出的技术方案中RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率。
例如:在读取过程中,另外一个线程删除了一个节点。删除线程可以把这个节点从链表中移除,但它不能直接销毁这个节点,必须等到所有的读取线程读取完成以后,才进行销毁操作。RCU中把这个过程称为宽限期(Grace period),避免用户在读取的过程中受到干扰。
在读取过程中,另外一个线程插入了一个新节点,而读线程读到了这个节点,那么需要保证读到的这个节点是完整的。RCU机制保证了这个节点是完整的。
保证读取链表的完整性。新增或者删除一个节点,不至于导致遍历一个链表从中间断开。
实施例5:
请参阅图8,实施例5示出的技术方案与实施例1示出的技术方案具有相似的步骤,唯一的区别在于实施例1示出的技术方案中所述hash-全部删除加锁规则具体为:
S2331根据所述链表更新指令,确定第二目标删除hash链表,对所述第二目标删除hash链表的hash锁加锁;
请参阅图9;根据链表更新指令,确定第二目标删除hash链表为hash链表4;
S2332获取所述第二目标删除hash链表的第一个目标hash链表头;
hash链表4的第一个目标hash链表头,hash链表头1;
S2333获取所述目标hash链表头的第一个目标hash链接节点,对所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点;
hash链表头1第一个目标hash链接节点为链接节点12’;
对所述hash链表4的hash锁加锁。对所述链接节点12’的普通锁加锁;
S2334再次获取所述目标hash链表头下一个目标hash链接节点,所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点,直至从目标hash链表头上获取不到下一个目标hash链接节点;
删除链接节点12’,解锁所述链接节点12’的普通锁;
对所述链接节点13’加锁,删除链接节点13’,解锁所述链接节点13’的普通锁;依次类推直至,对所述链接节点1n’加锁,删除链接节点1n’,解锁所述链接节点1n’。
S2335获取所述第二目标删除hash链表的下一个目标hash链表头,直至获取到第二目标删除hash链表最后一个链表头,解锁所述第二目标删除hash链表的hash锁。
hash链表4的下一个目标hash链表头,hash链表头2;hash链表头2第一个目标hash链接节点为链接节点22’;对链接节点22’的普通锁加锁。,删除链接节点22’,解锁链接节点22’的普通锁,,对链接节点23’,删除链接节点23’,解锁链接节点23’的普通锁;依次类推直至对链接节点2n’,删除链接节点2n’,解锁链接节点2n’。直至获取到第二目标删除hash链表最后一个链表头,完成整个hash链表节点的删除,解锁所述第二目标删除hash链表的hash锁。
可选择的,所述获取所述第二目标删除hash链表的下一个目标hash链表头的步骤具体为:
使用RCU机制,遍历目标hash链表头,获取第二目标删除hash链表的下一个目标hash链表头。
本申请实施例第二方面示出一种适用于期望链接的双链表保护装置,所述装置包括:
接收单元,用于将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
确定单元,用于根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
更新单元,用于根据所述目标预置加锁规则,更新链表。
由以上技术方案可知,本申请实施例示出一种适用于期望链接的双链表保护方法及装置,所述方法包括:将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;根据所述目标预置加锁规则,更新链表。可见本申请实施例示出的技术方案将一把全局锁拆分成多个普通锁和hash锁,对两个链表使用不同的锁进行保护,普通链表使用各自的普通锁,hash链表使用hash锁。并且为了解决使用不同锁保护时出现的锁嵌套死锁问题,通过预置加锁规则限制了加锁的先后顺序。在多个用户同时修改链表的环境下,能够充分利用各CPU的计算能力,降低锁冲突引起的等待,使程序有更好的性能,弥补了现有方式的不足。
同时,为了避免同一个节点被重复摘链的问题,增加了原子操作的删除标记;为了避免多线程同时摘除两个连续的节点时链表异常问题,增加删除节点重遍历的机制。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
值得注意的是,具体实现中,本申请还提供一种计算机存储介质,其中,该计算机存储介质可存储有程序,该程序执行时可包括本申请提供的用户身份的服务提供方法或用户注册方法的各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(英文:read-only memory,简称:ROM)或随机存储记忆体(英文:random accessmemory,简称:RAM)等。
本领域的技术人员可以清楚地了解到本申请实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于用户身份的服务提供装置或用户注册装置的实施例而言,由于其基本相似于方法实施例,所以描述的比对简单,相关之处参见方法实施例中的说明即可。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性更新,这些变型、用途或者适应性更新遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
Claims (10)
1.一种适用于期望链接的双链表保护方法,其特征在于,所述方法包括:
将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
根据所述目标预置加锁规则,更新链表。
2.根据权利要求1所述的双链表保护方法,其特征在于,所述根据链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
确定所述链表更新指令对应待处理数据的类型;
如果所述待处理数据的类型为:插入期望链接节点,则确定插入加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除期望链接节点,则确定删除加锁规则为目标预置加锁规则。
3.根据权利要求2所述的双链表保护方法,其特征在于,所述删除加锁规则包括:
如果所述待处理数据的类型为:删除预知期望链接节点,则确定预知删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除普通链表下的全部期望链接节点,则确定普通-全部删除加锁规则为目标预置加锁规则;
如果所述待处理数据的类型为:删除hash链表下的全部期望链接节点,则确定hash-全部删除加锁规则为目标预置加锁规则。
4.根据权利要求2所述的双链表保护方法,其特征在于,所述插入加锁规则具体为:
根据所述链表更新指令,确定插入节点的内容;
根据所述插入节点的内容计算出插入索引值;
根据所述插入索引值确定目标插入hash链表,以及,目标插入普通链表;
将所述目标插入hash链表的hash锁加锁,将所述目标插入普通链表的普通锁加锁;
将所述插入节点挂在目标插入普通链表上,解锁所述目标插入普通链表的普通锁;
将所述插入节点挂在目标插入hash链表的链表头上,解锁所述目标插入hash链表的hash锁。
5.根据权利要求3所述的双链表保护方法,其特征在于,所述预知删除加锁规则具体为:
使用原子操作对所述删除节点的内容设置删除标记;
判断所述删除标记是否设置成功;
若设置失败,直接退出;
若设置成功,根据所述链表更新指令,确定删除节点的内容;
根据所述删除节点的内容计算出删除索引值;
根据所述删除索引值确定第一目标删除hash链表,以及,目标删除普通链表;
将所述第一目标删除hash链表的hash锁加锁,将所述目标删除普通链表的普通锁加锁;
将所述删除节点从所述目标删除普通链表中删除,解锁所述目标删除普通链表的普通锁;
将所述删除节点从第一目标删除hash链表中删除,解锁所述第一目标删除hash链表的hash锁。
6.根据权利要求3所述的双链表保护方法,其特征在于,所述普通-全部删除加锁规则具体为:
根据所述链表更新指令,确定目标普通链表头;
获取所述目标普通链表头第一个目标普通链接节点;
删除目标普通链接节点;
获取目标普通链表头的下一个目标普通链接节点;
删除目标普通链接节点;
直至从目标普通链表头上获取不到下一个目标普通链接节点。
7.根据权利要求6所述的双链表保护方法,其特征在于,所述获取目标普通链表头的下一个目标普通链接节点的步骤包括:
使用RCU机制,遍历所述目标普通链表头,获取下一个目标普通链接节点。
8.根据权利要求3所述的双链表保护方法,其特征在于,所述hash-全部删除加锁规则具体为:
根据所述链表更新指令,确定第二目标删除hash链表,对所述第二目标删除hash链表的hash锁加锁;
获取所述第二目标删除hash链表的第一个目标hash链表头;
获取所述目标hash链表头的第一个目标hash链接节点,对所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点;
再次获取所述目标hash链表头下一个目标hash链接节点,所述目标hash链接节点加锁,删除目标hash链接节点,解锁所述目标hash链接节点,直至从目标hash链表头上获取不到下一个目标hash链接节点;
获取所述第二目标删除hash链表的下一个目标hash链表头,获取所述第二目标删除hash链表的下一个目标hash链表头,直至获取到第二目标删除hash链表最后一个链表头,解锁所述第二目标删除hash链表的hash锁。
9.根据权利要求8所述的双链表保护方法,其特征在于,所述获取所述第二目标删除hash链表的下一个目标hash链表头的步骤具体为:
使用RCU机制,遍历目标hash链表头,获取第二目标删除hash链表的下一个目标hash链表头。
10.一种适用于期望链接的双链表保护装置,其特征在于,所述装置包括:
接收单元,用于将期望链接的全局锁,拆分为普通锁,以及,hash锁,接收链表更新指令;
确定单元,用于根据所述链表更新指令对应待处理数据的类型,确定目标预置加锁规则;
更新单元,用于根据所述目标预置加锁规则,更新链表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811391957.8A CN109543429A (zh) | 2018-11-21 | 2018-11-21 | 一种适用于期望链接的双链表保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811391957.8A CN109543429A (zh) | 2018-11-21 | 2018-11-21 | 一种适用于期望链接的双链表保护方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109543429A true CN109543429A (zh) | 2019-03-29 |
Family
ID=65848677
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811391957.8A Pending CN109543429A (zh) | 2018-11-21 | 2018-11-21 | 一种适用于期望链接的双链表保护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109543429A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111083075A (zh) * | 2019-12-20 | 2020-04-28 | 盛科网络(苏州)有限公司 | 多核SoC处理报文的方法及应用其的SoC |
CN111814007A (zh) * | 2020-07-31 | 2020-10-23 | 新华三信息安全技术有限公司 | 双向链表数据处理方法、装置、设备及机器可读存储介质 |
CN112698956A (zh) * | 2021-01-19 | 2021-04-23 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101771600A (zh) * | 2008-12-30 | 2010-07-07 | 北京天融信网络安全技术有限公司 | 多核下连接并发处理的方法 |
CN104363174A (zh) * | 2014-11-12 | 2015-02-18 | 迈普通信技术股份有限公司 | 一种连接跟踪管理装置和方法 |
US20170308466A1 (en) * | 2016-04-21 | 2017-10-26 | Dell Products L.P. | Method and system for implementing lock free shared memory with single writer and multiple readers |
CN107783988A (zh) * | 2016-08-26 | 2018-03-09 | 阿里巴巴集团控股有限公司 | 一种目录树的加锁方法及设备 |
CN107862064A (zh) * | 2017-11-16 | 2018-03-30 | 北京航空航天大学 | 一个基于nvm的高性能、可扩展的轻量级文件系统 |
-
2018
- 2018-11-21 CN CN201811391957.8A patent/CN109543429A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101771600A (zh) * | 2008-12-30 | 2010-07-07 | 北京天融信网络安全技术有限公司 | 多核下连接并发处理的方法 |
CN104363174A (zh) * | 2014-11-12 | 2015-02-18 | 迈普通信技术股份有限公司 | 一种连接跟踪管理装置和方法 |
US20170308466A1 (en) * | 2016-04-21 | 2017-10-26 | Dell Products L.P. | Method and system for implementing lock free shared memory with single writer and multiple readers |
CN107783988A (zh) * | 2016-08-26 | 2018-03-09 | 阿里巴巴集团控股有限公司 | 一种目录树的加锁方法及设备 |
CN107862064A (zh) * | 2017-11-16 | 2018-03-30 | 北京航空航天大学 | 一个基于nvm的高性能、可扩展的轻量级文件系统 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111083075A (zh) * | 2019-12-20 | 2020-04-28 | 盛科网络(苏州)有限公司 | 多核SoC处理报文的方法及应用其的SoC |
CN111814007A (zh) * | 2020-07-31 | 2020-10-23 | 新华三信息安全技术有限公司 | 双向链表数据处理方法、装置、设备及机器可读存储介质 |
CN111814007B (zh) * | 2020-07-31 | 2023-03-31 | 新华三信息安全技术有限公司 | 双向链表数据处理方法、装置、设备及机器可读存储介质 |
CN112698956A (zh) * | 2021-01-19 | 2021-04-23 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
CN112698956B (zh) * | 2021-01-19 | 2024-04-12 | 腾讯科技(深圳)有限公司 | 一种数据对象处理方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109543429A (zh) | 一种适用于期望链接的双链表保护方法及装置 | |
JP5186390B2 (ja) | ノードの番号付けによるファイル・システムのダンプ/復元のための方法、システム、およびデバイス | |
US6772155B1 (en) | Looking data in a database system | |
CN107391628A (zh) | 数据同步方法及装置 | |
US20100306236A1 (en) | Data Policy Management System and Method for Managing Data | |
CN104067219B (zh) | 确定用于作业复制在存储装置上存储的对象的时间表 | |
CN104657672B (zh) | 用于对表的预定义部分存档的方法和系统 | |
US7809762B1 (en) | Outage-less database change operation | |
CN110018989A (zh) | 一种快照比对的方法和装置 | |
US20080320494A1 (en) | Data processing method, data processing apparatus, and data processing program | |
CN106598746A (zh) | 分布式系统中全局锁的实现方法及装置 | |
CN110909087A (zh) | 一种关系型数据库在线ddl修改表结构的方法和装置 | |
CN107992763B (zh) | 一种文件系统的掉电保护方法及装置 | |
CN106407376A (zh) | 重建索引方法及装置 | |
US7051051B1 (en) | Recovering from failed operations in a database system | |
JP2007323566A (ja) | 文書管理システム、文書管理サーバ、文書管理方法 | |
US10747438B1 (en) | Reporting using archived data | |
US10713226B1 (en) | Managing data using archiving | |
JPH03132834A (ja) | データベースのアクセス・プランの選択方法及び無効方法 | |
KR100243113B1 (ko) | 데이터베이스 관리 시스템에서 에스큐엘 수준의갱신 연산의 원자성 보장 방법 | |
EP0394172A2 (en) | Method of performing file services given partial file names | |
US10747461B1 (en) | Updating objects for archived objects | |
De La Puente et al. | Distributed execution of specifications | |
EP1872202A2 (en) | Method and system for optimizing operations on memory device | |
JP3112628B2 (ja) | 事例ベースの処理方法 |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190329 |
|
RJ01 | Rejection of invention patent application after publication |