CN111723250A - 一种基于引用计数的链表管理方法 - Google Patents
一种基于引用计数的链表管理方法 Download PDFInfo
- Publication number
- CN111723250A CN111723250A CN202010441419.6A CN202010441419A CN111723250A CN 111723250 A CN111723250 A CN 111723250A CN 202010441419 A CN202010441419 A CN 202010441419A CN 111723250 A CN111723250 A CN 111723250A
- Authority
- CN
- China
- Prior art keywords
- linked list
- count value
- thread
- reference count
- value
- 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
- 238000007726 management method Methods 0.000 title claims abstract description 33
- 230000015654 memory Effects 0.000 claims abstract description 30
- 238000000034 method Methods 0.000 claims abstract description 24
- 230000008569 process Effects 0.000 claims abstract description 22
- 238000011084 recovery Methods 0.000 claims abstract description 21
- 238000000889 atomisation Methods 0.000 claims abstract description 8
- 238000004064 recycling Methods 0.000 claims description 5
- 230000007423 decrease Effects 0.000 claims 1
- 230000007246 mechanism Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 3
- 230000006872 improvement Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种基于引用计数的链表管理方法,设置一个引用计数值和一个受引用计数保护的链表,链表中的结点至少包含一个链接指针,结点与结点之间通过链接指针连接起来。还包括多个访问线程同时从链表读取数据,一个管理线程负责对链表添加或删除结点,以及一个回收线程将被删除结点的内存资源释放。初始状态下引用计数值为1表示管理线程对链表的初始引用计数,访问线程在读取链表中的数据前先将引用计数值原子化的加2,若在加2之前引用计数值不为0则完成读链表数据的过程后将引用计数值原子化的减2,若在加2之前引用计数值为0则完成读链表数据的过程后将引用计数值原子化的减1。
Description
技术领域
本发明涉及计算机***软件编程领域,特别是一种基于引用计数的链表管理方法。
背景技术
在计算机***里链表是常用的数据结构,通常多个线程同时访问读取链表每个结点的数据是没有问题的,不存在多个线程之间的访问冲突的数据异常。当多个线程同时对链表添加或删除结点时,则需要使用锁(Lock)机制来保证链表结构的完整性,即当一个线程成功获得锁后才能对链表结构进行修改。常规的锁将导致任何时候只能有一个线程在访问或修改链表,效率将会大大降低。目前常用的改进方案是使用读写锁(RWLock),多个线程可以同时以读方式获取读写锁对链表进行读数据访问,只能有一个线程以写方式获取读写锁对链表结构进行修改,且一个线程以写方式获取读写锁时其他线程不能以读方式获取读写锁,必须等链表结构修改完并释放写锁后才能再次获取读锁。虽然理论上使用一个单独的管理线程专门负责对链表结构进行修改,其他线程可以同时访问并读取链表中的数据且不需要任何锁机制的保护,但这样会衍生出另一个问题,管理线程向链表添加结点是绝对安全的,而删除结点的实际过程最终会将被删除结点的内存资源释放,如果这时有一个线程还在访问和读取这个结点的数据将会导致无效内存访问。
发明内容
本发明的目的是克服现有技术的上述不足而提供一种基于引用计数的链表管理方法,使用原子化的引用计数维持读数据访问期间每个结点的内存有效性,保证在任何时候访问线程在读取链表中的数据时是无须等待且内存访问安全的。
本发明的技术方案是:设置一个引用计数值和一个与引用计数值相关联的链表,链表中的结点至少包含一个链接指针,结点与结点之间通过链接指针连接起来。还包括多个访问线程同时从链表读取数据,一个管理线程负责对链表添加或删除结点,以及一个回收线程将被删除结点的内存资源释放。初始状态下引用计数值为1表示管理线程对链表的初始引用计数,访问线程在读取链表中的数据前先将引用计数值原子化的加2表示为当前访问线程和管理线程对链表同时各增加1个引用计数。若在加2之前引用计数值不为0则完成读链表数据的过程后将引用计数值原子化的减2,表示为当前访问线程和管理线程对链表同时各减少1个引用计数。若在加2之前引用计数值为0则完成读链表数据的过程后将引用计数值原子化的减1,表示仅减少访问线程对链表的引用同时恢复管理线程对链表的初始引用。当引用计数值减为0时,通知回收线程将被删除结点的内存资源释放。回收线程完成内存资源释放的过程后,使用原子比较并交换(CAS)操作判断引用计数值是否为0,若引用计数值为0则原子化的替换为初始值1。
管理线程在删除链表中的结点时,将被删除结点之前的结点的链接指针指向被删除结点之后的结点,同时保留被删除结点的链接指针不变。如果此时有访问线程仍在读取被删除结点的数据,则不会影响访问线程通过该结点的链接指针继续访问下一个结点。直到访问线程完成读取链表数据的过程,引用计数值减为0时,才会通知回收线程将被删除结点的内存资源释放。
管理线程在删除链表中的结点后,先将被删除的结点缓存起来并唤醒挂起的回收线程来释放这些结点的内存。回收线程将删除的结点取出,然后将引用计数值原子化的减1。若减1后引用计数值为0说明没有访问线程在读取链表中的数据,开始释放被删除结点的内存资源。若减1后引用计数值不为0说明还有访问线程在读取链表中的数据,回收线程挂起并等待访问线程完成读链表数据的过程。
本发明与现有技术相比具有如下有益效果:发明阐述一种基于引用计数的链表管理方法,在不使用任何锁的情况下,管理线程对链表添加或删除结点的同时,能保证其他访问线程无障碍的读取链表中的数据,且不会导致无效内存访问的情况发生,提高了***运行的整体响应能力。
以下结合附图和具体实施方式对本发明的详细结构作进一步描述。
附图说明
附图1为第一个访问线程开始读链表数据,管理线程开始删除结点;
附图2为第一个访问线程仍在访问被删除的结点;
附图3为回收线程准备释放被删除结点的内存资源;
附图4为第一个访问线程完成读链表数据的过程,通知回收线程开始释放被删除的结点;
附图5为第二个访问线程开始读链表数据;
附图6为第二个访问线程完成读链表数据的过程。
具体实施方式
如附图1所示:链表包含A、B、C、D四个结点。第一个访问线程在读取链表数据之前,先将引用计数值原子化的加2。引用计数值初始值为1,加2后变为3。管理线程开始删除结点B,第一个访问线程正在访问结点A。
如附图2所示:结点B被管理线程从链表中删除,使结点A的链接指针直接指向结点C,但结点B的链接指针依然保留指向结点C。此时第一个访问线程正在访问结点B,访问线程仍然可以通过结点B的链接指针继续访问结点C。管理线程在删除结点B后通知回收线程开始释放结点B的内存资源。
如附图3所示:回收线程在释放结点B的内存资源之前,先将引用计数值原子化的减1,减1后不为0说明还有访问线程在读取链表数据,回收线程挂起等待访问线程完成读链表数据的过程。此时第一个访问线程正在访问结点C。
如附图4所示:第一个访问线程完成对结点D的访问后,结束读链表数据的过程,然后将引用计数值原子化的减2,减2后为0说明没有其他线程在访问链表,通知回收线程开始释放结点B的内存资源。
如附图5所示:回收线程正在释放结点B的内存资源,第二个访问线程开始读取链表数据,并将引用计数值原子化的加2。因加2之前引用计数值为0,所以在完成读取链表数据的过程后将引用计数值原子化的减1。由于结点B在此前已经删除,访问线程不会再访问到结点B。
如附图6所示:回收线程在释放结点B的内存资源后,使用原子比较并交换操作判断引用计数值是否为0,因为计数值不为0所以不会原子化的替换为1。第二个访问线程完成对结点D的访问后,结束读链表数据的过程,然后将引用计数值原子化的减1,恢复了管理线程对链表的初始引用计数。
本发明涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本发明中使用的原子加操作和原子比较并交换(CAS)操作在Intel x86处理器平台上可以用LOCK XADD指令和LOCK CMPXCHG指令实现,其中LOCK XADD指令的功能也可用LOCK CMPXCHG指令加条件循环来替代,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本发明的范畴。
名词解释:
锁机制:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。
读写锁:读写锁是对常规锁机制的一种改进,读写锁允许多个线程以只读方式获得读锁,同时对共享资源的数据进行并发读访问。而只允许一个线程以写方式获得写锁,对共享资源的数据进行修改,包括修改数据结构。写访问必须在所有读访问都释放读锁后才能获取写锁,同样读访问必须等待修改操作释放写锁后才能获取读锁。
CAS 操作:上面的原子比较并交换用到的机制就是CAS,Compare and Swap。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
Claims (6)
1.一种基于引用计数的链表管理方法,其特征是:设置一个引用计数值和一个与引用计数值相关联的链表,链表中的结点至少包含一个链接指针,结点与结点之间通过链接指针连接起来,引用计数值初始值为X,且X不为0;还包括多个访问线程,一个管理线程,以及一个回收线程;访问线程在读取链表中的数据前先将引用计数值原子化的增加,在完成从链表读取数据的过程后再将引用计数值原子化的减少;当引用计数值减为0时,通知回收线程将被删除结点的内存资源释放。
2.根据权利要求1所述的一种基于引用计数的链表管理方法,其特征是:管理线程从链表删除结点后,先将被删除的结点缓存起来,然后通知回收线程来取被删除的结点释放内存资源。
3.根据权利要求1所述的一种基于引用计数的链表管理方法,其特征是:回收线程在释放被删除结点的内存资源之前先将引用计数值原子化的减去初始值X,若减去X后不为0,则挂起回收线程等待访问线程完成读取链表数据的过程,若减去X后为0,则开始释放被删除结点的内存资源;回收线程完成内存资源释放的过程后,使用原子比较并交换操作判断引用计数值是否为0,若引用计数值为0则原子化的替换为初始值X。
4.根据权利要求1至3任一项所述的一种基于引用计数的链表管理方法,其特征是:引用计数值初始值为1,访问线程在读取链表中的数据前先将引用计数值原子化的加2,若在加2之前引用计数值不为0则完成读链表数据的过程后将引用计数值原子化的减2,若在加2之前引用计数值为0则完成读链表数据的过程后将引用计数值原子化的减1;当引用计数值减为0时,通知回收线程将被删除结点的内存资源释放。
5.根据权利要求4所述的一种基于引用计数的链表管理方法,其特征是:回收线程取出被删除结点后,先将引用计数值原子化的减1,若减1后引用计数值不为0则挂起回收线程并等待访问线程完成读链表数据的过程,若减1后引用计数值为0则开始释放被删除结点的内存资源;在回收线程完成内存资源释放的过程后,使用原子比较并交换操作判断引用计数值是否为0,若引用计数值为0则原子化的替换为初始值1。
6.根据权利要求5所述的一种基于引用计数的链表管理方法,其特征是:管理线程在完成对链表添加或删除结点的过程后,转换为回收线程的角色释放被删除结点的内存资源。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010441419.6A CN111723250B (zh) | 2020-05-22 | 2020-05-22 | 一种基于引用计数的链表管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010441419.6A CN111723250B (zh) | 2020-05-22 | 2020-05-22 | 一种基于引用计数的链表管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111723250A true CN111723250A (zh) | 2020-09-29 |
CN111723250B CN111723250B (zh) | 2024-03-08 |
Family
ID=72564941
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010441419.6A Active CN111723250B (zh) | 2020-05-22 | 2020-05-22 | 一种基于引用计数的链表管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111723250B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112650609A (zh) * | 2020-12-29 | 2021-04-13 | 北京天融信网络安全技术有限公司 | 并发资源的处理方法、装置和电子设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030140085A1 (en) * | 2001-01-12 | 2003-07-24 | Sun Microsystems, Inc. | Single-word lock-free reference counting |
CN101046755A (zh) * | 2006-03-28 | 2007-10-03 | 郭明南 | 一种计算机自动内存管理的***及方法 |
DE102012220267A1 (de) * | 2011-11-08 | 2013-05-08 | Nvidia Corporation | Rechenarbeitsverteilungs - Referenzzähler |
CN104216767A (zh) * | 2014-09-18 | 2014-12-17 | 东软集团股份有限公司 | 多线程之间访问共享数据的方法及装置 |
CN108874446A (zh) * | 2018-04-12 | 2018-11-23 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN109144892A (zh) * | 2018-08-27 | 2019-01-04 | 南京国电南自轨道交通工程有限公司 | 一种管理内存中高频变化数据的缓冲链表数据结构设计方法 |
CN109683984A (zh) * | 2018-12-14 | 2019-04-26 | 拉扎斯网络科技(上海)有限公司 | 数据热加载方法、装置、电子设备及计算机可读存储介质 |
CN110352406A (zh) * | 2017-03-10 | 2019-10-18 | 华为技术有限公司 | 无锁参考计数 |
-
2020
- 2020-05-22 CN CN202010441419.6A patent/CN111723250B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030140085A1 (en) * | 2001-01-12 | 2003-07-24 | Sun Microsystems, Inc. | Single-word lock-free reference counting |
CN101046755A (zh) * | 2006-03-28 | 2007-10-03 | 郭明南 | 一种计算机自动内存管理的***及方法 |
DE102012220267A1 (de) * | 2011-11-08 | 2013-05-08 | Nvidia Corporation | Rechenarbeitsverteilungs - Referenzzähler |
CN104216767A (zh) * | 2014-09-18 | 2014-12-17 | 东软集团股份有限公司 | 多线程之间访问共享数据的方法及装置 |
CN110352406A (zh) * | 2017-03-10 | 2019-10-18 | 华为技术有限公司 | 无锁参考计数 |
CN108874446A (zh) * | 2018-04-12 | 2018-11-23 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN109144892A (zh) * | 2018-08-27 | 2019-01-04 | 南京国电南自轨道交通工程有限公司 | 一种管理内存中高频变化数据的缓冲链表数据结构设计方法 |
CN109683984A (zh) * | 2018-12-14 | 2019-04-26 | 拉扎斯网络科技(上海)有限公司 | 数据热加载方法、装置、电子设备及计算机可读存储介质 |
Non-Patent Citations (2)
Title |
---|
PHILIP.LAU: "python垃圾回收机制(引用计数、循环引用、gc、标记清除、分代回收)", Retrieved from the Internet <URL:https://blog.csdn.net/qq_43029747/article/details/99846548> * |
***等: "基于智能指针的垃圾收集器的研究与实现", 电脑与电信, no. 01, 10 January 2009 (2009-01-10), pages 52 - 55 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112650609A (zh) * | 2020-12-29 | 2021-04-13 | 北京天融信网络安全技术有限公司 | 并发资源的处理方法、装置和电子设备 |
CN112650609B (zh) * | 2020-12-29 | 2023-11-10 | 北京天融信网络安全技术有限公司 | 并发资源的处理方法、装置和电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111723250B (zh) | 2024-03-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8495641B2 (en) | Efficiently boosting priority of read-copy update readers while resolving races with exiting and unlocking processes | |
US20170010925A1 (en) | Lock-free dual queue with condition synchronization and time-outs | |
TW498281B (en) | Interface system and method for asynchronously updating a shared resource | |
US5742830A (en) | Method and apparatus for performing conditional operations on externally shared data | |
US7031989B2 (en) | Dynamic seamless reconfiguration of executing parallel software | |
US7506339B2 (en) | High performance synchronization of accesses by threads to shared resources | |
US4847754A (en) | Extended atomic operations | |
KR100976280B1 (ko) | 하드웨어 지원을 갖는 다중 프로세서 및 다중 스레드 안전 메시지 큐 | |
CN101833475B (zh) | 用于执行指令原子块的方法和装置 | |
EP0965919A2 (en) | A probabilistic queue lock | |
JPH07191944A (ja) | 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法 | |
JPH01303527A (ja) | 共有資源の管理方法 | |
US8103838B2 (en) | System and method for transactional locking using reader-lists | |
JPH0318935A (ja) | データリストに対するアクセスの直列化方式 | |
JP3737638B2 (ja) | オブジェクトのロック管理方法及び装置、並びにオブジェクトのロック解除方法及び装置 | |
US20020199045A1 (en) | Apparatus, method and computer program product for converting simple locks in a multiprocessor system | |
JPWO2011096163A1 (ja) | 情報処理システム、排他制御方法および排他制御用プログラム | |
JP3798726B2 (ja) | メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体 | |
JPH04182858A (ja) | 共有メモリ管理方式 | |
US7353342B1 (en) | Shared lease instruction support for transient blocking synchronization | |
US5222238A (en) | System and method for shared latch serialization enhancement | |
CN111723250A (zh) | 一种基于引用计数的链表管理方法 | |
CN113220490A (zh) | 异步写回持久化内存的事务持久化方法及*** | |
JPH04155465A (ja) | ファイル共用方法 | |
KR100470555B1 (ko) | 컴퓨터 자원의 로크방법 및 장치 |
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 |