[发明专利]一种数据库中自旋锁的实现方法无效

专利信息
申请号: 201110060572.5 申请日: 2011-03-14
公开(公告)号: CN102129391A 公开(公告)日: 2011-07-20
发明(设计)人: 王非;黄本雄;刘维;邓磊 申请(专利权)人: 华中科技大学
主分类号: G06F9/46 分类号: G06F9/46
代理公司: 北京市德权律师事务所 11302 代理人: 周发军
地址: 430074 湖北*** 国省代码: 湖北;42
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 一种 数据库 自旋 实现 方法
【说明书】:

技术领域

发明涉及数据库技术领域,尤其涉及到并发控制过程中对自旋锁的改进实现方法。

背景技术

在基于锁的事务并发控制技术中,数据库经常使用自旋锁来保护数据结构及在其上的操作。自旋锁开销极小,但是自旋锁只能保护数据结构的轻量访问,在自旋锁保护期间,不能有系统调用或系统中断,保护的时间非常短,一般只为几十个处理器周期。因为自旋锁原理简单,死锁的解决方法也很简单,通常采用固定时长的计时器对任务计时,一旦任务的计时时间到,紧接着的后续任务将直接自动解锁。正是因为这个原理,当存在多个任务竞争某一个自旋锁时,如果锁超时,则多个任务将同时认为锁超时,并各自对该自旋锁进行解锁并试图加锁,导致多个任务对同一个自旋锁加锁从而出现死锁的情况。由于存在该问题,导致自旋锁无法适应更加复杂的应用场景。

发明内容

为了扩展自旋锁的适用范围,允许任务在持锁期间进行较复杂、执行时间较为弹性的操作,本发明提供一种改进的自旋锁加锁和死锁判决方法。

本发明的技术方案为:

一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是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与线程的一一映射关系。

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华中科技大学,未经华中科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/201110060572.5/2.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top