CN108990422A - 一种锁分配的方法、装置和计算设备 - Google Patents
一种锁分配的方法、装置和计算设备 Download PDFInfo
- Publication number
- CN108990422A CN108990422A CN201780000600.XA CN201780000600A CN108990422A CN 108990422 A CN108990422 A CN 108990422A CN 201780000600 A CN201780000600 A CN 201780000600A CN 108990422 A CN108990422 A CN 108990422A
- Authority
- CN
- China
- Prior art keywords
- locking request
- queue
- lock
- request
- cpu
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/485—Task life-cycle, e.g. stopping, restarting, resuming execution
- G06F9/4856—Task life-cycle, e.g. stopping, restarting, resuming execution resumption being on a different machine, e.g. task migration, virtual machine migration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multi Processors (AREA)
Abstract
一种锁分配的方法、装置及计算设备,该方法包括:第一节点控制器(NC)接收第二NC生成的第一迁移队列;第一迁移队列中队列头的加锁请求为第一加锁请求,第一加锁请求中包括第一NC的标识;将第一目标锁分配给第一NC关联的第一中央处理器(CPU);当接收到第一CPU发送的释放第一目标锁的请求时,删除第一迁移队列中队列头的第一加锁请求;当第一迁移队列不为空时,修改第二加锁请求的拿锁标志位为已拿锁状态,已拿锁状态用于标识第一目标锁被占用;第二加锁请求为删除了第一加锁请求的第一迁移队列中队列头的加锁请求;确定发出第二加锁请求的第三NC,以及将第一迁移队列发送给所述第三NC。以此解决锁竞争的问题。
Description
本发明涉及计算机领域,尤其涉及一种锁分配的方法、装置和计算设备。
计算设备中的每个共享资源有1个锁,锁用于控制不同处理器访问共享资源的权限。处理器在访问共享资源之前需要读取共享资源的锁的状态。锁的状态用拿锁标志位表示,例如:“1”表示锁的状态为占用状态,“0”表示锁的状态为空闲状态。如果拿锁标志位为空闲状态,访问者可以访问锁对应的共享资源,并将锁的状态更新为占用状态。访问结束后,访问者将锁的状态更新为空闲状态。如果处理器读取到拿锁标志位为占用状态,处理器继续等待,直到查询到拿锁标志位为空闲状态时,才能访问共享资源。锁机制可以保证处理器以独占的方式访问共享资源。
在多CPU的计算机中,多个CPU会将同一个内存(英文:main memory)作为共享资源,且每个CPU具有一个私有的缓存,缓存可缓存内存中数据的副本。下面基于图1和图2来说明多CPU的计算设备中锁竞争的过程。在图1中,计算设备中包括4个CPU,分别为CPU1、CPU2、CPU3和CPU4。其中,CPU1配置有缓存1,CPU2配置有缓存2,CPU3配置有缓存3,CPU4配置有缓存4。上述4个CPU共享1个内存,每个CPU负责管理同一内存中不同的存储空间。拿锁标志位存储在内存中,相应地,在管理该内存的处理器的缓存中存储有拿锁标志位的数据副本。如果CPU2需要访问共享资源,首先需要获得该共享资源的锁。CPU2获取锁的过程包括:首先确定锁地址。锁地址是拿锁标志位在内存中的地址。若CPU2查询该共享资源的拿锁标志位所在的内存由CPU4管理,CPU2向CPU4发送写请求。CPU4记录有CPU4所管理的共享资源和访问该共享资源的处理器之间的映射关系。其中,访问该共享资源的处理器包括已完成共享资源访问的处理器和正在访问共享资源的处理器。假设CPU4通过CPU4所管理的共享资源和访问该共享资源的处理器之间的映射关系确定CPU1和CPU3访问过CPU所管理的共享资源。相应地,在CPU1的缓存1和CPU3的缓存3中均存储有拿锁标志位的数据副本。当CPU4在接收到CPU2的写请求时,CPU4分别向CPU1和CPU3发送侦听请求。侦听请求用于将缓存1和缓存3中的拿锁标志位进行失效处理,如修改缓存1中拿锁标志位的状态为空或删除缓存1中拿锁标志位的信息。如果缓存1关联的CPU1已完成对共享资源的使用,CPU1在对缓存1中拿锁标志位进行失效处理后,立即向CPU2发送侦听响应,该侦听响应用于指示CPU1已完成对共享资源的访问。如果CPU1未完成对共享资源的访问,则在CPU1完成对共享资源的访问后,再向CPU2发送侦听响应。同样地,CPU3接收到侦听请求的处理过程与CPU1相同。当CPU2获取CPU1和CPU3返回的侦听响应后,才能向CPU4发送消息以指示CPU4修改拿锁标志位为占用状态,进而使CPU2可以访问共享资源。
从上述锁竞争的过程可以看出:CPU在获取锁时,需要由管理锁地址所在的内存的处理器向存储有拿锁标志位的数据副本的缓存关联的CPU发送侦听请求,申请锁的CPU再接收所有存储有拿锁标志位的数据副本的缓存所关联的CPU返回的侦听响应,才能访问共
享资源。各个CPU在获取锁的过程中需要收发大量的侦听请求和侦听响应,这就需要消耗大量CPU的传输带宽和处理能力,同时增大了CPU获取锁的时延。
发明内容
本申请公开了一种锁分配的方法、装置和计算设备,能够避免在竞争锁的过程中,在各个处理器之间需要传输大量报文才能确定锁失效而引起的时延问题。
第一方面,本申请公开了一种锁分配的方法。计算设备包括多个中央处理器(英文:central processing unit,CPU)和多个节点控制器(英文:node controller,NC)。计算设备中CPU的数量为至少2个,并且CPU的数量和NC的数量相等,CPU和NC一一对应。每个NC包括一个本地队列和至少一个远程队列。本地队列和远程队列中队列是指用于存储加锁请求的一种数据结构。每个队列中的加锁请求按照先进先出的顺序处理,即只能对队列的队列头进行出队操作,以及只能在队列的队列尾的后面进行插入操作。NC的本地队列中存储NC关联的CPU发出的加锁请求。远程队列用于存储申请同一锁的多个加锁请求。其中,加锁请求包括远程队列所在的NC关联的CPU发出的加锁请求,以及其他CPU发出的加锁请求。每个NC管理至少一个锁,每个NC中的远程队列的数量和NC管理的锁的数量相等。每个NC中远程队列和锁的映射为一一对应。本申请中每个NC管理的锁的数量、以及本地队列和远程队列的长度不作限制,可根据需要进行设置。本申请中,多个NC包括第一NC、第二NC和第三NC,锁分配方法包括:
首先,第一NC接收第二NC生成的第一迁移队列,第二NC管理第一目标锁。第一迁移队列包括至少一个加锁请求。第一迁移队列中包括的所有加锁请求均用于请求相同的锁。第一NC根据先进先出的顺序对第一迁移队列中的加锁请求进行处理,即只能对第一迁移队列的队列头进行出队操作,以及在第一迁移队列的队列尾的后面进行插入操作,第一迁移队列的队列头为第一加锁请求,第一加锁请求中包括第一NC的标识。在后续的描述中第一加锁请求所请求的锁称为第一目标锁。第一NC将第一目标锁分配给关联的第一CPU。第一CPU完成对第一目标锁对应的共享资源的访问后释放第一目标锁,释放第一目标锁表示第一CPU不再占用第一目标锁,第一CPU通知第一NC释放第一目标锁。第一NC将第一加锁请求从第一迁移队列中删除。删除第一迁移队列中的第一加锁请求后,如果第一迁移队列中仍存在待处理的加锁请求,第一NC修改当前时刻第一迁移队列当前迁移队列中队列头的加锁请求的拿锁标志位为已拿锁状态,并将第一迁移队列发送给发出当前时迁移队列中队列头的加锁请求的第三NC。
可选地,本申请中也可以用堆栈存储加锁请求,每个堆栈中加锁请求按照先进后出的顺序处理。
本申请的第一方面中,NC接收到申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,由NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。
在本方面的一种可能的实施方式中,第一NC接收关联的第一CPU发送的第三加锁请求,第三加锁请求用于请求第一目标锁,第一NC可根据先进先出的顺序将第三加锁请求加入到第一NC的本地队列的队列尾的后面,第一NC可根据先进先出的顺序对本地队列中的加锁请求进行处理。当第三加锁请求为当前迁移队列中队列头的加锁请求时,在第三加锁请求中添加第一NC的标识以得到第一加锁请求。第一加锁请求中可携带第一NC的标识信息,第一NC确定第一目标锁由第二NC管理,以及确定第一目标锁与第二NC中的目标远程队列管理,第一NC将第一加锁请求发送给第二NC,以使第二NC取出第一目标锁关联的远程队列中至少一个加锁请求组成第一迁移队列。实施上述实施例,NC在本地队列中根据先进先出的顺序接收和处理加锁请求,实现加锁请求的有序处理,同时本地队列能起到缓冲作用,避免NC接收大量的加锁请求从而无法及时处理的问题。
在本方面的一种可能的实施方式中,第一NC在第一NC管理的至少一个远程队列中选择一个目标远程队列。其中,第一NC选择目标远程队列的方法可以采用以下方式中的任意一种:根据锁的优先级降序的方式每次从至少一个远程队列中选择一个目标远程队列,或者从至少一个远程队列中选择加锁请求的数量最多的远程队列作为目标远程队列,或者随机从多个远程队列中选择一个远程队列作为目标远程队列,或者采用其他选择方法选择目标远程队列,本申请不作限制。目标远程队列中包括申请第二目标锁的至少一个加锁请求;第一NC从目标远程队列中取出至少一个加锁请求,以及根据至少一个加锁请求生成第二迁移队列。其中,第二迁移队列中包括申请同一个锁的一个或多个加锁请求,第二迁移队列中加锁请求排列顺序与源目标远程队列中存储的顺序相同;第一NC将第二目标锁分配给第二迁移队列中队列头的第四加锁请求;第一NC确定发出第二迁移队列中的第四加锁请求的第四NC;第一NC将第二迁移队列发送给第四NC。
通过上述过程的描述,NC根据预设的选择策略从多个远程队列中取出目标远程队列,将目标远程队列中加锁请求取出,组成新的迁移队列。其中,迁移队列中加锁请求的排列顺序与源目标远程队列中加锁请求存储的顺序相同,第二迁移队列中加锁请求依旧按照先进先出的方式出队和入队。通过不同的选择目标远程队列的方式以适应不同的业务场景,提升灵活性。
在本方面的一种可能的实施方式中,第一NC将第一目标锁分配给关联的第一CPU包括:第一NC接收到第一迁移队列后,获取第一迁移队列中队列头的第一加锁请求携带的拿锁标志位。可以理解的是,此时第一加锁请求携带的拿锁标志位表示的状态为已拿锁状态。第一NC根据第一加锁请求的拿锁标志位更新第一NC中本地队列中存储的第三加锁请求的拿锁标志位,使第三加锁请求的拿锁标志位和第一加锁请求的拿锁标志位保持同步。同步后第三加锁请求的拿锁标志位表示的状态为已拿锁状态。第一CPU在向第一NC发送第三加锁请求后,第一NC将第三加锁请求存放在本地队列中,第一NC可向第一CPU通知第三加锁请求在本地队列中的位置,第一CPU在该位置查询第三加锁请求的拿锁标志位是否表示已拿锁状态,若为否,继续查询;若为是,第一CPU获得第一目标锁,第一CPU拥有访问第一目标锁对应的共享资源的权限,第一CPU在完成对共享资源的访问的情况下,第一CPU释放第一目标锁,第一CPU向其关联的第一NC发送释放第一目标锁的请求,第一NC接收到该请求的情况下,将第三加锁请求从第一NC的本地队列中删除。
通过实施本发明实施例,CPU向关联的NC发送加锁请求后,在关联的NC的本地队列中查询加锁请求的拿锁标志位。NC根据接收到的迁移队列中队列头的加锁请求的拿锁标志位的指示,更新本地队列中的相应地加锁请求的拿锁标志位。当CPU在查询到本地队列中加锁请求的拿锁标志位表示已拿锁状态时,获得访问锁对应的共享资源的权限,避免在竞争锁的过程中多个CPU之间收发报文,减小CPU在获得锁的时延和处理开销。
在本方面的一种可能的实施方式中,第一NC接收到第一CPU发送的释放第一目标锁的请求的情况下,将本地队列中的第三加锁请求删除。
在本方面的一种可能的实施方式中,第一NC判断当前的第一迁移队列为空的情况下,即当前的第一迁移队列中不存在待处理的加锁请求,第一NC向第一目标锁关联的第二NC返回响应报文,响应报文用于表示第一迁移队列中所有的加锁请求处理完毕。
实施上述实施例,NC在迁移队列处理完毕的情况下,由迁移队列中最后一个加锁请求的源NC通知第一目标锁关联的NC,只需要传输一个报文就能通知管理锁的NC加锁请求处理完成,避免每次在释放锁时发送通知消息,减少消息的传输数量,这样本实施例所需的处理器的传输带宽和处理能力要求低。
综上所述,本申请中NC接收到申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,由NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给当前时刻迁移队列中队列头的加锁请求对应的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态。锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
第二方面,本申请提供了一种计算设备,计算设备包括多个中央处理器CPU和多个节点控制器NC,多个CPU和多个NC呈一一对应关系,每个NC管理一个本地队列和至少一个远程队列,本地队列用于存储与NC关联的CPU发出的加锁请求,每个远程队列用于存储申请同一个锁的至少一个加锁请求;多个CPU包括第一CPU,多个NC包括第一NC、第二NC和第三NC;
第一CPU,用于向关联的第一NC发送第三加锁请求,第三加锁请求用于请求第一目标锁;然后在第一NC的本地队列中查询第三加锁请求的拿锁标志位,在查询到第三加锁请求的拿锁标志位为已拿锁状态的情况下,获得第一目标锁,访问第一目标锁对应的共享资源,在完成对共享资源的访问后,向第一NC发送释放第一目标锁的请求;
第一NC,用于接收第一CPU发送的第三加锁请求,将第三加锁请求加入到本地队列中,确定管理第一目标锁的第二NC;根据第三加锁请求生成第一加锁请求,第一加锁请求
由第三加锁请求复制得到,将第一加锁请求发送至第二NC中第一目标锁关联的远程队列;其中,第一NC的本地队列用于存储第一CPU发出的加锁请求,第一目标锁关联的远程队列用于存储申请第一目标锁的一个或多个加锁请求;
第二NC,用于接收第一加锁请求,将第一加锁请求加入第一目标锁关联的远程队列中,从第一目标锁关联的远程队列中取出至少一个加锁请求生成第一迁移队列,修改第一迁移队列中队列头的第一加锁请求的拿锁标志位为已拿锁状态,向第一NC发送第一迁移队列;
第一NC,还用于接收第一迁移队列,确定第一迁移队列中队列头的第一加锁请求,将第一目标锁分配给第一CPU,接收到第一CPU发送的释放第一目标锁的请求时,删除第一迁移队列中的第一加锁请求;当第一加锁请求中存在待处理的加锁请求时,修改第二加锁请求拿锁标志位为已拿锁状态,其中,所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述已拿锁状态用于标识所述第一目标锁被占用;将第一迁移队列发送给发出所述第二加锁请求的第三NC;
第三NC,用于接收第一NC发出的第一迁移队列,根据第二加锁请求的拿锁标志位修改第三NC的本地队列中与第二加锁请求对应的加锁请求的拿锁标志位,第三NC的本地队列用于存储与第三NC关联的CPU发出的加锁请求。
在第二方面的申请中,NC接收迁移队列,迁移队列中存储申请同一锁的多个加锁请求,且加锁请求按照请求的顺序在迁移队列中进行排队,NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU,CPU这样申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,以及不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。
在第二方面的一种可能的实施方式中,多个NC还包括第四NC,第一NC还用于:
在第一NC管理的至少一个远程队列中选择一个目标远程队列,从目标远程队列中取出至少一个加锁请求,根据至少一个加锁请求生成第二迁移队列,将第二目标锁分配给第二迁移队列中队列头的第四加锁请求,将第二迁移队列发送给发出所述第四加锁请求的第四NC;
第四NC,用于接收第一NC发送的第二迁移队列。
在第二方面的一种可能的实现方式中,第二NC执行将第一目标锁分配给第一迁移队列中队列头的第一加锁请求包括:第二NC确定第一迁移队列中队列头的第一加锁请求,将第一加锁请求的拿锁标志位修改为已拿锁状态。
在第二方面的一种可能的实施方式中,第一NC执行确定第一迁移队列中队列头的第一加锁请求,将第一目标锁分配给第一NC关联的第一CPU包括:
根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,
根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
在第二方面的一种可能的实施方式中,第一NC还用于:
在接收到第一CPU发送的释放第一目标锁的请求的情况下,删除第一NC的本地队列中的第三加锁请求。
在第二方面的一种可能的实施方式中,第一NC还用于:
在第一迁移队列中不存在待处理的加锁请求的情况下,向第二NC发送响应报文;其中,响应报文用于指示第二NC生成的第一迁移队列中至少一个加锁请求已处理完成。
第三方面,本申请提供了一种锁分配装置,锁分配装置包括接收单元、处理单元和发送单元,锁分配装置包括的各个单元用于执行第一方面或第一方面任一种可能实现方式中的锁分配方法。
第四方面,本申请提供了一种节点控制器NC,所述NC包括处理电路、存储电路、通信电路、总线,所述处理电路、存储电路和通信电路之间通过总线连接并完成相互间的通信,所述存储电路中用于存储计算机执行指令,所述控制节点运行时,所述处理电路执行所述存储电路中的计算机执行指令以利用所述控制节点中的硬件资源执行第一方面及第一方面任意一种可能实现方式中所述方法的操作步骤。
第五方面,本申请提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行第一方面及第一方面任意一种可能实现方式中所述方法。
第六方面,本申请提供一种计算机可读存储介质,所述计算设备可读存储介质中存储有指令,当其在计算设备上运行时,使得计算设备执行第二方面及第二方面任意一种可能实现方式中所述方法。
本申请在上述各方面提供的实现方式的基础上,还可以进行进一步组合以提供更多实现方式。
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍。
图1为现有技术的一种计算设备的结构示意图;
图2为现有技术的一种锁竞争方法的流程示意图;
图3为本发明实施例公开的一种计算设备的结构示意图;
图4为本发明实施例公开的另一种计算设备的结构示意图;
图5为本发明实施例公开的一种锁分配方法的流程示意图;
图6为本发明实施例公开的另一种计算设备结构示意图;
图7和图8为本发明实施例公开的另一种锁分配方法的结构示意图;
图9为本发明实施例公开的一种锁分配的装置的结构示意图;
图10是本发明实施例提供的一种节点控制器100的结构示意图。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行描述。
请参见图3,图3是本发明实施例提供的一种计算设备的结构示意图。在本发明实施
例中,计算设备包括n个处理器和n个节点控制器(英文:node controller,NC)。n为大于1的整数。处理器可以是中央处理器(英文:central processing unit,CPU),也可以是其他通用处理器、数字信号处理器(英文:digital signal processor,DSP)、专用集成电路(英文:application specific integrated circuit,ASIC)、现场可编程门阵列(英文:field-programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者是任何常规的处理器等。在本实施的以下中以CPU为例进行进一步详细介绍。
n个处理器为CPU11、CPU12、…、CPU1n,n个NC为NC21、NC22、…、NC2n。n个CPU和n个NC一一对应。CPU和关联的NC之间相互连接。NC是一块独立的硬件芯片,可以用于扩展CPU的互连数,即没有通过系统总线相连的CPU可以通过NC实现间接连接。例如,两个CPU可以连接到一个NC,通过该NC实现间接互连;两个CPU也可以通过多个NC实现多个NC互连。NC还可以用于申请锁资源和管理NC关联的CPU对应的共享资源。NC中包括进行数据处理的处理电路,存储数据的存储电路,以及分别用于NC和处理器通信的通信电路。NC之间通过网络31互连通信。网络31是由1个或多个NC组成的通信网络,n个NC中任意两个NC可通过网络31进行点对点通信。例如,网络31为快速通道互连(英文:quickpath interconnect,QPI)网络或超传输(英文:hyper transport,HT)网络。每个NC中包括一个本地队列和至少一个远程队列。本地队列和远程队列中队列是指用于存储加锁请求的一种数据结构,且每个队列中的访问请求消息按照先进先出的顺序处理,即只能对队列的队列头进行出队操作,以及只能在队列的队列尾的后面进行插入操作。NC的本地队列中存储NC关联的CPU发出的加锁请求。远程队列用于存储申请同一锁的多个加锁请求,其中,加锁请求包括远程队列所在的NC关联的CPU发出的加锁请求,以及其他CPU发出的加锁请求。每个NC中远程队列和该NC管理的锁一一对应。每个NC中存储有远程队列的标识(ID)和该NC管理的锁的锁地址之间的映射。其中,锁用于控制不同CPU访问共享资源的访问权限。锁地址为锁的拿锁标志位在内存中的内存地址。拿锁标志位表示锁的状态。拿锁标志位的值不同表示锁的状态不同。例如:拿锁标志位为“1”表示锁被占用,拿锁标志位为“0”表示锁未被占用。锁被占用也可称为“已拿锁”状态,锁未被占用也可称为“未拿锁”状态。为避免共享资源中数据不一致,在计算设备中同一时刻只允许一个访问者访问共享资源。共享资源可以是硬件资源或软件资源。例如,硬件资源包括内存空间或快捷外围部件互连(英文:Peripheral Component Interface Express,PCIE)卡的存储空间,其中,PCIE卡可以是独立硬盘冗余阵列(英文:redundant arrays ofindependent disks,RAID)卡或其他带有存储空间或内存空间的硬件。软件资源包括存储在内存或缓存中的数据库的表。每个共享资源都设置有一个锁,计算设备中的访问者在获得锁的情况下才能访问该锁对应的共享资源。其中,计算设备中的访问者为处理器。
在一种可能的实施方式中,每个NC中运行了远程代理和本地代理两个模块。本地代理用于执行与NC中的本地队列相关的操作。例如:本地代理执行入队操作、出队操作、发送加锁请求等操作。远程代理用于执行与NC中所有的远程队列相关的操作。例如:远程代理执行选择远程队列、入队操作、出队操作、生成迁移队列、分配锁、发送迁移队列等操作。
参见图4,为本发明实施例提供的一种计算设备的另一结构示意图,图4与图3的实施例的区别在于,图4中的NC是集成在处理器内部的硬件电路。
在一种可能的实施方式中,每个NC的存储电路中存储指令代码,在NC运行了远程代理和本地代理两个软件模块,远程代理用于执行与NC中的本地队列相关的操作,例如:本地代理执行入队操作、出队操作、发送加锁请求等操作;远程队列用于执行与NC中所有的远程队列相关的操作,例如:远程代理执行选择远程队列、入队操作、出队操作、生成迁移队列、分配锁、发送迁移队列等操作。
请参见图5,图5是本发明实施例提供的一种锁分配方法的流程示意图。图2所示的锁分配方法由图3或图4所示的计算设备执行。所述锁分配方法包括:
S301、第一CPU向第一NC发送第一加锁请求。
第一CPU和第一NC关联,第一CPU向第一NC发送第一加锁请求,第一加锁请求携带锁地址和拿锁标志位,第一加锁请求用于请求第一目标锁,第一加锁请求中携带拿锁标志位。可以理解的是,第一CPU向第一NC发送的第一加锁请求中携带的拿锁标志位的值表示未拿锁状态。
S302、第一NC将第一加锁请求放入本地队列中。
第一NC可根据先进先出的顺序将第一加锁请求放入本地队列中,即第一加锁请求插入到本地队列的队列尾的后面。第一NC中可预先存储有NC和锁地址的映射关系,第一NC可根据该映射关系确定第一NC管理第一目标锁。
S303、第一CPU在第一NC的本地队列中查询第一加锁请求的拿锁标志位。
第一CPU在发出第一加锁请求后,在第一NC的本地队列中查询第一加锁请求的拿锁标志位。查询的方式可以是第一CPU周期性查询第一NC的本地队列中加锁请求的拿锁标志位是否为已拿锁状态。可以理解的是,同一CPU可以发出多个加锁请求。当本地队列中存在多个加锁请求时,第一CPU可以周期性从本地队列的队列头开始依次查询本地队列中各个加锁请求的拿锁标志位的状态。
S304、第一NC在第一加锁请求中添加第一NC的标识以得到第二加锁请求。
第一NC将第一加锁请求进行复制后生成的第二加锁请求,第二加锁请求为第一加锁请求的副本。第二加锁请求中携带生成第二加锁请求的NC的标识,NC的标识可以用ID或名称或其他可唯一标识NC的信息表示。
S305、第一NC向第二NC发送第二加锁请求。
S306、第二NC将第二加锁请求放入到目标远程队列中,该目标远程队列为第二NC的至少一个远程对列中与第一目标锁对应的远程队列。
第二NC预先存储有锁和远程队列的映射关系。第二NC根据该映射关系确定第一目标锁关联的目标远程队列,第二NC可根据先进先出的顺序将第二加锁请求放入到目标远程队列中,即将第二加锁请求插入到目标远程队列的队列尾的后面。
S307、第二NC从目标远程队列中取出至少一个加锁请求生成第一迁移队列,第二加锁请求位于第一迁移队列的队列头。
第二NC管理至少一个远程队列,每个远程队列中存储有申请同一个锁的至少一个加锁请求,第二NC从至少一个远程队列中选择一个远程队列作为目标远程队列。第二NC选
择目标远程队列的方法包括但不限于:优先级降序、加锁数量降序、随机选择方法或其他方式,本实施例不作限制。第二NC从选择的目标远程队列中取出多个加锁请求,取出的加锁请求可以为目标远程队列中当前存放的所有加锁请求,也可以是目标远程队列中前面的预设数量的加锁请求,本实施例不作限制,第二NC根据取出的加锁请求生成第一迁移队列,第一迁移队列和目标远程队列中加锁请求的排序保持一致。
举例说明:NC2包括3个远程队列,分别为远程队列11、远程队列12和远程队列13,远程队列11关联锁11,远程队列12关联锁12,远程队列3关联锁13。在一种可选的实施方式中,NC2根据优先级降序的方式每次从3个远程队列中选择1个目标远程队列,假设锁11的优先级>锁12的优先级>锁13的优先级,那么NC1选择目标远程队列的顺序为远程队列11、远程队列12、远程队列13、远程队列11、远程队列12、远程队列13、…、依此顺序进行循环。
在另一种可选的实施方式中,远程队列中的加锁请求可能处于动态变化中,NC2每次从3个远程队列中选择加锁请求数量最多的远程队列作为目标远程队列。假设在当前时刻,远程队列11中存放的加锁请求的数量为5,远程队列12中存放的加锁请求的数量为4,远程队列13中存放的加锁请求的数量为3,则NC2确定当前时刻远程队列11中加锁请求的数量最多,NC2从3个远程队列中选择远程队列11作为目标远程队列。这样可以对各个远程队列中加锁请求的数量进行均衡,防止远程队列中因加锁请求数量过多导致溢出。若远程队列1为目标远程队列,NC2从远程队列1中取出全部的加锁请求生成第一迁移队列,第一迁移队列中加锁请求的排列顺序和远程队列1中加锁请求的排列顺序保持一致,即根据队列头到队列尾的顺序,第一迁移队列中存放的加锁请求为:加锁请求111、加锁请求112、加锁请求113和加锁请求114。
S308、第二NC修改第二加锁请求的拿锁标志位。
具体地,第二NC将第二加锁请求中携带的拿锁标志位修改为指定值,该指定值表示已拿锁状态。例如:将拿锁标志位修改为“1”,1表示已拿锁状态。
举例说明:第一迁移队列中存放的加锁请求包括加锁请求111、加锁请求112、加锁请求113和加锁请求114,加锁请求111在队列头的位置,接收第一迁移队列的NC将加锁请求111携带的拿锁标志位修改为“1”。
S309、第二NC向发出第二加锁请求的第一NC发送第一迁移队列。
具体地,第二加锁请求中携带生成第二加锁请求的NC的标识,第二NC可根据该NC的标识确定发出第二加锁请求的NC为第一NC。
S310、第一NC根据第一迁移队列的队列头的第二加锁请求的拿锁标志位更新本地队列中的第一加锁请求的拿锁标志位。
第一NC接收第二NC发送的第一迁移队列,第一迁移队列中至少一个加锁请求中每个加锁请求相同的锁地址。第一迁移队列由管理第一目标锁的第二NC生成。第一NC获取第一迁移队列中队列头的第二加锁请求中携带的锁地址,第一NC将第一目标锁分配给第一NC关联的第一CPU。分配第一目标锁的方法可以是:第一NC根据迁移队列中队列头的第二加锁请求携带的拿锁标志位已经被第二NC修改为已拿锁状态,第一NC根据第二加锁请求的状态标志位更新本地队列中第一加锁请求的拿锁状态标志位。其中,第二加
锁请求是由第一加锁请求复制获得的。
S311、第一CPU在第一NC的本地队列中查询第三加锁请求的拿锁标志位是否为已拿锁状态。
在S310中第一NC将第一加锁请求的拿锁标志位修改为已拿锁状态,因此,第一CPU在第一NC的本地队列中可以查询到第一加锁请求的拿锁标志位已更新为已拿锁状态,即第一CPU获得第一目标锁。
举例说明,第一迁移队列中包括加锁请求1`、加锁请求2`和加锁请求3`,第一迁移队列中加锁请求从队列头到队列尾的排列顺序为:加锁请求1`、加锁请求2`、加锁请求3`,加锁请求1`为队列头的加锁请求。若加锁请求1`、加锁请求2`和加锁请求3`中携带的锁地址为“0xffff”,加锁请求1`中携带的拿锁标志位为“1”,加锁请求2`和加锁请求3中携带的拿锁标志位均为“0”,其中拿锁标志位为“0”表示未拿锁状态,“1”表示已拿锁状态。第一NC根据加锁请求1`的拿锁标志位“1”更新本地队列中存放的加锁请求1的拿锁标志位为“1”,其中,加锁请求1`是由加锁请求1复制获得。第一CPU是与第一NC关联的CPU,第一CPU发送加锁请求1后,在第一NC的本地队列中周期性查询加锁请求1的拿锁标志位。当第一CPU在查询到加锁请求1的拿锁标志位为“1”时,确定锁地址”0xffff”指示的第一目标锁可被第一CPU使用,第一CPU获得第一目标锁,进而第一CPU能访问第一目标锁对应的共享资源。
在一种可能的实现方式中,第一NC接收第一迁移队列,当第一迁移队列中队列头的第一加锁请求的拿锁标志位表示已拿锁状态时,通知第一CPU获得第一目标锁,进而第一CPU能访问第一目标锁对应的共享资源。
S312、第一CPU访问第一目标锁对应的共享资源。
S313、第一CPU向第一NC发送释放第一目标锁的请求。
其中,第一CPU在完成对第一目标锁对应的共享资源的访问后,向第一NC发送释放第一目标锁的请求,以通知第一NC第一目标锁已被释放。
S314、第一NC删除第一迁移队列中的第二加锁请求。如果第一迁移队列中仍存在待处理的加锁请求,第一NC将第一目标锁分配给队列头的第三加锁请求。
其中,第一NC接收第一CPU发送的释放第一目标锁的请求后,删除第一迁移队列中的第二加锁请求。此时,当第一迁移队列中仍存在待处理的加锁请求时,第二加锁请求的下一个锁请求为当前时刻第一迁移队列中队列头的加锁请求,为便于后续描述,将第一迁移队列中第二加锁请求的下一个加锁请求记为第三加锁请求。第一NC判断当前的第一迁移队列是否为空队列,即第一迁移队列中是否存在待处理的加锁请求。若为是,第一NC将第一目标锁分配给当前时刻第一迁移队列中队列头的第三加锁请求,分配的方法可以是:第一NC将第三加锁请求携带的拿锁标志位修改为已拿锁状态。
根据S311的例子,第一CPU完成对第一目标锁对应的共享资源的访问时,第一CPU释放锁,并向第一NC发送释放第一目标锁的请求,第一NC接收到第一CPU发送的释放第一目标锁的消息,将加锁请求1`从第一迁移队列中删除,删除加锁请求1`后的第一迁移队列包括加锁请求2`和加锁请求3`,加锁请求2`为当前第一迁移队列中队列头的加锁请求。第一NC判断当前的第一迁移队列不为空队列,将加锁请求2`携带的拿锁标志位修改为“1”。
S315、第一NC将第一迁移队列发送给发出第三加锁请求的第三NC。
每个加锁请求中可携带发出加锁请求的NC的身份标识,第一NC可根据第三加锁请求中携带的NC的身份标识(如NC的ID)确定发出第三加锁请求的第三NC。
在本申请的一种可能的实现方式中,图5中第一NC也可以执行生成迁移队列的步骤,第一NC生成迁移队列的具体过程可参照S306至S309的描述。其中,第一NC接收迁移队列并对迁移队列中加锁请求进行处理,以及生成迁移队列两个过程可以为相互独立的两个过程,第一NC可以并行的执行上述两个过程,第一NC也可以在优先接收迁移队列并对迁移队列中加锁请求进行处理,然后再选择目标远程队列并生成迁移队列。第一NC也可以优先选择目标远程队列并生成迁移队列,然后再接收其他NC发送的迁移队列并处理迁移队列中的加锁请求。其中,NC生成迁移队列的条件本实施例不作限制,例如:第一NC可以在某个远程队列中的加锁请求的数量达到预设值的情况下,取出该远程队列中的加锁请求生成迁移队列;又例如:第一NC根据关联的CPU发出的调度指令的指示从多个远程队列中取出某个远程队列中的加锁请求生成迁移队列;又例如:第一NC根据优先级降序的方式从多个远程队列中每次选择一个远程队列,从选择的远程队列中取出加锁请求生成迁移队列,或采用其他方式生成迁移队列,本实施例不作限制。
在本发明的一种可能的实现方式中,第二NC中可以利用队列的形式存储加锁请求,也可以按照堆栈的形式存储加锁请求,堆栈中加锁请求按照先进后出的顺序进行处理。
实施上述实施例,NC接收到申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,由NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给当前时刻迁移队列中队列头的加锁请求对应的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态。锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
接下来,结合图6至图8对上述所分配的方法进行进一步详细介绍。参见图6,为本发明实施例提供的一种计算设备的结构示意图,在本发明实施例中,计算设备包括3个CPU和3个NC,3个CPU为CPU11、CPU12和CPU13,3个NC为NC21、NC22和NC23,CPU11和NC21通过总线连接,CPU12和NC22通过总线连接,CPU13和NC23通过总线连接,CPU和关联的NC之间的总线包括但不限于PCI总线、USB总线或总线。NC21、NC22和NC23通过网络31连接,网络31包括但不限于QPI网络和HT网络。NC21中设置有本地队列210、远程队列211、远程队列212和远程队列213,远程队列212和远程队
列213,每个远程队列关联一个锁;NC22中设置有本地队列220、远程队列221、远程队列222和远程队列223,每个远程队列关联一个锁;NC23中设置有本地队列230、远程队列231、远程队列232和远程队列233,每个远程队列关联一个锁。
参见图7和图8,基于图6的计算设备的结构示意图,结合图6对本发明实施例的锁分配方法的流程示意图进行举例说明:
S601、CPU11向NC21发送加锁请求1。
CPU11与NC21关联,CPU11向NC21发送加锁请求1,加锁请求1携带锁地址和拿锁标志位。可以理解的是,此时CPU11发送的加锁请求1中携带的拿锁标志位表示未拿锁状态。
S602、NC21将加锁请求1放入到本地队列210中。
NC21接收CPU11发送的加锁请求1,NC21根据先进先出的顺序将加锁请求1放入到本地队列210中,即NC21将加锁请求1放入到本地队列210的队列尾。
S603、CPU11在本地队列210中查询加锁请求1的拿锁标志位。
CPU11在发出加锁请求1后,CPU11可以在NC21的本地队列210中查询加锁请求1的拿锁标志位,在拿锁标志位的值表示已拿锁状态的情况下,CPU11获得目标锁。
可选的,NC21在接收到加锁请求1后,将加锁请求1在本地队列210中的位置通知给CPU11,以使CPU11根据根据通知的位置在本地队列210中查询加锁请求1的拿锁标志位。
S604、NC21根据本地队列210中的加锁请求1生成加锁请求1`,确定目标锁由NC23管理。
NC21可根据先进先出的顺序处理本地队列210中的加锁请求,在加锁请求1为当前时刻本地队列210中队列头的加锁请求的情况下,NC21根据加锁请求1生成加锁请求1`,加锁请求1`为加锁请求1的副本,且加锁请求1`中携带NC21的标识信息,该标识信息可以为NC21的ID或其他可以唯一标识该NC的信息。NC21预先存储有锁地址和NC标识之间的映射关系,每个NC标识可关联多个锁地址,假设NC21根据该映射关系确定加锁请求1所请求的目标锁与NC23关联。
S605、CPU12向NC22发送加锁请求2。
CPU12与NC22关联,CPU12可通过总线向NC22发送加锁请求2,加锁请求2携带锁地址和拿锁标志位,锁地址表示目标锁的地址,拿锁标志标志位表示加锁请求2是否请求到目标锁,拿锁标志位不同的值可表示不同的拿锁状态,例如:拿锁标志位的值等于“1”表示已拿锁状态,拿锁标志位的值等于“0”表示未拿锁状态。可以理解的是,CPU12发送的加锁请求2中携带的拿锁标志位的值表示未拿锁状态。
S606、NC22将加锁请求2放入到本地队列220中。
NC22接收加锁请求2,根据先进先出的顺序将加锁请求2放入到本地队列220的队列尾。同时NC22将加锁请求2的拿锁标志位存放在指定位置。由于此时加锁请求2没有获得目标锁,本地队列220中存放的加锁请求2的拿锁标志位的值表示未拿锁状态。其中,NC22可以将加锁请求2在本地队列220中的位置通知给CPU11,以使CPU11根据通知的位置在本地队列220中查询加锁请求2的拿锁标志位。
S607、CPU12在本地队列220中查询加锁请求2的拿锁标志位。
CPU12在发出加锁请求2后,CPU12在NC22的本地队列220中查询加锁请求2的拿锁标志位的值,例如:CPU12在本地队列220的队列头查询加锁请求2的拿锁标志位,在查询到加锁请求2的拿锁标志位的值表示已拿锁状态的情况下,表示CPU12获得目标锁。
S608、NC22根据本地队列220的加锁请求2生成加锁请求2`,确定目标锁由NC23管理。
NC22可根据先进先出的顺序对本地队列220中的加锁请求进行处理,在加锁请求2需要处理的情况下,根据加锁请求2生成加锁请求2`,加锁请求2为加锁请求2`的副本,且加锁请求1`中携带NC21的标识信息,该标识信息可以为NC21的ID或其他可以唯一标识该NC的信息。NC22可预先存储有锁地址和NC标识之间的映射关系,NC22根据该映射关系确定加锁请求2所请求的目标锁由NC23关联管理。
S609、CPU13向NC23发送加锁请求3。
CPU13与NC23关联,CPU13向NC23发送加锁请求3,加锁请求3携带锁地址和拿锁标志位,锁地址表示目标锁的锁地址,拿锁标志位表示加锁请求3是否获得目标锁,拿锁标志位的值用来表示已拿锁状态或未拿锁状态,例如:拿锁标志位等于“1”表示已拿锁状态,拿锁标志位等于“0”表示未拿锁状态。可以理解的是,CPU13向NC23发送的加锁请求3中携带的拿锁标志位的值表示未拿锁状态。
在本发明实施例中,假设加锁请求1、加锁请求2和加锁请求3中携带的锁地址相同,即上述三个加锁请求所请求的锁为同一个锁。在其他的应用场景中,各个CPU发出的加锁请求中携带的锁地址也可以互不相同。
S610、NC23将加锁请求3放入本地队列230中。
NC23接收加锁请求3,NC23可根据先进先出的顺序将加锁请求3放入到本地队列230中,即NC23将加锁请求3放入到本地队列230的队列尾。
S611、CPU13在本地队列230中查询加锁请求3的拿锁标志位。
CPU13在发出加锁请求3后,CPU13在NC23的本地队列230中查询加锁请求3的拿锁标志位,例如:CPU13在本地队列230的队列头查询加锁请求3的拿锁标志位,在查询到拿锁标志位表示已拿锁状态的情况下,CPU13将获得目标锁。
S612、NC23根据本地队列230中的加锁请求3生成加锁请求3`,确定目标锁由NC23管理。
NC23可根据先进先出的顺序处理本地队列230中加锁请求,在加锁请求3需要处理的情况下,例如,当加锁请求3为本地队列230的队列头时,NC23根据加锁请求3生成加锁请求3`,加锁请求3`由加锁请求3复制得到,且加锁请求1`中携带NC21的标识信息,该标识信息可以为NC21的ID或其他可以唯一标识该NC的信息。NC23可预先存储有锁地址和NC标识之间的映射关系,假设NC23根据该映射关系确定加锁请求3中的携带的锁地址与NC23关联。
需要说明的,S601至S604、S605至S608、S609至S612的先后顺序不作限制,可以是并行的执行,也可以是任意顺序执行。
S613、NC21向NC23发送加锁请求1`。
NC21存储有锁地址和管理锁的NC之间的映射关系,假设NC21根据该映射关系确定
NC21加锁请求1`所请求的目标锁由NC23管理,NC21向NC23发送加锁请求1`。
S614、NC23接收加锁请求1`,将加锁请求1`放入目标锁关联的远程队列231中。
NC23中预先存储有锁地址和远程队列标识之间的映射关系,假设NC23根据该映射关系确定加锁请求1`携带的锁地址与NC23中的远程队列231关联,NC23可根据先进先出的顺序将加锁请求1`放入到远程队列231中。
S615、NC23将加锁请求3`放入目标锁关联的远程队列231中。
NC23中设置有多个远程队列,每个远程队列关联一个锁,NC32可存储有锁地址与队列标识之间的映射关系,假设NC23根据锁地址与队列标识之间的映射关系确定目标锁与远程队列231关联,NC23将加锁请求3`根据先进先出的顺序放入到远程队列231中。
步骤S614和S615的顺序可以按照NC23接收加锁请求消息的时间先后顺序存储在远程队列231中,本实施例中假设步骤S614先于步骤S615。
S616、NC22向NC23发送加锁请求2`。
NC22存储有锁地址与管理锁的NC之间的映射关系,假设NC22根据该映射关系确定加锁请求2`所请求的目标锁与NC23关联,NC22向NC23发送加锁请求2`。
S617、NC23接收加锁请求2`,将加锁请求2`放入到目标锁关联的远程队列231中。
NC23中设置有多个远程队列,每个远程队列关联一个锁,NC23中预先存储有锁地址和远程队列标识之间的映射关系,假设NC23根据该映射关系确定加锁请求2`中携带的锁地址与远程队列231关联,NC23根据先进先出的顺序将加锁请求2`放入到远程队列231中。
S618、NC23从远程队列231中取出加锁请求1`、加锁请求3`和加锁请求2`生成迁移队列,将目标锁分配给迁移队列中的加锁请求1`。
假设NC23的远程队列231在加锁请求1`、加锁请求3`和加锁请求2`入队之前为空队列,迁移队列中加锁请求的排列顺序和远程队列231中加锁请求的排列顺序保持一致,即迁移队列的加锁请求从队列头到队列尾依次为:加锁请求1`、加锁请求3`和加锁请求2`。NC23将目标锁分配给迁移队列中的队列头的加锁请求为加锁请求1`,NC23将目标锁分配给加锁请求1`,分配的方法可以是:将迁移队列中加锁请求1`中的拿锁标志位修改为已拿锁状态。其中,NC23生成的迁移队列可存储在NC的存储单元或其他区域,本实施例不作限制。
NC23可以根据迁移队列中队列头的加锁请求1`中携带的唯一标识发出该加锁请求的NC为NC21,,NC23将迁移队列发送给NC21。
S619、NC23向NC21发送迁移队列。
在迁移队列中队列头的加锁请求为加锁请求3`的情况下,NC23不需要向其他NC发送迁移队列,NC23直接从迁移队列中取出加锁请求3`,然后根据加锁请求3`的拿锁标志位更新本地队列230中加锁请求3的拿锁标志位。
S620、NC21接收迁移队列,根据迁移队列中队列头的加锁请求1`的拿锁标志位更新本地队列210中存放的加锁请求1的拿锁标志位。
NC21确定迁移队列中队列头的加锁请求1`,此时加锁请求1`的拿锁标志位表示已拿锁状态,NC21根据加锁请求1`的拿锁标志位更新本地队列210中的存放的加锁请求1的
拿锁标志位,更新后本地队列210中的加锁请求1的拿锁标志位也表示已拿锁状态。NC21接收的迁移队列可存储在NC的寄存器、缓冲器或其他区域,本实施例不作限制。
S621、CPU11查询到加锁请求1的拿锁标志位表示已拿锁状态,访问目标锁对应的共享资源。
S622、CPU11在完成目标锁对应的共享资源的访问后,向NC21发送释放目标锁的请求。
S623、NC21接收CPU11发送的释放目标锁的请求后,删除迁移队列中的加锁请求1`,以及删除本地队列210中的加锁请求1。
其中,删除迁移队列中的加锁请求1`后,迁移队列中包括加锁请求3`和加锁请求2`,加锁请求3`为当前时刻迁移队列的队列头。
值得说明的是,本地队列中存储的是加锁请求消息和拿锁标志位的记录,主要用于申请共享资源的CPU确认是否可以访问该共享资源。当本地队列中存储的加锁请求已完成处理后,即NC接收到CPU发送的释放目标锁的请求后,会删除本地队列中加锁请求,释放存储空间,以便于其他新增加锁请求可以正常存储在本地队列中。
S624、当NC21判断迁移队列不为空队列时,将目标锁分配给当前迁移队列的队列头的加锁请求3`。
NC21判断迁移队列是否为空队列,即迁移队列中是否存在待处理的加锁请求,根据S623的结果,迁移队列中包括加锁请求3`和加锁请求2`,NC21确定迁移队列中队列头的加锁请求为加锁请求3`,NC21可根据加锁请求3`中携带的源NC标识(例如NC ID)确定发出加锁请求3`的NC为NC23。
S625、NC21向发出加锁请求3`的NC23发送迁移队列。
S626、NC23接收迁移队列,根据迁移队列中队列头的加锁请求3`的拿锁标志位更新本地队列230中存放的加锁请求3的拿锁标志位。
可选的,NC23确定迁移队列中队列头的加锁请求3`,此时加锁请求3`的拿锁标志位表示已拿锁状态,NC23根据加锁请求3`的拿锁标志位更新本地队列230中的存放的加锁请求3的拿锁标志位,更新后本地队列230中的加锁请求3的拿锁标志位也表示已拿锁状态。
S627、CPU13在本地队列230中查询到加锁请求3的拿锁标志位表示已拿锁状态,CPU13获得目标锁,访问目标锁对应的共享资源。
S628、CPU13在完成对共享资源的访问后,向NC23发送释放目标锁的请求。
S629、NC23接收释放目标锁的请求后,删除迁移队列中的加锁请求3`,以及删除本地队列230中的加锁请求3。
迁移队列中删除加锁请求3`后,迁移队列中仅包括加锁请求2`,加锁请求2`为当前时刻迁移队列的队列头。
S630、当NC23确定迁移队列不为空队列时,修改当前迁移队列的队列头的加锁请求2`的拿锁标志位。
NC23判断迁移队列是否为空队列,即迁移队列中是否存在待处理的加锁请求,根据S629的结果,迁移队列中包括加锁请求2`,NC23确定迁移队列中队列头的加锁请求为加
锁请求2`,NC23可根据加锁请求2`中携带的源NC标识(例如NC ID)确定发出加锁请求2`的NC为NC22。
S631、NC23向发出加锁请求2`的NC22发送迁移队列。
S632、NC22接收迁移队列,根据迁移队列中队列头的加锁请求2`的拿锁标志位更新本地队列220中存放的加锁请求2的拿锁标志位。
可选的,NC22确定迁移队列中队列头的加锁请求2`,此时加锁请求2`的拿锁标志位表示已拿锁状态,NC22根据加锁请求2`的拿锁标志位更新本地队列220中的存放的加锁请求2的拿锁标志位,更新后本地队列220中的加锁请求2的拿锁标志位也表示已拿锁状态。
S633、CPU12查询到加锁请求2的拿锁标志位表示已拿锁状态,访问目标锁对应的共享资源。
S634、CPU12在完成对共享资源的访问后,向NC22发送释放目标锁的请求。
S635、NC22删除迁移队列中的加锁请求2`,以及删除本地队列220中的加锁请求2。
删除迁移队列中的加锁请求2`后,迁移队列中不存在待处理的加锁请求。
S636、当迁移队列中不存在待处理的加锁请求时,NC22向NC23发送响应报文。其中,NC23为管理目标锁的NC。
NC22向目标锁关联的NC23发送响应报文,以通知NC23迁移队列中的加锁请求处理完毕。NC23可根据预设的规则从远程队列中选择多个加锁请求生成新的迁移队列,按照S618-S637的流程对迁移队列进行处理。
实施本申请的实施例,NC接收包括申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给迁移队列中当前时刻队列头的加锁请求的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态,锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
上文中结合图3至图8,详细描述了根据本发明实施例所提供的锁分配的方法,下面将结合图9和图10,描述根据本发明实施例所提供的锁分配方法的装置和计算设备。
参见图9,为本发明实施例提供的一种锁分配的装置的结构示意图,装置5对应图5中的第一NC,装置5包括接收单元501、处理单元502和发送单元503。本实施例的锁分配装置用于执行图5的锁分配方法,其中术语和过程可参照图5的描述,此处不再赘述。
装置5包括:
接收单元501,用于接收第二NC生成的第一迁移队列;其中,所述第二NC管理第一目标锁,所述第一迁移队列中包括申请所述第一目标锁的至少一个加锁请求,所述第一迁移队列中队列头的加锁请求为第一加锁请求,所述第一加锁请求包括所述第一NC的标识;
处理单元502,用于将所述第一目标锁分配给所述装置关联的第一中央处理器CPU;
接收单元501,还用于当接收所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一加锁请求;
处理单元502,还用于当所述第一迁移队列中存在待处理的加锁请求时,修改第二加锁请求的拿锁标志位为已拿锁状态,所述已拿锁状态用于标识所述第一目标锁被占用;其中,所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述第二加锁请求包括第三NC的标识,所述第三NC为发出所述第二加锁请求的NC;
发送单元503,用于将所述第一迁移队列发送给发出所述第二加锁请求的第三NC。
本发明实施例的装置5可以用ASIC实现,或可编程逻辑器件(英文:programmable logic device,PLD)实现,上述PLD可以是复杂可编程逻辑器件(英文:complex programmable logic device,CPLD),FPGA,通用阵列逻辑(英文:generic array logic,GAL)或其任意组合。也可以通过软件实现图5所示的锁分配方法时,装置5及其各个模块也可以为软件模块。
可选的,接收单元501,还用于在所述接收单元501接收第二NC生成的第一迁移队列之前,接收所述第一CPU发送的第三加锁请求;其中,所述第三加锁请求用于请求所述第一目标锁;
处理单元502,还用于将所述第三加锁请求加入到本地队列中;其中,所述本地队列用于存储所述第一CPU发出的加锁请求;将所述第三加锁请求复制得到第一加锁请求,所述第一加锁请求中携带所述第一NC的标识信息;
发送单元503,还用于将所述第一加锁请求发送至所述第二NC中所述第一目标锁关联的远程队列,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的所述至少一个加锁请求,以使所述第二NC取出所述第一目标锁关联的远程队列中所述至少一个加锁请求组成所述第一迁移队列。
处理单元502,根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
可选的,处理单元502,还用于删除所述装置的本地队列中的所述第三加锁请求。
可选的,发送单元503还用于,当所述第一迁移队列为空时,向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的第一迁移队列中所述至少一个加锁请求已处理完成。
可选的,处理单元502,还用于在所述装置管理的至少一个远程队列中选择一个目标远程队列,所述目标远程队列中包括申请第二目标锁的至少一个加锁请求;从所述目标远
程队列中取出所述至少一个加锁请求,以及根据所述至少一个加锁请求生成第二迁移队列;其中,所述第二迁移队列中包括所述一个或多个加锁请求;修改所述第二迁移队列中队列头的第四加锁请求的拿锁标志位为已拿锁状态;
发送单元503,还用于将所述第二迁移队列发送给发出所述加锁请求的第四NC。
根据本发明实施例的装置5可对应于执行本发明实施例中描述的方法,并且装置5中的各个单元的上述和其它操作和/或功能分别为了实现图5中的各个方法的相应流程,为了简洁,在此不再赘述。
实施本申请的实施例,NC接收包括申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给迁移队列中当前时刻队列头的加锁请求的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态,锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
请参见图10,图10是本发明实施例提供的一种锁分配的节点控制器100的结构示意图,该节点控制器100对应图5中第一NC,该第一NC可以是图3或图4中任意一个NC。该装置5包括处理电路501、存储电路502和通信电路503,处理电路501、存储电路502和通信电路503可通过总线或以直连的方式相互连接。
存储电路502包括但不限于是随机存取记忆体(RAM),该存储电路502用于相关指令及数据。通信电路503用于接收和发送数据,通信电路503包括NC和CPU之间的接口电路,处理电路和存储电路之间的接口电路,NC和CPU之间的数据以及处理电路501和存储电路502之间的数据通过通信电路503进行传输。本实施例的第一NC用于执行图5的锁分配方法,其中术语和过程可参照图2的描述,此处不再赘述。
该处理电路501可以是专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。
节点控制器100中的处理电路501用于读取所述存储电路502中存储的程序代码,执行以下操作:
接收第二NC生成的第一迁移队列;其中,所述第二NC管理第一目标锁,所述第一迁移队列包括申请所述第一目标锁的至少一个加锁请求,所述第一迁移队列中队列头的加锁请求为第一加锁请求,所述第一加锁请求包括所述第一NC的标识;
将所述第一目标锁分配给所述第一NC关联的第一CPU;
当接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一迁移队列
中队列头的所述第一加锁请求;
当所述第一迁移队列中存在待处理的加锁请求时,修改第二加锁请求的拿锁标志位为已拿锁状态,所述已拿锁状态用于标识所述第一目标锁被占用;所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述第二加锁请求包括第三NC的标识,所述第三NC为发出所述第二加锁请求的NC;
将所述第一迁移队列发送给发出所述第二加锁请求的第三NC。
可选的,处理电路501执行所述接收第一迁移队列之前,还用于执行:
接收所述第一CPU发送的第三加锁请求;其中,所述第三加锁请求用于请求所述第一目标锁;
将所述第三加锁请求加入到本地队列中;其中,所述本地队列用于存储所述第一CPU发出的加锁请求;
在所述第三加锁请求中添加第一NC的标识以得到第一加锁请求;
将所述第一加锁请求发送至所述第二NC中所述第一目标锁关联的远程队列,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的所述至少一个加锁请求,以使所述第二NC取出所述第一目标锁关联的远程队列中所述至少一个加锁请求组成所述第一迁移队列。
可选的,处理电路501执行所述将所述第一目标锁分配给所述第一NC关联的第一CPU包括:
根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
可选的,处理电路501执行所述接收到所述第一CPU发送的释放所述第一目标锁的请求,删除所述第一迁移队列中的所述第一加锁请求,还包括:
删除所述第一NC的本地队列中的所述第三加锁请求。
可选的,处理电路501还用于执行:
当所述第一迁移队列为空时,向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的第一迁移队列中所述至少一个加锁请求已处理完成。
可选的,处理电路501还用于执行:
在所述第一NC管理的至少一个远程队列中选择一个目标远程队列,所述目标远程队列中包括申请第二目标锁的至少一个加锁请求;
从所述目标远程队列中取出所述至少一个加锁请求,以及根据所述至少一个加锁请求生成第二迁移队列;其中,所述第二迁移队列中包括所述一个或多个加锁请求;
修改所述第二迁移队列中队列头的第四加锁请求的拿锁标志位为已拿锁状态;其中,所述第二迁移队列为先进先出队列;
所述第一NC将所述第二迁移队列发送给发出所述第四加锁请求的第四NC。
在一种可能的实施方式中,节点控制器100的存储电路502中还包括远程代理5021和
本地代理5022两个软件模块,处理电路501调用远程代理用于执行与装置5中的本地队列相关的操作,例如:处理电路501调用本地代理执行入队操作、出队操作、发送加锁请求等操作;处理电路501调用远程队列用于执行与装置5中所有的远程队列相关的操作,例如:远程代理执行选择远程队列、入队操作、出队操作、生成迁移队列、分配锁、发送迁移队列等操作。
应理解,根据本发明实施例的锁分配的节点控制器100可以对应于执行根据本发明实施例中图5所示的方法中的第一NC和图9所述的装置5。并且节点控制器100中的各个模块的上述和其它操作和/或功能分别为了实现图5中的各个方法的相应流程,为了简洁,在此不再赘述。
实施本申请的实施例,NC接收包括申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给迁移队列中当前时刻队列头的加锁请求的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态,锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
参见图3和图4,为本发明实施例提供的一种计算设备的结构示意图,在本发明实施例中,所述计算设备包括n个处理器(CPU11至CPU1n)和n个节点控制器(NC21至NC2n),n为大于1的整数,n个NC包括第一NC、第二NC和第三NC,n个处理器包括第一个处理器、第二处理器和第三处理器,第一NC和第一处理器具有映射关系,第二NC和第二处理器具有映射关系,第三NC和第三处理器具有映射关系。每个节点控制器管理一个本地队列和至少一个远程队列,本地队列用于存储与NC存在映射关系的CPU发出的加锁请求,每个远程队列关联一个NC锁管理的锁资源,本地队列和远程队列均为先进先出队列。本发明实施例所涉及的术语和具体过程可参照图5的描述,此处不再赘述。
第一处理器,用于向关联的所述第一NC发送第三加锁请求,,所述第三加锁请求用于请求第一目标锁;在所述第一NC的本地队列中查询所述第三加锁请求的拿锁标志位,当查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源,在完成对所述共享资源的访问后向所述第一NC发送释放所述第一目标锁的请求;
第一NC,用于接收所述第一处理器发送的第三加锁请求,将所述第三加锁请求加入到本地队列中;在所述第三加锁请求中添加所述第一NC的标识以得到第一加锁请求;将所述第一加锁请求发送至管理所述第一目标锁的所述第二NC;将所述第一加锁请求发送至管理所述第一目标锁的所述第二NC中所述第一目标锁关联的远程队列;其中,所述第一NC
的本地队列用于存储所述第一处理器发出的加锁请求,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的一个或多个加锁请求;
第二NC,用于接收所述第一加锁请求,将所述第一加锁请求加入所述第一目标锁关联的远程队列中,从所述第一目标锁关联的远程队列中取出至少一个加锁请求生成第一迁移队列;修改所述第一迁移队列中队列头的所述第一加锁请求的拿锁标志位为已拿锁状态;向所述第一NC发送所述第一迁移队列;其中,所述第一迁移队列为先进先出队列;
第一NC,还用于接收所述第一迁移队列,将所述第一目标锁分配给所述第一处理器,接收到所述第一处理器发送的释放所述第一目标锁的请求时,删除所述第一迁移队列中的所述第一加锁请求;当所述第一加锁请求中存在待处理的加锁请求时,修改当前时刻所述第一迁移队列中队列头的第二加锁请求的拿锁标志位为已拿锁状态,所述已拿锁状态用于标识所述第一目标锁被占用;将所述第一迁移队列发送给发出所述第二加锁请求的所述第三NC,以指示所述第三NC根据所述第二加锁请求的拿锁标志位修改所述第三NC的本地队列中与第二加锁请求对应的加锁请求的拿锁标志位,所述第三NC的本地队列用于存储与所述第三NC关联的CPU发出的加锁请求;
第三NC,用于接收所述第一NC发出的所述第一迁移队列。
在本发明实施例中的处理器可以是CPU,处理器还可以是其他通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者是任何常规的处理器等。
可选的,第一NC执行所述确定所述第一迁移队列中队列头的所述第一加锁请求,将所述第一目标锁分配给所述第一NC关联的第一CPU包括:
根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,
根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
可选的,第一NC还用于:
接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一NC的本地队列中的所述第三加锁请求。
可选的,第一NC,还用于在所述第一迁移队列中不存在待处理的加锁请求的情况下,向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的所述第一迁移队列中至少一个加锁请求已处理完成。
实施本申请的实施例,NC接收到申请同一锁的多个加锁请求的迁移队列,该迁移队列中加锁请求的排列顺序与管理锁的NC接收各个CPU发送的加锁请求的先后顺序相同,由NC将迁移队列中队列头的加锁请求所请求的锁分配给关联的CPU。申请锁的CPU在获取锁的过程中不需要由管理该锁的CPU发送侦听请求,申请锁的CPU也不需要接收其他CPU发送的侦听响应,避免计算设备中各个CPU接收和发送大量的报文,由此减少了获取锁的
时延。进一步地,NC接收到CPU发送的释放锁的请求后,删除迁移队列中队列头的加锁请求,修改当前时刻迁移队列中队列头的加锁请求的拿锁标志位,并将迁移队列发送给当前时刻迁移队列中队列头的加锁请求对应的NC。避免将锁返回给管理锁的NC,申请同一个锁的其他NC再次向管理锁的NC请求锁而产生多个请求消息,减少了请求消息的数量。再次,NC在获取锁的过程中利用迁移队列依次将锁分配给各个申请锁的CPU,通过NC的迁移队列中拿锁标志位记录是否为已拿锁状态。锁的获取过程不需要CPU访问其关联的内存和缓存,避免了CPU在确定是否已完成对共享资源的使用过程中需要访问其关联的缓存或内存所导致的存储带宽消耗问题。
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集合的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质。半导体介质可以是固态硬盘(SSD)。
以上所述,仅为本发明的具体实施方式。熟悉本技术领域的技术人员根据本发明提供的具体实施方式,可想到变化或替换。
Claims (17)
- 一种锁分配的方法,其特征在于,所述方法包括:第一节点控制器(NC)接收第二NC生成的第一迁移队列,其中,所述第二NC管理第一目标锁,所述第一迁移队列包括申请所述第一目标锁的至少一个加锁请求,所述第一迁移队列中队列头的加锁请求为第一加锁请求,所述第一加锁请求包括所述第一NC的标识;所述第一NC将所述第一目标锁分配给所述第一NC关联的第一中央处理器(CPU);当所述第一NC接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一加锁请求;当删除了所述第一加锁请求的所述第一迁移队列中存在待处理的加锁请求时,所述第一NC修改第二加锁请求的拿锁标志位为已拿锁状态,所述已拿锁状态用于标识所述第一目标锁被占用,所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述第二加锁请求包括第三NC的标识,所述第三NC为发出所述第二加锁请求的NC;所述第一NC将所述第一迁移队列发送给所述第三NC,以指示所述第三NC根据所述第二加锁请求的拿锁标志位修改所述第三NC的本地队列中与第二加锁请求对应的加锁请求的拿锁标志位,所述第三NC的本地队列用于存储与所述第三NC关联的CPU发出的加锁请求。
- 如权利要求1所述的方法,其特征在于,所述第一NC接收第二NC生成的第一迁移队列之前,所述方法还包括:所述第一NC接收所述第一CPU发送的第三加锁请求;其中,所述第三加锁请求用于请求所述第一目标锁;所述第一NC将所述第三加锁请求加入到所述第一NC的本地队列中;其中,所述第一NC的本地队列用于存储所述第一CPU发出的加锁请求;所述第一NC在所述第三加锁请求中添加所述第一NC的标识以得到所述第一加锁请求;所述第一NC将所述第一加锁请求发送至所述第二NC中所述第一目标锁关联的远程队列,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的所述至少一个加锁请求,以使所述第二NC取出所述第一目标锁关联的远程队列中所述至少一个加锁请求组成所述第一迁移队列。
- 如权利要求2所述的方法,其特征在于,所述第一NC将所述第一目标锁分配给所述第一NC关联的第一CPU包括:所述第一NC根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,所述第一NC根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
- 如权利要求3所述的方法,其特征在于,所述当所述第一NC接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一加锁请求,还包括:所述第一NC删除所述第一NC的本地队列中的所述第三加锁请求。
- 如权利要求1所述的方法,其特征在于,所述方法还包括:当删除了所述第一加锁请求的所述第一迁移队列为空时,所述第一NC向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的第一迁移队列中所述至少一个加锁请求已处理完成。
- 如权利要求1所述的方法,其特征在于,所述方法还包括:所述第一NC在所述第一NC管理的至少一个远程队列中选择一个作为目标远程队列;所述目标远程队列中包括申请第二目标锁的至少一个加锁请求;所述第一NC从所述目标远程队列中取出所述至少一个加锁请求,以及根据所述至少一个加锁请求生成第二迁移队列,其中,所述第二迁移队列中包括所述至少一个加锁请求;所述第一NC修改所述第二迁移队列中队列头的第四加锁请求的拿锁标志位为已拿锁状态;所述第一NC将所述第二迁移队列发送给发出所述第四加锁请求的第四NC。
- 一种计算设备,其特征在于,包括:所述计算设备包括多个中央处理器(CPU)和多个节点控制器(NC),所述多个CPU和所述多个NC呈一一对应关系,每个NC管理一个本地队列和至少一个远程队列,所述本地队列用于存储与NC关联的CPU发出的加锁请求,每个远程队列用于存储申请同一个锁的至少一个加锁请求;所述多个CPU包括第一CPU,所述多个NC包括第一NC、第二NC和第三NC;所述第一CPU,用于向关联的所述第一NC发送第三加锁请求,所述第三加锁请求用于请求第一目标锁;在所述第一NC的本地队列中查询所述第三加锁请求的拿锁标志位,当查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;在完成对所述共享资源的访问后向所述第一NC发送释放所述第一目标锁的请求;所述第一NC,用于接收所述第一CPU发送的第三加锁请求;将所述第三加锁请求加入到本地队列中;在所述第三加锁请求中添加所述第一NC的标识以得到第一加锁请求;将所述第一加锁请求发送至管理所述第一目标锁的所述第二NC,;其中,所述第一NC的本地队列用于存储所述第一CPU发出的加锁请求,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的至少一个加锁请求;所述第二NC,用于接收所述第一加锁请求,将所述第一加锁请求加入所述第一目标锁关联的远程队列;从所述第一目标锁关联的远程队列中取出至少一个加锁请求生成第一迁移队列,所述第一迁移队列中队列头的加锁请求为第一加锁请求,所述第一加锁请求包括所述第一NC的标识;修改所述第一加锁请求的拿锁标志位为已拿锁状态;向所述第一NC发送所述第一迁移队列;所述第一NC,还用于接收所述第一迁移队列;将所述第一目标锁分配给所述第一CPU;当接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一迁移队列中队列头的所述第一加锁请求;当删除了所述第一加锁请求的所述第一迁移队列中存在待处理 的加锁请求时,修改第二加锁请求的拿锁标志位为已拿锁状态,其中,所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述已拿锁状态用于标识所述第一目标锁被占用,所述第二加锁请求包括第三NC的标识,所述第三NC为发出所述第二加锁请求的NC;将所述第一迁移队列发送给所述第三NC;所述第三NC,用于接收所述第一NC发出的所述第一迁移队列,根据所述第二加锁请求的拿锁标志位修改所述第三NC的本地队列中与第二加锁请求对应的加锁请求的拿锁标志位,所述第三NC的本地队列用于存储与所述第三NC关联的CPU发出的加锁请求。
- 如权利要求7所述的计算设备,其特征在于,所述第一NC执行所述将所述第一目标锁分配给所述第一NC关联的第一CPU,包括:根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,以指示所述第一CPU在查询到所述第三加锁请求的拿锁标志位为已拿锁状态时,访问所述第一目标锁对应的共享资源;或者,根据所述第一加锁请求的拿锁标志位修改所述第一NC的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
- 如权利要求7所述的计算设备,其特征在于,所述第一NC,还用于接收到所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一NC的本地队列中的所述第三加锁请求。
- 如权利要求7所述的计算设备,其特征在于,所述第一NC,还用于在所述第一迁移队列中不存在待处理的加锁请求的情况下,向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的所述第一迁移队列中至少一个加锁请求已处理完成。
- 一种锁分配的装置,其特征在于,所述装置包括接收单元、处理单元和发送单元;所述接收单元,用于接收第二节点控制器(NC)生成的第一迁移队列,其中,所述第二NC管理第一目标锁,所述第一迁移队列中包括申请所述第一目标锁的至少一个加锁请求,所述第一迁移队列中队列头的加锁请求为第一加锁请求,所述第一加锁请求包括所述第一NC的标识;所述处理单元,用于将所述第一目标锁分配给所述装置关联的第一中央处理器(CPU);所述接收单元,还用于当接收所述第一CPU发送的释放所述第一目标锁的请求时,删除所述第一加锁请求;所述处理单元,还用于当删除了所述第一加锁请求的所述第一迁移队列中存在待处理的加锁请求时,修改第二加锁请求的拿锁标志位为已拿锁状态,所述已拿锁状态用于标识所述第一目标锁被占用,所述第二加锁请求为删除了所述第一加锁请求的所述第一迁移队列中队列头的加锁请求,所述第二加锁请求包括第三NC的标识,所述第三NC为发出所述第二加锁请求的NC;所述发送单元,用于将所述第一迁移队列发送给所述第三NC。
- 如权利要求11所述装置,其特征在于,所述接收单元,还用于在所述接收单元接收第二NC生成的第一迁移队列之前,接收 所述第一CPU发送的第三加锁请求;其中,所述第三加锁请求用于请求所述第一目标锁;所述处理单元,还用于将所述第三加锁请求加入到所述装置的本地队列中;其中,所述装置的本地队列用于存储所述第一CPU发出的加锁请求,所述第一加锁请求中携带所述装置的标识信息;在所述第三加锁请求中添加所述装置的标识以得到第一加锁请求;所述发送单元,还用于将所述第一加锁请求发送至所述第二NC中所述第一目标锁关联的远程队列,所述第一目标锁关联的远程队列用于存储申请所述第一目标锁的所述至少一个加锁请求,以使所述第二NC取出所述第一目标锁关联的远程队列中所述至少一个加锁请求组成所述第一迁移队列。
- 如权利要求12所述装置,其特征在于,所述处理单元,根据所述第一加锁请求的拿锁标志位修改所述装置的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态;或者,根据所述第一加锁请求的拿锁标志位修改所述装置的本地队列中存储的所述第三加锁请求的拿锁标志位为已拿锁状态,并通知所述第一CPU访问所述第一目标锁对应的共享资源。
- 如权利要求13所述装置,其特征在于,所述处理单元,还用于删除所述装置的本地队列中的所述第三加锁请求。
- 如权利要求11所述装置,其特征在于,所述发送单元,还用于当删除了所述第一加锁请求的所述第一迁移队列为空时,向所述第二NC发送响应报文;其中,所述响应报文用于指示所述第二NC生成的第一迁移队列中所述至少一个加锁请求已处理完成。
- 如权利要求11所述的装置,其特征在于,所述处理单元,还用于在所述第一NC管理的至少一个远程队列中选择一个作为目标远程队列,所述目标远程队列中包括申请第二目标锁的至少一个加锁请求;从所述目标远程队列中取出所述至少一个加锁请求,以及根据所述至少一个加锁请求生成第二迁移队列,其中,所述第二迁移队列中包括所述至少一个加锁请求;修改所述第二迁移队列中队列头的第四加锁请求的拿锁标志位为已拿锁状态;所述发送单元,还用于将所述第二迁移队列发送给发出所述第四加锁请求的第四NC。
- 一种节点控制器NC,其特征在于,所述NC包括处理电路、存储电路和通信电路,所述处理单元、存储电路和通信电路之间连接并完成相互间的通信,所述存储电路中用于存储计算机执行指令,所述NC运行时,所述处理单元执行所述存储电路中的计算机执行指令以利用所述NC中的硬件资源执行权利要求1至6中任一所述方法的操作步骤。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/CN2017/079065 WO2018176397A1 (zh) | 2017-03-31 | 2017-03-31 | 一种锁分配的方法、装置和计算设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108990422A true CN108990422A (zh) | 2018-12-11 |
CN108990422B CN108990422B (zh) | 2021-07-20 |
Family
ID=63673838
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780000600.XA Active CN108990422B (zh) | 2017-03-31 | 2017-03-31 | 一种锁分配的方法、装置和计算设备 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11231964B2 (zh) |
CN (1) | CN108990422B (zh) |
WO (1) | WO2018176397A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112148695A (zh) * | 2019-06-26 | 2020-12-29 | 华为技术有限公司 | 一种资源锁管理方法及装置 |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018219440A1 (en) * | 2017-05-31 | 2018-12-06 | Huawei Technologies Co., Ltd. | System and method for dynamic determination of a number of parallel threads for a request |
CN113656423B (zh) * | 2021-08-18 | 2024-08-09 | 北京百度网讯科技有限公司 | 更新数据的方法及装置、电子设备和存储介质 |
US11941446B1 (en) * | 2022-10-12 | 2024-03-26 | Dell Products L.P. | Reducing extraneous messages in a distributed lock system |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0752651A2 (en) * | 1995-07-07 | 1997-01-08 | Sun Microsystems, Inc. | Index value reference for shared data structures |
CN1945539A (zh) * | 2006-10-19 | 2007-04-11 | 华为技术有限公司 | 计算机集群系统中共享资源锁分配方法与计算机及集群系统 |
CN101051281A (zh) * | 2007-05-16 | 2007-10-10 | 杭州华三通信技术有限公司 | 多cpu对临界资源进行互斥访问的方法和装置 |
CN1973266B (zh) * | 2004-04-02 | 2010-05-05 | 西姆毕恩软件有限公司 | 对或涉及用于计算装置的操作系统的改进 |
CN101290588B (zh) * | 2008-03-07 | 2010-06-16 | 重庆邮电大学 | 一种微嵌入式实时任务调度器及调度方法 |
CN101256509B (zh) * | 2008-04-07 | 2010-09-01 | 中兴通讯股份有限公司 | 一种锁机制的加锁方法、解锁方法和实现方法 |
CN102298539A (zh) * | 2011-06-07 | 2011-12-28 | 华东师范大学 | 一种用于分布式并行处理的共享资源调度方法及系统 |
CN102566979A (zh) * | 2011-12-02 | 2012-07-11 | 华为技术有限公司 | 实现自适应锁的方法和装置以及多核处理器系统 |
US8635619B2 (en) * | 2009-11-30 | 2014-01-21 | International Business Machines Corporation | Schedule virtual interface allowing resynchronization requests for lock tokens before attachment of a scheduling element triggered by an unlock request |
CN104102549A (zh) * | 2013-04-01 | 2014-10-15 | 华为技术有限公司 | 一种实现多线程互斥操作的方法、装置和芯片 |
US20150281336A1 (en) * | 2014-03-26 | 2015-10-01 | Unisys Corporation | Distributable computational units in a continuous computing fabric environment |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6141720A (en) * | 1997-06-12 | 2000-10-31 | Cabletron Systems, Inc. | Method and apparatus for coordination of a shared object in a distributed system |
US5913213A (en) * | 1997-06-16 | 1999-06-15 | Telefonaktiebolaget L M Ericsson | Lingering locks for replicated data objects |
US7500037B2 (en) * | 2007-01-30 | 2009-03-03 | International Business Machines Corporation | System, method and program for managing locks |
CN104346317B (zh) * | 2013-07-23 | 2019-08-27 | 南京中兴软件有限责任公司 | 共享资源访问方法和装置 |
CN107977376B (zh) * | 2016-10-24 | 2020-07-07 | 腾讯科技(深圳)有限公司 | 分布式数据库系统及事务处理方法 |
-
2017
- 2017-03-31 WO PCT/CN2017/079065 patent/WO2018176397A1/zh active Application Filing
- 2017-03-31 CN CN201780000600.XA patent/CN108990422B/zh active Active
-
2019
- 2019-01-09 US US16/243,582 patent/US11231964B2/en active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0752651A2 (en) * | 1995-07-07 | 1997-01-08 | Sun Microsystems, Inc. | Index value reference for shared data structures |
CN1973266B (zh) * | 2004-04-02 | 2010-05-05 | 西姆毕恩软件有限公司 | 对或涉及用于计算装置的操作系统的改进 |
CN1945539A (zh) * | 2006-10-19 | 2007-04-11 | 华为技术有限公司 | 计算机集群系统中共享资源锁分配方法与计算机及集群系统 |
CN101051281A (zh) * | 2007-05-16 | 2007-10-10 | 杭州华三通信技术有限公司 | 多cpu对临界资源进行互斥访问的方法和装置 |
CN101290588B (zh) * | 2008-03-07 | 2010-06-16 | 重庆邮电大学 | 一种微嵌入式实时任务调度器及调度方法 |
CN101256509B (zh) * | 2008-04-07 | 2010-09-01 | 中兴通讯股份有限公司 | 一种锁机制的加锁方法、解锁方法和实现方法 |
US8635619B2 (en) * | 2009-11-30 | 2014-01-21 | International Business Machines Corporation | Schedule virtual interface allowing resynchronization requests for lock tokens before attachment of a scheduling element triggered by an unlock request |
CN102298539A (zh) * | 2011-06-07 | 2011-12-28 | 华东师范大学 | 一种用于分布式并行处理的共享资源调度方法及系统 |
CN102566979A (zh) * | 2011-12-02 | 2012-07-11 | 华为技术有限公司 | 实现自适应锁的方法和装置以及多核处理器系统 |
CN104102549A (zh) * | 2013-04-01 | 2014-10-15 | 华为技术有限公司 | 一种实现多线程互斥操作的方法、装置和芯片 |
US20150281336A1 (en) * | 2014-03-26 | 2015-10-01 | Unisys Corporation | Distributable computational units in a continuous computing fabric environment |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112148695A (zh) * | 2019-06-26 | 2020-12-29 | 华为技术有限公司 | 一种资源锁管理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
US11231964B2 (en) | 2022-01-25 |
WO2018176397A1 (zh) | 2018-10-04 |
CN108990422B (zh) | 2021-07-20 |
US20190146845A1 (en) | 2019-05-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11940959B2 (en) | Heterogeneous distributed file system using different types of storage mediums | |
US20180121359A1 (en) | Configuration based cache coherency protocol selection | |
US7047322B1 (en) | System and method for performing conflict resolution and flow control in a multiprocessor system | |
US20190163545A1 (en) | Messages with delayed delivery in an in-database sharded queue | |
US8024528B2 (en) | Global address space management | |
US7631150B2 (en) | Memory management in a shared memory system | |
JP3748774B2 (ja) | キャッシュコヒーレンス共用ディスクコンピュータシステムにおけるi/o転送 | |
US20110320738A1 (en) | Maintaining Cache Coherence In A Multi-Node, Symmetric Multiprocessing Computer | |
CN108990422A (zh) | 一种锁分配的方法、装置和计算设备 | |
CN111837102B (zh) | 使用轨道锁和跨步组锁来管理高速缓存操作 | |
US20160350352A1 (en) | Maintaining cross-node coherence of an in-memory database object in a multi-node database cluster | |
CN107341114B (zh) | 一种目录管理的方法、节点控制器和系统 | |
US11210263B1 (en) | Using persistent memory technology as a host-side storage tier for clustered/distributed file systems, managed by cluster file system | |
US11036635B2 (en) | Selecting resources to make available in local queues for processors to use | |
WO2014022402A1 (en) | Coherence management using a coherent domain table | |
JP2005519391A (ja) | 共有ベクトルの増加を伴わないdsmマルチプロセッサシステムにおけるキャッシュコヒーレンスのための方法およびシステム | |
CN115167786A (zh) | 一种数据存储方法、装置、系统、设备和介质 | |
US10452543B1 (en) | Using persistent memory technology as a host-side storage tier for clustered/distributed file systems, managed by storage appliance | |
CN114281765A (zh) | 分布式文件系统中的元数据处理方法及设备 | |
US6321304B1 (en) | System and method for deleting read-only head entries in multi-processor computer systems supporting cache coherence with mixed protocols | |
US8938588B2 (en) | Ensuring forward progress of token-required cache operations in a shared cache | |
CN116263746B (zh) | 处理实体的存储器分区 | |
US10452544B1 (en) | Using persistent memory technology as a host-side storage tier for clustered/distributed file systems, managed by host-side tier | |
CN116821058A (zh) | 元数据访问方法、装置、设备及存储介质 | |
JPH0644136A (ja) | メモリ制御装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |