CN102129391A - 一种数据库中自旋锁的实现方法 - Google Patents

一种数据库中自旋锁的实现方法 Download PDF

Info

Publication number
CN102129391A
CN102129391A CN2011100605725A CN201110060572A CN102129391A CN 102129391 A CN102129391 A CN 102129391A CN 2011100605725 A CN2011100605725 A CN 2011100605725A CN 201110060572 A CN201110060572 A CN 201110060572A CN 102129391 A CN102129391 A CN 102129391A
Authority
CN
China
Prior art keywords
spin lock
value
variable
lock
spin
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
Application number
CN2011100605725A
Other languages
English (en)
Other versions
CN102129391B (zh
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.)
Huazhong University of Science and Technology
Original Assignee
Huazhong University of Science and Technology
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 Huazhong University of Science and Technology filed Critical Huazhong University of Science and Technology
Priority to CN 201110060572 priority Critical patent/CN102129391B/zh
Publication of CN102129391A publication Critical patent/CN102129391A/zh
Application granted granted Critical
Publication of CN102129391B publication Critical patent/CN102129391B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种数据库中自旋锁的实现方法,其特征在于,一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;采用自旋锁变量高位存储值来记忆当前已持自旋锁线程,并根据该存储值在持锁线程异常退出导致死锁时,实现自旋锁自动解锁。本发明避免出现上述多个任务竞争同一个自旋锁时可能出现的死锁情况,并通过改进加锁流程及死锁判决流程,使自旋锁能够保护在数据结构上一段较长时间的操作,并能处理期间加锁线程的异常结束导致的死锁问题。

Description

一种数据库中自旋锁的实现方法
技术领域
本发明涉及数据库技术领域,尤其涉及到并发控制过程中对自旋锁的改进实现方法。
背景技术
在基于锁的事务并发控制技术中,数据库经常使用自旋锁来保护数据结构及在其上的操作。自旋锁开销极小,但是自旋锁只能保护数据结构的轻量访问,在自旋锁保护期间,不能有系统调用或系统中断,保护的时间非常短,一般只为几十个处理器周期。因为自旋锁原理简单,死锁的解决方法也很简单,通常采用固定时长的计时器对任务计时,一旦任务的计时时间到,紧接着的后续任务将直接自动解锁。正是因为这个原理,当存在多个任务竞争某一个自旋锁时,如果锁超时,则多个任务将同时认为锁超时,并各自对该自旋锁进行解锁并试图加锁,导致多个任务对同一个自旋锁加锁从而出现死锁的情况。由于存在该问题,导致自旋锁无法适应更加复杂的应用场景。
发明内容
为了扩展自旋锁的适用范围,允许任务在持锁期间进行较复杂、执行时间较为弹性的操作,本发明提供一种改进的自旋锁加锁和死锁判决方法。
本发明的技术方案为:
一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,即用于产生ID值的变量,所有要使用此自旋锁的线程均要访问这两个变量,系统初始化时两个变量被初始化为0。
在加锁操作时,按如下步骤:
步骤101,用原子操作读取ID变量中的值并将其值加1;
步骤102,将第101步中获取的ID值与加锁后的状态值合成一个自旋锁变量值N,合成方法是:低位存储锁变量状态,高位存储ID值;
步骤103,以原子操作访问自旋锁变量,尝试加锁操作;
步骤104,若自旋锁状态为未占用,则加锁成功,将步骤102合成的锁变量值以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁状态为已占用,加锁不成功则进入死锁判决流程,如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103。
当加锁过程中需要判定是否发生死锁时,按如下步骤:
步骤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变量中的值并将其值加1。由于读值操作与加1操作是原子的,因此多线程相近时间内访问此ID变量时,不会获取相同的ID值。
步骤102,将第101步中获取的ID值与加锁后的状态值合成一个自旋锁变量值当加锁过程中需要判定是否发生死锁时,按如下步骤:
步骤103,以原子操作访问自旋锁变量,尝试加锁操作。
步骤104,若自旋锁状态为未占用,则加锁成功,将步骤102合成的锁变量值以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁状态为已占用,加锁不成功则进入死锁判决流程。如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103。
死锁判决步骤如下:
步骤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 (2)

