多核系统资源延迟回收锁的实现方法及系统的制作方法

文档序号:6363177阅读:126来源:国知局
专利名称:多核系统资源延迟回收锁的实现方法及系统的制作方法
技术领域
本发明涉及数据共享技术领域,特别涉及一种多核系统资源延迟回收锁的实现方法及系统。
背景技术
众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁 (rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,也就说获得锁的开销与访存速度相关,因此它的开销相对于CPU速度而言就越来越大,并且这种锁机制的另一个问题在于其可扩展性,在多处理器系统上,可扩展性非常重要,否则根本无法发挥其性能。自旋锁和读写锁的锁着核增加的理论性能并不理想。正是在这种背景下,一个高性能的锁机制RCU被提出,具有很好的扩展性,但是这种锁机制的使用范围比较窄,它只适用于读多写少的情况,如网络路由表的查询更新、设备状态表的维护、数据结构的延迟释放等。Linux的RCU锁实现方法为RCU (Read-Copy Update)顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读数据者不需要获得任何锁就可以访问它,但写数据者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。因此RCU实际上是一种改进的读写锁(rwlock),读数据者几乎没有什么同步开销,它不需要锁,不使用原子指令,因此不会导致锁竞争,内存延迟以及流水线停滞。不需要锁也使得使用更容易,因为死锁问题就不需要考虑了。写数据者的同步开销比较大,它需要延迟数据结构的释放,复制被修改的数据结构,它也必须使用某种锁机制同步并行的其它写数据者的修改操作。读数据者必须提供一个信号给写数据者以便写数据者能够确定数据可以被安全地释放或修改的时机。有一个专门的垃圾收集器来探测读数据者的信号,一旦所有的读数据者都已经发送信号告知它们都不在使用被RCU保护的数据结构,垃圾收集器就调用回调函数完成最后的数据释放或修改操作。读数据者在访问被RCU保护的共享数据期间不能被阻塞,这是RCU机制得以实现的一个基本前提,也就说当读数据者在引用被RCU保护的共享数据期间,读数据者所在的 (PU不能发生上下文切换,自旋锁(spinlock)和读写锁(rwlock)都需要这样的前提。写数据者在访问被RCU保护的共享数据时不需要和读数据者竞争任何锁,只有在有多于一个写数据者的情况下需要获得某种锁以与其他写数据者同步。写数据者修改数据前首先拷贝一个被修改元素的副本,然后在副本上进行修改,修改完毕后它向垃圾回收器注册一个回调函数以便在适当的时机执行真正的修改操作。等待适当时机的这一时期称为宽限时期 (grace period),而CPU发生了上下文切换称为经历一个静默状态(quiescent state),宽限时期就是所有CPU都经历一次静默状态所需要的等待的时间。垃圾收集器就是在宽限时期之后调用写数据者注册的回调函数来完成真实的数据修改操作或数据释放操作的。现有技术的RCU的主要缺点为由于RCU在垃圾回收期间(下一个宽限时期内包括垃圾回收期间),无法让CPU进入静默状态,当需要回收的资源很多,会造成下一个宽限时期很长,在较长的宽限时间内,因为回收不及时造成对内存资源消耗很大,严重情况下资源耗竭而影响业务正常运行。另一个缺点是RCU为了记录和访问判断宽限时期是否结束, 采用的是自旋锁保护共享数据的方式来实现,对于RCU锁在对于垃圾回收及时性上有略微的性能损耗。

发明内容
(一 )要解决的技术问题本发明要解决的技术问题是如何在垃圾回收期间让CPU进入静默状态,以解决在资源突发大量集中回收,造成此类资源耗竭而影响业务正常运行的问题。( 二 )技术方案为解决上述技术问题,本发明提供了一种多核系统资源延迟回收锁的实现方法, 所述方法包括以下步骤SI :设置由η个数据单元所构成的环形链表,并将多核系统中的每个CPU分别对应数据单元中的一位数据;S2 :在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;S3:根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束, 则执行步骤S4,否则执行步骤S5 ;S4:退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行步骤 S2 ;S5 :选择环形链表中所述当前数据单元的下一个单元;S6 :将当前CPU记录的宽限时期的次数加I ;S7 :通过回调函数进行X个资源的资源回收,所述X为正整数;S8 :判断资源是否都已经回收完毕,若是,则执行步骤S4,否则执行步骤S9 ;S9 :将步骤S5中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;SlO :根据步骤S5中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行步骤S5,否则执行步骤S7。优选地,步骤SI中,η取值为大于I的奇数。优选地,步骤S2中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = v mod η其中,C为环形链表中数据单元的序号,V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。本发明还公开了一种多核系统资源延迟回收锁的实现系统,所述系统包括
链表构建模块,用于设置由η个数据单元所构成的环形链表,并将多核系统中的每个CPU分别对应数据单元中的一位数据;置位模块,用于在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;宽限结束判断模块,用于根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束,则执行退出等待模块,否则执行选择模块;退出等待模块,用于退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行置位模块;选择模块,用于选择环形链表中所述当前数据单元的下一个单元;次数自加模块,用于将当前CPU记录的宽限时期的次数加I ;资源回收模块,用于通过回调函数进行X个资源的资源回收,所述X为正整数;回收完毕判断模块,用于判断资源是否都已经回收完毕,若是,则执行退出等待模块,否则执行再置位模块;再置位模块,用于将选择模块中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;宽限结束再判断模块,用于根据选择模块中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行选择模块,否则执行资源回收模块。优选地,链表构建模块中,η取值为大于I的奇数。优选地,置位模块中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = v mod η其中,C为环形链表中数据单元的序号,V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。(三)有益效果本发明通过设置由数据单元组成的环形链表,来标识CPU的状态,使得在垃圾回收期间,在垃圾回收的CPU进入静默状态时,能够使得其他CPU同时进行垃圾回收,解决了在资源突发大量集中回收,造成此类资源耗竭而影响业务正常运行的问题。


图I是按照本发明一种实施方式的多核系统资源延迟回收锁的实现方法的流程图;图2是按照图I所示的方法进行处理的环形链表的示意图。
具体实施例方式下面结合附图和实施例,对本发明的具体实施方式
作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。图I是按照本发明一种实施方式的多核系统资源延迟回收锁的实现方法的流程图;参照图1,本实施方式的方法包括以下步骤
SI :设置由η个数据单元所构成的环形链表,并将多核系统中的每个CPU分别对应数据单元中的一位数据;S2 :在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;S3:根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束, 则执行步骤S4,否则执行步骤S5 ;S4:退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行步骤
S2;S5 :选择环形链表中所述当前数据单元的下一个单元;S6 :将当前CPU记录的宽限时期的次数加I ;S7 :通过回调函数进行X个资源的资源回收,所述X为正整数;S8 :判断资源是否都已经回收完毕,若是,则执行步骤S4,否则执行步骤S9 ;S9 :将步骤S5中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;SlO :根据步骤S5中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行步骤S5,否则执行步骤S7。优选地,步骤SI中,η取值为大于I的奇数。优选地,步骤S2中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = v mod η其中,C为环形链表中数据单元的序号(该序号为环形链表中数据单元从左到右分别为1、2.....η-1、0),V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。实施例I下面以三个数据单元形成环形链表为例来说明本发明,但不限定本发明的保护范围,其中每个数据单元具有八个比特位,且均基于比特位形式分别表示某个CPU是否进入
静默状态。本实施例的方法为SlOl :设置由3个数据单元所构成的环形链表,并将多核系统中的八个CPU分别对应数据单元(每个数据单元具有八个比特位,)中的一位数据。S102 :当某个CPU发生了上下文切换后,进入多核资源回收锁处理过程中,获取当前CPU进入宽限周期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;置位时利用次数的奇偶特点设置宽限周期数据单元内的比特位来标识此CPU已经进入静默状态,具体为当CPU进入次数为奇数次,是将对应比特位由“I”置为“O” ;若为偶数次,是将比特位由“O”置为“I”。参照图2,所述三个数据单元的初值从左到右分别为“11111111”、“00000000”、 以及“11111111”。当第一次进入宽限时期,由于是奇数次,在所有的CPU进入静默状态时,都会将环形链表的表头的数据单元(三个数据单元中从左至右的第一个)内代表自身的比特位从I 置为O。
当第二次进入宽限时期,由于是偶数次,所有的CPU进入静默状态时,都会将环形链表的表头的下一个数据单元(三个数据单元中从左至右的第二个)内代表自身的比特位从O置为I。当第三次进入宽限时期,由于是奇数次,所有的CPU进入静默状态时,都会将环形链表的最后一个数据单元(三个数据单元中从左至右的第三个)内代表自身的比特位从I 置为O。当第四次进入宽限时期,由于是偶数次,所有的CPU当进入静默状态,都会将环形链表的表头的数据单元(由于环形链表,又回到了三个数据单元中从左至右的第一个)内的代表自身比特位从O置为I。依次类推,就能够根据进入宽限时期的奇偶次数特点,将静默状态记录到环形链表相应的数据单元内,以便判断本次宽限周期是否结束。当利用此方法实现,可以达到宽限时期的数据访问免锁保护。S103:判断当前CPU对应记录的宽限周期的数据单元值是否已经表示为此周期结束,主要根据当前CPU记录进入宽限周期的次数。如果为奇数次,那么当宽限周期中数据单元值中所有比特位都为1,表示所有CPU都进入了静默状态且此宽限周期结束。如果为偶数次,那么当宽限周期中数据单元值中所有比特位都为0,表示所有CPU都进入了静默状态且此宽限周期结束。如果当前宽限周期没有结束,进入步骤S104,如果结束进入步骤S105。S104:退出此次的资源回收处理,等待下一次的CPU发生上下文切换,再进入 S102。S105 :选择环形链表中所述当前数据单元的下一个单元,表示当前CPU进入下一个宽限周期内。S106 :将当前CPU记录的宽限周期次数加I。S107 :通过回调函数将注册需要回收的资源进行回收,一次性仅回收N个资源(其中,N是由实际系统运行定义,根据系统整体情况定义一次回收多少合适)。S108:判断资源是否都回收完毕,如果回收完毕进入步骤S104,如果没有,进入步骤 S109。S109 :将步骤S105中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;SllO :根据步骤S105中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行步骤S105,否则执行步骤S107。本实施例的方法相对于传统的RCU具有以下几点优势I、本发明在垃圾资源回收期,同样进入宽限周期并将CPU进入静默状态,CPU的产生的新垃圾资源能够尽早回收,并且保证当前CPU尽量将所有的资源回收完毕再去产生新的资源。这样不但提高了资源回收的效率和及时性,还可以解决在资源突发大量集中回收, 造成此类资源耗竭而影响业务正常运行的问题。2、本实施例利用三个数据单元的环形链表形式来记录宽限周期方式,配合奇偶次数特点来达到宽限周期在多核之间数据访问免锁,提高了资源回收锁的效率。本发明还公开了一种多核系统资源延迟回收锁的实现系统,所述系统包括链表构建模块,用于设置由η个数据单元所构成的环形链表,并将多核系统中的每个CPU分别对应数据单元中的一位数据;
置位模块,用于在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;宽限结束判断模块,用于根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束,则执行退出等待模块,否则执行选择模块;退出等待模块,用于退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行置位模块;选择模块,用于选择环形链表中所述当前数据单元的下一个单元;次数自加模块,用于将当前CPU记录的宽限时期的次数加I ;资源回收模块,用于通过回调函数进行X个资源的资源回收,所述X为正整数;回收完毕判断模块,用于判断资源是否都已经回收完毕,若是,则执行退出等待模块,否则执行再置位模块;再置位模块,用于将选择模块中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;宽限结束再判断模块,用于根据选择模块中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行选择模块,否则执行资源回收模块。优选地,链表构建模块中,η取值为大于I的奇数。优选地,置位模块中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = v mod η其中,C为环形链表中数据单元的序号,V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
权利要求
1.一种多核系统资源延迟回收锁的实现方法,其特征在于,所述方法包括以下步骤51:设置由η个数据单元所构成的环形链表,并将多核系统中的每个CPU分别对应数据单元中的一位数据;52:在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前 CPU对应的一位数据进行置位;53:根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束,则执行步骤S4,否则执行步骤S5;54:退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行步骤S2 ;55:选择环形链表中所述当前数据单元的下一个单元;56:将当前CPU记录的宽限时期的次数加I ;57:通过回调函数进行X个资源的资源回收,所述X为正整数;58:判断资源是否都已经回收完毕,若是,则执行步骤S4,否则执行步骤S9 ;59:将步骤S5中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;SlO :根据步骤S5中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行步骤S5,否则执行步骤S7。
2.如权利要求I所述的方法,其特征在于,步骤SI中,η取值为大于I的奇数。
3.如权利要求I所述的方法,其特征在于,步骤S2中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = vmodn其中,C为环形链表中数据单元的序号,V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。
4.一种多核系统资源延迟回收锁的实现系统,其特征在于,所述系统包括链表构建模块,用于设置由η个数据单元所构成的环形链表,并将多核系统中的每个 CPU分别对应数据单元中的一位数据;置位模块,用于在当前CPU发生了上下文切换后,进入资源回收处理过程中,获取当前 CPU进入宽限时期的次数,根据所述次数选择相应的当前数据单元,并将所述当前数据单元中与当前CPU对应的一位数据进行置位;宽限结束判断模块,用于根据所述当前数据单元中的值判断当前宽限时期是否已经结束,若没有结束,则执行退出等待模块,否则执行选择模块;退出等待模块,用于退出此次的资源回收处理过程,等待其它CPU发生上下文切换,再执行置位模块;选择模块,用于选择环形链表中所述当前数据单元的下一个单元;次数自加模块,用于将当前CPU记录的宽限时期的次数加I ;资源回收模块,用于通过回调函数进行X个资源的资源回收,所述X为正整数;回收完毕判断模块,用于判断资源是否都已经回收完毕,若是,则执行退出等待模块, 否则执行再置位模块;再置位模块,用于将选择模块中选择的下一个数据单元中与当前CPU对应的一位数据进行置位;宽限结束再判断模块,用于根据选择模块中选择的下一个数据单元中的值判断当前宽限时期是否已经结束,若是,则执行选择模块,否则执行资源回收模块。
5.如权利要求I所述的系统,其特征在于,链表构建模块中,η取值为大于I的奇数。
6.如权利要求I所述的系统,其特征在于,置位模块中,根据所述次数选择相应的当前数据单元是通过以下公式进行选择C = v mod η其中,C为环形链表中数据单元的序号,V为所述次数,mod为取模运算,η为环形链表中数据单元的个数。
全文摘要
本发明公开了一种多核系统资源延迟回收锁的实现方法及系统,涉及数据共享技术领域,本发明通过设置由数据单元组成的环形链表,来标识CPU的状态,使得在垃圾回收期间,在垃圾回收的CPU进入静默状态时,能够使得其他CPU同时进行垃圾回收,解决了在资源突发大量集中回收,造成此类资源耗竭而影响业务正常运行的问题。
文档编号G06F15/16GK102609313SQ20121001079
公开日2012年7月25日 申请日期2012年1月13日 优先权日2012年1月13日
发明者王博, 陈天航 申请人:汉柏科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1