[发明专利]一种多核CPU访问资源时自旋锁的实现方法有效
申请号: | 201710376711.2 | 申请日: | 2017-05-25 |
公开(公告)号: | CN107357648B | 公开(公告)日: | 2020-05-15 |
发明(设计)人: | 吕锦柏;崔萍 | 申请(专利权)人: | 吕锦柏 |
主分类号: | G06F9/50 | 分类号: | G06F9/50;G06F9/52 |
代理公司: | 北京正理专利代理有限公司 11257 | 代理人: | 付生辉 |
地址: | 100043*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 多核 cpu 访问 资源 自旋 实现 方法 | ||
本发明公开一种多核CPU访问资源时自旋锁的实现方法,包括:待访问的资源具有资源锁,任一CPU在访问资源时,生成供自身使用的自旋锁,资源锁和自旋锁的内存结构均包括用于标识锁定标记的第一内存单元以及用于保存下一个锁地址的第二内存单元;在该任一CPU访问资源之前,将资源锁的第一内存单元设置为空,第二内存单元设置为资源锁自身,使资源锁自身构成一个自循环链表;该任一CPU在访问资源时进行加锁和解锁。本发明的自旋锁的实现方法为每一种共享资源分配一个资源锁,每个资源锁在共享资源使用权未被占用时,组成单向自循环链表。采用自循环链表机制降低了程序设计的复杂性,可提高系统共享资源的使用效率。
技术领域
本发明涉及计算机领域,更具体地,涉及一种多核CPU自旋锁的实现方法。
背景技术
多核CPU由于其线程的运行是并行的,为保证程序(或进程)对某一资源的安全访问,维持数据的一致性,这种并行运行的程序一般需要在底层使用锁机制进行同步,从而保证程序运行过程中共享资源数据的一致性,否则,容易因数据不一致引发系统错误,造成严重后果。在单核CPU中,由于每个时刻运行的任务只有一个,而在多核CPU系统中,多个线程是真正并行执行的,因此不能简单的将单核系统中的同步方法应用到多核处理器系统中,需要设计一个快速、高效的数据同步方法实现CPU核之间的同步。
自旋锁为CPU核之间的同步提供了很好的解决方法,其基本原理是当其中某个CPU核访问共享资源时,对资源加锁,加锁过程中需依赖于总线锁定的原子操作。在此过程中,其他核必须等待该核释放总线才能进行后续总线操作。
一般CPU核都会提供寄存器与内存之间的数据交换指令,如ARM中的 SWP,x86的XCHG等命令,执行该命令期间,CPU会自动锁定总线并进行寄存器内容与内存内容的交换。最简单的自旋锁,就是基于寄存器内存数据交换指令实现,即将内存某一存储单元的值初始化为0。此后各CPU将寄存器赋初值1,执行寄存器内存单元内容交换指令,若交换后寄存器值为0,则说明当前系统资源未被占有,若不为0,则继续交换,直至为0时获得资源使用权。资源使用完成后,对相应内存单元赋0值,允许其他CPU访问。这种自旋锁设计方法非常简单,然而,这种方法无法保证CPU获取资源访问权限的公平性,在频繁的共享资源访问中,容易出现某些核长期无法访问资源的可能,如果该CPU核执行的任务紧急,会严重影响系统的实时性能,影响程序运行的稳定性,因此,在实际系统中,这种自旋锁很少使用。
排队自旋锁(Ticket lock)的出现解决了上述公平性的问题,这种自旋锁通过自加实现排队,在获取资源自加的过程中,进行原子加法,并获得自身对应的序号,具体原理为本领域技术人员所公知,不在此说明。排队自旋锁设计简单,但是这种算法依赖于原子加法,其操作过程一般需要几个步骤,即硬件锁定总线;读内存内容;修改值;将修改值写入内存中;硬件解锁总线。由于总线锁定期间,其他CPU核若访问总线则会被强制等待,因此,这个过程容易造成其他核额外无效的开销。另外,更为严重的是,CPU在加锁和解锁的过程中,需要进行频繁更改内存数据值,从而引发所有等待获取锁的CPU缓存数据无法命中,需要频更新缓存的问题,造成其他CPU效率严重下降。因此,这种自旋锁有进一步改进的需要。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于吕锦柏,未经吕锦柏许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201710376711.2/2.html,转载请声明来源钻瓜专利网。