1.一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;
在加锁操作时,按如下步骤:
步骤101,用原子操作读取ID变量中的值并将其值加1;
步骤102,将第101步中获取的ID值与加锁后的状态值合成一个自旋锁变量值N,合成方法是:低位存储锁变量状态,高位存储ID值;
步骤103,以原子操作访问自旋锁变量,尝试加锁操作;
步骤104,若自旋锁状态为未占用,则加锁成功,将步骤102合成的锁变量值以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;
步骤105,若自旋锁状态为已占用,加锁不成功则进入死锁判决流程,如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103。
2.根据权利要求1所述的一种数据库中自旋锁的实现方法,其特征在于,当加锁过程中需要判定是否发生死锁时,按如下步骤:
步骤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秒之间,并将空转次数计数清零。
CN 201110060572 2011-03-14 2011-03-14 一种数据库中自旋锁的实现方法 Expired - Fee Related CN102129391B (zh)

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 true CN102129391A (zh) 2011-07-20
CN102129391B 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)

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103336789A (zh) * 2013-06-06 2013-10-02 华为技术有限公司 一种数据库系统的锁操作方法及设备
CN103605921A (zh) * 2013-10-28 2014-02-26 清华大学 内核扩展安全访问方法及装置
CN103946827A (zh) * 2011-11-22 2014-07-23 华为技术有限公司 用于实施内核和用户空间之间共享的锁的系统和方法
WO2014183510A1 (en) * 2013-05-17 2014-11-20 Hangzhou H3C Technologies Co., Ltd. Spinlock resources processing
CN104461729A (zh) * 2013-09-22 2015-03-25 腾讯科技(北京)有限公司 一种资源共享保护方法及装置
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 上海金仕达软件科技有限公司 一种资源访问时自旋锁的实现方法、装置及设备
CN112947677A (zh) * 2021-02-05 2021-06-11 北京深之度科技有限公司 一种计时器读取方法、计算设备及可读存储介质
CN113448878A (zh) * 2021-05-27 2021-09-28 山东英信计算机技术有限公司 一种lba处理方法、系统、存储介质及设备

Citations (2)

* Cited by examiner, † Cited by third party
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操作系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
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操作系统

Cited By (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103946827A (zh) * 2011-11-22 2014-07-23 华为技术有限公司 用于实施内核和用户空间之间共享的锁的系统和方法
CN103946827B (zh) * 2011-11-22 2017-02-22 华为技术有限公司 用于实施内核和用户空间之间共享的锁的系统和方法
CN104166587B (zh) * 2013-05-17 2018-11-30 新华三技术有限公司 一种临界资源的访问装置和方法
WO2014183510A1 (en) * 2013-05-17 2014-11-20 Hangzhou H3C Technologies Co., Ltd. Spinlock resources processing
CN104166587A (zh) * 2013-05-17 2014-11-26 杭州华三通信技术有限公司 一种临界资源的访问装置和方法
CN103336789A (zh) * 2013-06-06 2013-10-02 华为技术有限公司 一种数据库系统的锁操作方法及设备
US9449041B2 (en) 2013-06-06 2016-09-20 Huawei Technologies Co., Ltd. Database system lock operation method and device
CN104461729A (zh) * 2013-09-22 2015-03-25 腾讯科技(北京)有限公司 一种资源共享保护方法及装置
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 上海金仕达软件科技有限公司 一种资源访问时自旋锁的实现方法、装置及设备
CN112947677A (zh) * 2021-02-05 2021-06-11 北京深之度科技有限公司 一种计时器读取方法、计算设备及可读存储介质
CN112947677B (zh) * 2021-02-05 2024-02-27 北京深之度科技有限公司 一种计时器读取方法、计算设备及可读存储介质
CN113448878A (zh) * 2021-05-27 2021-09-28 山东英信计算机技术有限公司 一种lba处理方法、系统、存储介质及设备

Also Published As

Publication number Publication date
CN102129391B (zh) 2013-08-28

Similar Documents

Publication Publication Date Title
CN102129391B (zh) 一种数据库中自旋锁的实现方法
US10417056B2 (en) Systems and methods for performing concurrency restriction and throttling over contended locks
US7395274B2 (en) Space- and time-adaptive nonblocking algorithms
CA2663983C (en) Optimizing non-preemptible read-copy update for low-power usage by avoiding unnecessary wakeups
CN105893120B (zh) 一种线程同步资源的获取方法和装置
CN102446217A (zh) 复合事件处理设备和复合事件处理方法
CN101763289A (zh) 一种基于共享内存的消息传递方法
US8255436B2 (en) Per thread garbage collection
CN105955850A (zh) 一种车辆用控制单元异常复位处理方法及系统
US8132174B2 (en) Concurrency management in cluster computing of business applications
CN106528065B (zh) 一种线程获取方法及设备
CN104376096A (zh) 基于缓冲区的异步更新的方法
CN109542599A (zh) 一种嵌入式操作系统线程监视方法
US8752028B2 (en) Efficient monitoring in a software system
CN110737504B (zh) 一种深度学习模型训练容错方法、系统、终端及存储介质
CN101158849A (zh) 一种防止工业自动化系统雪崩的方法
CN101470627B (zh) 一种mips平台下并行多核配置锁的实现方法
CN112463079B (zh) 一种数据存储控制方法、装置、设备及可读存储介质
CN107305507B (zh) 死锁控制方法和装置
CN114498760B (zh) 一种孤岛检测方法、装置及其电子设备
CN111984428A (zh) 一种资源访问时自旋锁的实现方法、装置及设备
Hung et al. Locking protocols for concurrency control in real-time database systems
CN110377236A (zh) 一种存储设备的逻辑卷的管理方法、装置、设备及介质
CN109962861B (zh) 一种报文统计方法及装置
CN104461729B (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