CN102129391B - 一种数据库中自旋锁的实现方法 - Google Patents
一种数据库中自旋锁的实现方法 Download PDFInfo
- Publication number
- CN102129391B CN102129391B CN 201110060572 CN201110060572A CN102129391B CN 102129391 B CN102129391 B CN 102129391B CN 201110060572 CN201110060572 CN 201110060572 CN 201110060572 A CN201110060572 A CN 201110060572A CN 102129391 B CN102129391 B CN 102129391B
- Authority
- CN
- China
- Prior art keywords
- spin lock
- value
- variable
- variate
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据库中自旋锁的实现方法,其特征在于,一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;采用自旋锁变量高位存储值来记忆当前已持自旋锁线程,并根据该存储值在持锁线程异常退出导致死锁时,实现自旋锁自动解锁。本发明避免出现上述多个任务竞争同一个自旋锁时可能出现的死锁情况,并通过改进加锁流程及死锁判决流程,使自旋锁能够保护在数据结构上一段较长时间的操作,并能处理期间加锁线程的异常结束导致的死锁问题。
Description
技术领域
本发明涉及数据库技术领域,尤其涉及到并发控制过程中对自旋锁的改进实现方法。
背景技术
在基于锁的事务并发控制技术中,数据库经常使用自旋锁来保护数据结构及在其上的操作。自旋锁开销极小,但是自旋锁只能保护数据结构的轻量访问,在自旋锁保护期间,不能有系统调用或系统中断,保护的时间非常短,一般只为几十个处理器周期。因为自旋锁原理简单,死锁的解决方法也很简单,通常采用固定时长的计时器对任务计时,一旦任务的计时时间到,紧接着的后续任务将直接自动解锁。正是因为这个原理,当存在多个任务竞争某一个自旋锁时,如果锁超时,则多个任务将同时认为锁超时,并各自对该自旋锁进行解锁并试图加锁,导致多个任务对同一个自旋锁加锁从而出现死锁的情况。由于存在该问题,导致自旋锁无法适应更加复杂的应用场景。
发明内容
为了扩展自旋锁的适用范围,允许任务在持锁期间进行较复杂、执行时间较为弹性的操作,本发明提供一种改进的自旋锁加锁和死锁判决方法。
本发明的技术方案为:
一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,即用于产生ID值的变量,所有要使用此自旋锁的线程均要访问这两个变量,系统初始化时两个变量被初始化为0。
在加锁操作时,按如下步骤:
步骤101,用原子操作读取ID变量中的值,并将ID变量加1;
步骤102,将第101步中获取的ID值与自旋锁加锁后的自旋锁变量值合成第一变量值N,合成方法是:低位存储自旋锁变量,高位存储ID值;
步骤103,以原子操作访问自旋锁变量,尝试加锁操作;
步骤104,若自旋锁变量值为未占用,则加锁成功,将步骤102合成的第一变量值N以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁变量值为已占用,加锁不成功则进入死锁判决流程,如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103;
步骤106解自旋锁。
上述步骤105中所述的死锁判决流程,按如下步骤进行:
步骤201,将自旋锁变量的高位ID值存储于线程的一个临时变量中,记为LHold;
步骤202,将分配给此线程的ID值与自旋锁变量已加锁变量值合成第一变量值N;合成方法如下:第一变量值N低位存储自旋锁变量,高位存储ID值;
步骤203,原子操作探测自旋锁变量值,判断是否可以加锁;
步骤204,如果自旋锁可以加锁,则将第一变量值N存于自旋锁变量,其中对自旋锁变量的探测和存储是原子的,自旋锁加锁成功并返回;
步骤205,如果自旋锁不能被加锁,处理器空转一次;对空转次数累加计数;
步骤206,如果空转次数不超过设定阈值,则转入步骤203;否则转入步骤207;
步骤207,对休眠次数累计加1,判断休眠次数是否超过设定阈值,如果超过设定阈值则转入步骤208;否则转入步骤211;
步骤208,将LHold与自旋锁加锁后的自旋锁变量值合成第二变量值Y,合成方法如下:Y的低位存储自旋锁加锁后的自旋锁变量值,高位存储LHold值;
步骤209,原子操作比较自旋锁变量值与Y值是否相等,如果相等,则判定自旋锁死锁,并将自旋锁解锁,其中判定自旋锁变量值与Y值相等的操作与自旋锁解锁的操作是原子的;
步骤210,重新获取自旋锁变量的高位ID值,存储于LHold,并将休眠计数清零,线程休眠一段随机时间,转入步骤211;
步骤211,线程休眠一次,休眠一段随机时间,随机时间在1毫秒到1秒之间,并将空转次数计数清零。
本发明采用将自旋锁变量以比特为单位分为两部分,高位和低位。自旋锁变量的高位bit中存储一个标识值,记为ID。ID为一个整数,用来映射加锁的线程。当自旋锁加锁不成功并且等锁超时的时候,通过获取自旋锁变量高位ID,来判断在超时前后是否是同一个ID值存储在自旋锁变量里,如果是同一个ID,则认为此ID对应的线程已经异常退出,发生了死锁,则对自旋锁进行解锁操作。
自旋锁变量高位与低位的分配方式如下:选取低位的1bit来标识自旋锁的状态;在剩余的bit中选择若干位存储ID。ID的分配方法如下:设计一个无符号全局共享变量,取值范围与ID的范围相同,加锁线程请求自旋锁前先使用原子操作对此变量做累计加1操作,返回变量的值即为此线程要使用的ID值。由于变量累计加1操作,时间上相近的线程不会获取相同的ID,保证了ID与线程的一一映射关系。
本发明的有益效果是通过扩展自旋锁的存储空间,不仅存储自旋锁状态,并且保存最后加锁成功的任务的操作标识符,从而避免出现上述多个任务竞争同一个自旋锁时可能出现的死锁情况。此外,改进加锁流程及死锁判决流程,使自旋锁能够保护在数据结构上一段较长时间的操作,并能处理期间加锁线程的异常结束导致的死锁问题。
附图说明
下面结合附图和具体实施方式对本发明的技术方案作进一步具体说明。
图1为自旋锁加锁流程。
图2为自旋锁死锁判决流程。
具体实施方式
在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是用于产生ID值的变量,我们称其为ID变量。所有要使用此自旋锁的线程均要访问这两个变量,系统初始化时两个变量被初始化为0。
自旋锁加锁步骤如下:
步骤101,线程从ID变量中获取ID值。ID值产生方法如下:用原子操作读取ID变量中的值,并将ID变量加1。由于读值操作与加1操作是原子的,因此多线程相近时间内访问此ID变量时,不会获取相同的ID值。
步骤102,将第101步中获取的ID值与自旋锁加锁后的自旋锁变量值合成第一变量值N。当加锁过程中需要判定是否发生死锁时,按如下步骤:
步骤103,以原子操作访问自旋锁变量,尝试加锁操作。
步骤104,若自旋锁变量值为未占用,则加锁成功,将步骤102合成的第一变量值N以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁变量值为已占用,加锁不成功则进入死锁判决流程。如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103;
步骤106解自旋锁。
上述步骤105中所述的死锁判决流程,按如下步骤进行:
步骤201,将自旋锁变量的高位ID值存储于线程的一个临时变量中,记为LHold;
步骤202,将分配给此线程的ID值与自旋锁变量已加锁变量值合成第一变量值N;合成方法如下:第一变量值N低位存储自旋锁变量,高位存储ID值;
步骤203,原子操作探测自旋锁变量值,判断是否可以加锁;
步骤204,如果自旋锁可以加锁,则将第一变量值N存于自旋锁变量,其中对自旋锁变量的探测和存储是原子的,自旋锁加锁成功并返回;
步骤205,如果自旋锁不能被加锁,处理器空转一次;对空转次数累加计数;
步骤206,如果空转次数不超过设定阈值,则转入步骤203;否则转入步骤207;
步骤207,对休眠次数累计加1,判断休眠次数是否超过设定阈值,
如果超过设定阈值则转入步骤208;否则转入步骤211;
步骤208,将LHold与自旋锁加锁后自旋锁变量值合成第二变量值Y,合成方法如下:Y的低位存储自旋锁加锁后自旋锁变量值,高位存储LHold值;
步骤209,原子操作比较自旋锁变量值与Y值是否相等,如果相等,则判定自旋锁死锁,并将自旋锁解锁,其中判定自旋锁变量值与Y值相等的操作与自旋锁解锁的操作是原子的;
步骤210,重新获取自旋锁变量的高位ID值,存储于LHold,并将休眠计数清零,线程休眠一段随机时间,转入步骤211;
步骤211,线程休眠一次,休眠一段随机时间,随机时间在1毫秒到1秒之间,并将空转次数计数清零。合成方法是:低位存储锁变量状态,高位存储ID值。
最后所应说明的是,以上具体实施方式仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
Claims (1)
1.一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;
在加锁操作时,按如下步骤:
步骤101,用原子操作读取ID变量中的值,并将ID变量加1;
步骤102,将第101步中读取的ID值与自旋锁加锁后的的自旋锁变量值合成第一变量值N,合成方法是:低位存储自旋锁变量,高位存储ID值;
步骤103,以原子操作访问自旋锁变量,尝试加锁操作;
步骤104,若自旋锁变量值为未占用,则加锁成功,将步骤102合成的第一变量值N以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁变量值为已占用,加锁不成功则进入死锁判决流程,如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103;
步骤106,解自旋锁;
上述步骤105中所述的死锁判决流程,按如下步骤进行:
步骤201,将自旋锁变量的高位ID值存储于线程的一个临时变量中,记为LHold;
步骤202,将分配给此线程的ID值与自旋锁变量已加锁变量值合成第一变量值N;合成方法如下:第一变量值N低位存储自旋锁变量,高位存储ID值;
步骤203,原子操作探测自旋锁变量值,判断是否可以加锁;
步骤204,如果自旋锁可以加锁,则将第一变量值N存于自旋锁变量,其中对自旋锁变量的探测和存储是原子的,自旋锁加锁成功并返回;
步骤205,如果自旋锁不能被加锁,处理器空转一次;对空转次数累加计数;
步骤206,如果空转次数不超过设定阈值,则转入步骤203;否则转入步骤207;
步骤207,对休眠次数累计加1,判断休眠次数是否超过设定阈值,如果超过设定阈值则转入步骤208;否则转入步骤211;
步骤208,将LHold与自旋锁加锁后的自旋锁变量值合成第二变量值Y,合成方法如下:Y的低位存储自旋锁加锁后的自旋锁变量值,高位存储LHold值;
步骤209,原子操作比较自旋锁变量值与Y值是否相等,如果相等,
则判定自旋锁死锁,并将自旋锁解锁,其中判定自旋锁变量值与Y值相等的操作与自旋锁解锁的操作是原子的;
步骤210,重新获取自旋锁变量的高位ID值,存储于LHold,并将休眠计数清零,线程休眠一段随机时间,转入步骤211;
步骤211,线程休眠一次,休眠一段随机时间,随机时间在1毫秒到1秒之间,并将空转次数计数清零。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110060572 CN102129391B (zh) | 2011-03-14 | 2011-03-14 | 一种数据库中自旋锁的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110060572 CN102129391B (zh) | 2011-03-14 | 2011-03-14 | 一种数据库中自旋锁的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102129391A CN102129391A (zh) | 2011-07-20 |
CN102129391B true CN102129391B (zh) | 2013-08-28 |
Family
ID=44267480
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201110060572 Expired - Fee Related CN102129391B (zh) | 2011-03-14 | 2011-03-14 | 一种数据库中自旋锁的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102129391B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9128786B2 (en) * | 2011-11-22 | 2015-09-08 | Futurewei Technologies, Inc. | System and method for implementing shared locks between kernel and user space for synchronize access without using a system call to the kernel |
CN104166587B (zh) * | 2013-05-17 | 2018-11-30 | 新华三技术有限公司 | 一种临界资源的访问装置和方法 |
CN103336789A (zh) | 2013-06-06 | 2013-10-02 | 华为技术有限公司 | 一种数据库系统的锁操作方法及设备 |
CN104461729B (zh) * | 2013-09-22 | 2019-02-05 | 腾讯科技(北京)有限公司 | 一种资源共享保护方法及装置 |
CN103605921A (zh) * | 2013-10-28 | 2014-02-26 | 清华大学 | 内核扩展安全访问方法及装置 |
CN106201730A (zh) * | 2016-07-07 | 2016-12-07 | 浪潮(北京)电子信息产业有限公司 | 一种linux用户态互斥锁死锁检测方法及系统 |
CN106201731A (zh) * | 2016-07-07 | 2016-12-07 | 浪潮(北京)电子信息产业有限公司 | 一种用户态读写锁死锁检测方法及系统 |
CN106294137A (zh) * | 2016-08-01 | 2017-01-04 | 浪潮(北京)电子信息产业有限公司 | 一种linux用户态自旋锁死锁检测方法及系统 |
CN108446181A (zh) * | 2018-03-26 | 2018-08-24 | 武汉斗鱼网络科技有限公司 | 对资源限制访问的方法、装置及终端设备 |
CN111984428A (zh) * | 2020-07-20 | 2020-11-24 | 上海金仕达软件科技有限公司 | 一种资源访问时自旋锁的实现方法、装置及设备 |
CN112947677B (zh) * | 2021-02-05 | 2024-02-27 | 北京深之度科技有限公司 | 一种计时器读取方法、计算设备及可读存储介质 |
CN113448878B (zh) * | 2021-05-27 | 2023-02-28 | 山东英信计算机技术有限公司 | 一种lba处理方法、系统、存储介质及设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101403979A (zh) * | 2008-10-27 | 2009-04-08 | 成都市华为赛门铁克科技有限公司 | 一种自旋锁的加锁方法及计算机系统 |
CN101894045A (zh) * | 2010-06-18 | 2010-11-24 | 阳坚 | 一种实时Linux操作系统 |
-
2011
- 2011-03-14 CN CN 201110060572 patent/CN102129391B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101403979A (zh) * | 2008-10-27 | 2009-04-08 | 成都市华为赛门铁克科技有限公司 | 一种自旋锁的加锁方法及计算机系统 |
CN101894045A (zh) * | 2010-06-18 | 2010-11-24 | 阳坚 | 一种实时Linux操作系统 |
Also Published As
Publication number | Publication date |
---|---|
CN102129391A (zh) | 2011-07-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102129391B (zh) | 一种数据库中自旋锁的实现方法 | |
US9396226B2 (en) | Highly scalable tree-based trylock | |
CN101763289B (zh) | 一种基于共享内存的消息传递方法 | |
CN109828833B (zh) | 一种神经网络训练任务的排队系统及其方法 | |
US7395274B2 (en) | Space- and time-adaptive nonblocking algorithms | |
CN101046755B (zh) | 一种计算机自动内存管理的系统及方法 | |
CN103150125B (zh) | 提高掉电保护数据缓冲存储器使用寿命的方法及智能卡 | |
CN102262559B (zh) | 一种资源共享的方法及系统 | |
CN102999378A (zh) | 一种读写锁实现方法 | |
US20120324473A1 (en) | Effective Management Of Blocked-Tasks In Preemptible Read-Copy Update | |
JP6708657B2 (ja) | トランザクション実行に応じて追跡データを生成する装置及び方法 | |
US9971632B2 (en) | Synchronization and barrier free concurrent garbage collection system | |
CN104516959B (zh) | 一种管理数据库日志的方法及装置 | |
Avni et al. | Persistent hybrid transactional memory for databases | |
US8255436B2 (en) | Per thread garbage collection | |
US10514997B2 (en) | Multi-producer single consumer lock-free queues with producer reference counting | |
CN110737504B (zh) | 一种深度学习模型训练容错方法、系统、终端及存储介质 | |
CN106068497A (zh) | 事务存储器支持 | |
Aldarmi | Real-time database systems: concepts and design | |
CN101470627B (zh) | 一种mips平台下并行多核配置锁的实现方法 | |
US8756585B2 (en) | Efficient monitoring in a software system | |
CN107305507A (zh) | 死锁控制方法和装置 | |
US9274877B2 (en) | Incident handling | |
Hung et al. | Locking protocols for concurrency control in real-time database systems | |
CN114498760A (zh) | 一种孤岛检测方法、装置及其电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130828 Termination date: 20140314 |