CN116860465A - 实现同步锁的方法及相关设备 - Google Patents
实现同步锁的方法及相关设备 Download PDFInfo
- Publication number
- CN116860465A CN116860465A CN202210311599.5A CN202210311599A CN116860465A CN 116860465 A CN116860465 A CN 116860465A CN 202210311599 A CN202210311599 A CN 202210311599A CN 116860465 A CN116860465 A CN 116860465A
- Authority
- CN
- China
- Prior art keywords
- lock
- thread
- queue
- hardware
- resource
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 68
- 230000001360 synchronised effect Effects 0.000 title claims abstract description 34
- 238000012545 processing Methods 0.000 claims abstract description 31
- 230000015654 memory Effects 0.000 claims description 51
- 238000004891 communication Methods 0.000 claims description 21
- 238000013475 authorization Methods 0.000 claims description 20
- 230000002618 waking effect Effects 0.000 claims description 15
- 230000008569 process Effects 0.000 description 29
- 238000010586 diagram Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 6
- 230000007246 mechanism Effects 0.000 description 6
- 230000005059 dormancy Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 238000013468 resource allocation Methods 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000007958 sleep Effects 0.000 description 1
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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
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
本申请实施例提供一种同步锁的方法及相关设备,该方法可以包括:在第一线程释放锁时,对锁变量存储队列进行操作;其中,锁变量存储队列位于硬件层;基于操作后的锁变量存储队列中存储的消息,通过硬件层实现同步锁;其中,同步锁用于在第一线程和第二线程访问第一资源时,保持第一资源的一致性;第二线程为等待获取锁的线程,锁变量存储队列与第一线程和第二线程具有对应关系。采用本申请实施例,能够提高锁冲突的处理效率,减小系统开销。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种实现同步锁的方法及相关设备。
背景技术
资源共享中的同步问题是多线程中的一个难点,Linux下提供了多种方式来处理线程同步,常用的方式包括以下一种或多种:互斥锁(同步锁)、条件变量和信号量。
而基于锁的同步机制是多线程并行应用中同步操作的主要实现机制,大量的软件代码采用的是这种方式。锁可以解决线程的安全问题,同时也带来了性能问题。比如说:多线程并行应用在高并发的场景下对锁变量的冲突访问可以带来大量的系统开销,影响处理效率。
发明内容
本申请实施例提供了一种实现同步锁的方法及相关设备,能够提高锁冲突的处理效率,减小系统开销。
第一方面,本申请实施例提供了一种实现同步锁的方法,该方法可以包括:
在第一线程释放锁时,对锁变量存储队列进行操作;其中,所述锁变量存储队列位于硬件层;基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保持所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述锁变量存储队列与所述第一线程和所述第二线程具有对应关系。
上述方法可应用于节点设备,由节点设备或节点设备内部的部件(例如芯片或集成电路)来执行。或者,上述方法可以应用于非统一内存访问NUMA系统,例如由NUMA系统中的节点来执行。
本申请实施例中,在存在锁竞争的情况下,也即多个线程(比如说第一线程和第二线程)访问同一资源时,为了保证资源的一致性,可以基于操作后的锁变量存储队列中存储的消息,通过硬件层实现同步锁。由于锁变量存储队列位于硬件层,在实现同步锁时,不需要系统的调用,直接通过硬件来实现。相比于现有技术的软件实现,本申请实施例中的硬件实现可以提高处理速率,减小系统开销。
在一种可能的实施方式中,所述锁变量存储队列包含第一硬件队列,所述在第一线程释放锁时,对锁变量存储队列进行操作,包括:在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
在本申请实施例中,第一硬件队列为硬件层中的存储队列,能够快速转发队列中存储的消息,不需要等待系统做中断处理,减小时间延迟。
在一种可能的实施方式中,所述基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁,包括:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
在本申请实施例中,第一硬件队列用于锁授权,在监测到锁授权消息发生变化时,说明此时锁被释放出来了,可以由硬件去唤醒在等待锁的线程(也即第二线程)。相比于现有技术中的软件唤醒来说,硬件唤醒的精度更高更快,可以更快地唤醒线程。并且,由硬件来唤醒,还可以避免使用系统调用接口,避免陷入内核的开销,从而可以减少调度器的开销。
在一种可能的实施方式中,锁变量存储队列包含第二硬件队列,所述在第一线程释放锁时,对锁变量存储队列进行操作,包括:在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
在本申请实施例中,第一硬件队列为硬件层中的存储队列,能够快速转发队列中存储的消息,不需要等待系统做中断处理,减小时间延迟。
在一种可能的实施方式中,所述基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁,包括:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
在本申请实施例中,第二硬件队列用于锁等待,在读取到锁等待消息时,说明此时有等待锁的线程,可以由硬件去唤醒在等待锁的线程(也即第二线程)。相比于现有技术中的软件唤醒来说,硬件唤醒的精度更高更快,可以更快地唤醒线程。并且,由硬件来唤醒,还可以避免使用系统调用接口,避免陷入内核的开销,从而可以减少调度器的开销。
在一种可能的实施方式中,所述在第一线程释放锁时,对锁变量存储队列进行操作之前,还包括:在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
第二方面,本申请实施例提供的一种非统一内存访问NUMA系统,NUMA系统包括多个节点,每个节点上分别运行有一个或多个线程,每个节点具有对应的锁变量存储队列;
在第一线程释放锁时,第一节点用于对第一锁变量存储队列进行操作;其中,所述第一锁变量存储队列位于所述第一节点的硬件层;所述第一线程为与所述第一节点具有对应关系的线程,所述第一节点为所述多个节点中的任意一个;
基于操作后的所述第一锁变量存储队列中存储的消息,所述第一节点用于通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保证所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述第二线程为与所述第一节点具有对应关系的线程。
在本申请实施例中,对于NUMA架构的系统,多线程模型在分配锁时,可以根据线程所在的节点,选择分布在对应节点上的锁变量存储队列。这样,可以避免在使用过程中远程访问锁,减少跨节点、跨socket(套接字)通信所带来的访问开销。
在一种可能的实施方式中,所述第一锁变量存储队列包含第一硬件队列,所述第一节点具体用于:在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
在一种可能的实施方式中,所述第一节点具体用于:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
在一种可能的实施方式中,所述第一锁变量存储队列包含第二硬件队列,所述第一节点具体用于:在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
在一种可能的实施方式中,所述第一节点具体用于:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
在一种可能的实施方式中,所述第一节点还用于:
在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
第三方面,本申请实施例提供了一种节点设备,包括:
通信单元,用于在第一线程释放锁时,对锁变量存储队列进行操作;其中,所述锁变量存储队列位于硬件层;
处理单元,用于操作后基于所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保证所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述锁变量存储队列与所述第一线程和所述第二线程具有对应关系。
在一种可能的实施方式中,所述锁变量存储队列包含第一硬件队列所述通信单元具体用于:在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
在一种可能的实施方式中,所述处理单元具体用于:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
在一种可能的实施方式中,所述锁变量存储队列包含第二硬件队列所述通信单元具体用于:在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
在一种可能的实施方式中,所述处理单元具体用于:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
在一种可能的实施方式中,所述处理单元还用于:
在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;
在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
第四方面,本申请实施例提供一种节点设备,该节点设备包括处理器和存储器;存储器中存储有至少一条计算机指令;该指令由该处理器加载并执行,以实现前述第一方面任一项中虚拟总线所执行的方法操作。
第五方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在至少一个处理器上运行时,实现前述第一方面任一项所描述的方法。
第六方面,本申请提供了一种计算机程序产品,计算机程序产品包括计算机指令,当所述指令在至少一个处理器上运行时,实现前述第一方面任一项所描述的方法。
可选地,该计算机程序产品可以为一个软件安装包,在需要使用前述方法的情况下,可以下载该软件安装包并在计算设备上执行该软件安装包所形成的计算机指令。
本申请第二至第六方面所提供的技术方案,其有益效果可以参考第一方面的技术方案的有益效果,此处不再赘述。
附图说明
以下对本申请实施例用到的附图进行介绍。
图1是本申请实施例提供的一种基于软件实现同步锁的示意图;
图2是本申请实施例提供的一种基于软硬件实现同步锁的示意图;
图3是本申请实施例提供的一种非统一内存访问NUMA系统的架构图;
图4是本申请实施例提供的一种实现同步锁的方法流程示意图;
图5是本申请实施例提供的一种节点设备50的结构示意图;
图6是本申请实施例提供的一种节点设备60的结构示意图。
具体实施方式
下面结合本申请实施例中的附图对本申请实施例进行描述。
为了便于理解,以下示例地给出了部分与本申请实施例相关概念的说明以供参考。如下所述:
1.同步锁
同步锁是为了保证每个线程都可以正常执行原子不可更改操作,当多个线程访问同一资源时,为了保证数据的一致性,可以使用同步锁来保证。也即,同步锁可以保证在同一时刻最多只有一个线程执行某段代码或者访问某个对象变量,以达到保证并发安全的效果。
2.快速用户空间互斥体(fast userspace mutex,futex)
futex是一种用户态和内核态混合的同步机制,使用futex同步机制,如果用于进程间同步,需要先调用mmap创建一块共享内存,futex变量(即锁变量)位于共享区。同时对futex变量的操作是原子的,当进程试图进入临界区或者退出临界区的时候,首先检查共享内存中的futex变量,如果没有其他的进程也申请使用临界区,则只修改futex变量而不再执行系统调用。如果同时有其他进程在申请使用临界区,需要通过系统调用去执行等待或唤醒操作。
3.非统一内存访问(non-uniform memory access,NUMA)
NUMA是一种为多处理器的计算机设计的内存架构,内存访问时间取决于内存相对于处理器的位置。在NUMA架构下,处理器访问与该处理器位于相同内存的速度比非本地内存(即内存位于另一个节点,或者是多个处理器之间共享的内存)快一些。
NUMA的特点是:被共享的内存在物理上是分布式的,所有这些内存的集合就是全局地址空间。所以,处理器访问这些内存的时间是不一样的,显然访问本地内存的速度要比访问全局共享内存或远程访问外地内存要快一些。
上述对概率的示例性说明可以应用在下文的实施例中。
请参见图1,图1是本申请实施例提供的一种基于软件实现同步锁的示意图。从图1可以看出,在计算机领域中,所谓的锁本质上是一块内存空间。当这个内存空间被赋值为“1”的时候表示加锁,被赋值为“0”的时候表示解锁。
当多个线程访问同一内存空间时,也即多个线程抢一个锁时,意味着多个线程需要抢着将该内存空间赋值为“1”,以此来获得对临界区的操作权。比如说,A线程获取到锁之后,会执行对临界区的操作,并在其临界区的执行完毕之后释放锁。然后,其他线程(比如说B线程或者C线程)就可以获取锁,并在获取到锁之后执行对临界区的操作。但是,由于最多只能有一个线程获取到锁,所以临界区在某一个时刻最多只会有一个线程执行。因此,可以通过加锁的方式保护临界区不会被并行执行。
一般使用futex机制来实现同步锁。也即,电子设备基于futex机制可以为每个锁维护一个软件队列,通过软件队列可以保存当前阻塞在这把锁上的线程,保存的数据结构可以是哈希(hash)结构。当线程获取到锁时,可以执行对临界区的操作;当线程抢锁失败,没有获取到锁时,则进入休眠状态,等待其他线程释放锁后通过系统调用去执行唤醒操作。
进一步地,图1所示基于软件实现同步锁的伪代码如下所示:
pthread_mutex_init:
pthread_mutex_t.value=1;
pthread_mutex_lock:
atomic_dec(pthread_mutex_t.value):
if(pthread_mutex_t.value<0)
futex(WAIT)
else
success
pthread_mutex_unlock:
atomic_dec(pthread_mutex_t.value):
if(pthread_mutex_t.value!=0)
futex(WAKEUP)
else
success
从上述伪代码中可以看出,当线程需要抢锁或者要进入临界区的时候,电子设备可以对futex变量(即锁变量)执行“down”操作,即原子性的给futex变量减1。如果futex变量由1变成0,说明没有竞争发生,不会带来锁冲突,线程可照常执行。如果得到的futex变量是个负数,说明有竞争发生,会带来锁冲突则需要执行futex_wait操作来休眠当前线程。
当线程需要释放锁或者要离开临界区时,电子设备可以对futex变量(即锁变量)执行“up”操作,即原子性的给futex变量加1。如果futex变量由0变成1,说明没有竞争发生,不会带来锁冲突线程可以照常执行。如果加之前futex变量是负数,说明有竞争发生,会带来锁冲突,则需要执行futex_wakeup操作来唤醒一个或多个等待的线程。
可以看出,当没有竞争发生时,操作是在用户态下进行的,不需要系统调用。当发生竞争的时候,需要进入到内核去完成相应的处理(比如说等待wait操作或者唤醒wake up操作)。因此,陷入内核态存在以下两种场景:
1、某个线程申请不到锁(锁已经被占用);
2、某个线程在释放锁时,有其他线程在等待这把锁。
综上所述,图1所示的基于软件同步锁在实现过程中,锁冲突可能会带来线程频繁的休眠或者唤醒,而休眠或者唤醒的时间过长时,可能会带来较多的上下文切换的开销、调度器的调度开销,等等。在多核系统(比如说基于NUMA价格的系统)上,还存在跨处理器访问调度的开销。
因为线程的休眠或者唤醒需要系统进入到内核去完成相应的处理,所以在实现同步锁的过程中,真正消耗时间的不是上锁的次数,而是锁冲突的次数。当提高锁冲突的处理效率时,可以减少锁冲突所带来的开销,从而提高性能。
需要说明的是,在本申请实施例中,临界区指的是一个访问共同资源的程序片段,这些共用资源又无法同时被多个程序访问。当有程序执行临界区的操作时,其他程序必须等待,以确保这些共同资源是被互斥获得试用的。
需要说明的是,线程是程序执行中的一个单一的顺序控制流程,是程序执行流的最小单一,是处理器调度和分配的基本单元。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也即所在进程的内存空间)。
需要说明的是,在本申请实施例中所说的“程序”可以理解为在处理器核中运行的进程或者线程,本申请实施例不做具体限定。
有鉴于此,本申请实施例提供一种实现同步锁的方法、系统及相关设备,能够提高处理锁冲突的效率,减少因锁冲突而带来的开销,提高系统性能。
请参见图2,图2是本申请实施例提供的一种基于软硬件实现同步锁的示意图。可以理解的是,进程是一个具有一定独立能力的程序在一个数据集上的一次动态执行的过程,是操作系统201进行资源分配和调度的独立单元,是应用程序运行的载体。在操作系统201中可以同时运行多个进程。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。而线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
从图2可以看出,操作系统201中的第一进程可以包含第一线程和第二线程。可以理解的是,第一进程是运行在操作系统201中的任意一个进程,第一进程可以包含多个线程,而第一线程和第二线程是多个线程中的任意两个。
硬件层202可以包含一个或多个锁变量存储队列和硬件单元,每个锁变量存储队列包含第一硬件队列和第二硬件队列。第一硬件队列用于锁授权,存储锁授权消息;第二硬件队列用于锁等待,存储锁等待消息。操作系统201中的进程与锁变量存储队列具有一一对应关系,也即第一进程与一个或多个锁变量存储队列中的任意一个锁变量存储队列具有一一对应关系,所以第一线程和第二线程也具有一一对应的关系。
其中,硬件单元具体可以是芯片、电路板、集成电路,等等。
每个锁变量存储队列的深度可以动态设置,电子设备可以根据系统并发量的大小来设置锁变量存储队列的存储大小。
进一步地,图2所示的基于软硬件实现同步锁的伪代码如下所示:
hardware_mutex_init:
lock_queue_id写入1;
hardware_mutex_lock:
if(读lock_queue_id):
success
else
wait_queue_id写入threadid
futex(WAIT)
hardware_mutex_unlock:
if(读wait_queue_id):
硬件(WAKEUP)
lock_queue_id写入1
可以看出,在操作系统201初始化时,电子设备可以向第一硬件队列中写入锁授权消息。电子设备可以配置进程与锁变量存储队列的对应关系,当该进程中的第二线程尝试有锁或者需要进入临界区时,电子设备可以先去读与第二线程具有对应关系的锁变量存储队列中的第一硬件队列。若从第一硬件队列中读到锁授权消息,表明此时没有其他的线程在对临界区进行操作。说明第二线程可以抢到锁,第二线程可以对临界区进行操作。若电子设备从与第二线程具有对应关系的锁变量存储队列中的第一硬件队列中没有读到锁授权消息,表明此时有其他的线程在占用临界区,说明第二线程没有抢到锁,则电子设备需要挂起第二线程,并向第二硬件队列中写入锁等待消息。
若上述进程中的第一线程先于第二线程抢到了锁,在第一线程结束对临界区的处理后,需要释放锁时,电子设备可以读第二硬件队列。若电子设备从第二硬件队列中读到锁等待消息,说明存在正在等待锁的线程(比如说第二线程)。电子设备可以基于锁等待消息,通过硬件单元来唤醒第二线程,从而为第二线程分配上述临界区的资源,以使得第二线程可以对临界区进行操作。然后,电子设备可以向第一硬件队列写入锁授权消息。
若从第二硬件队列中没有读到锁等待消息,说明不存在正在等待锁的线程,电子设备没有需要唤醒的线程。
可以看出,相比于现有技术中的软件唤醒来说,硬件唤醒的精度更高更快,因为软件有时间达不到纳秒(ns)级别的精度,使用硬件可以更快地唤醒线程。通过硬件来唤醒线程,可以避免因使用系统调用接口而陷入内核的开销,减少了调度器的开销。
接下来,介绍本申请提供的一种应用场景。请参见图3,图3是本申请实施例提供的一种非统一内存访问NUMA系统300的架构图。其中,非统一内存访问NUMA系统300可以为多插槽系统。从图3可以看出,NUMA系统300包括插槽(socket)301a和插槽301b,可以用于安装CPU的插座。插槽301a和插槽301b在本申请中可被统称为插槽。插槽可以通过互联(interconnect)304彼此通信地耦合。示例性的,每个插槽经由点对点快速路径互联(quickpath interconnect,QPI)链路来连接至其他插槽中的每一个。需要说明的是,QPI是一种互联架构,本申请实施例中各个插槽之间的互联还可以通过其他互联架构实现,诸如其他点对点架构、环架构以及总线架构,这里并不限定。NUMA系统300中所描述的插槽的数量仅为一种示例,并且本领域技术人员将立即,可以存在不同数量的插槽。例如,NUMA系统300可包括诸如六个、四个或更少数量的插槽,又或者NUMA系统300可以包括诸如十六个、三十二个或更多数量的插槽。
插槽可以包含多个节点(node),每个节点有自己的中央处理器(centralprocessing unit,CPU)和内存,节点与节点之间通过互联304进行连接和通信。如图3所示,插槽301a包括节点302a和节点302b,插槽301b包括节点303a和节点303b,每个节点可以包括一个内存和六个CPU。需要说明的是,NUMA系统300中所描绘的节点和CPU的数量仅为一种实例,本领域技术可以理解,每个插槽可以包括其他数量的节点,每个节点可以包括其他数量的CPU。
共享资源是所有线程都需要访问的内存资源,其存储于某一节点的共享内存中,而执行共享资源的代码段可以称作临界区。当NUMA系统300中的不同线程在访问共享资源(执行该共享资源的临界区)时,需要保证在同一时刻只能有一个线程对共享资源进行操作,即同一时刻,同一个共享资源的临界区只能被一个线程执行。具体的,可以使用锁对临界区进行保护,多个线程在同一个共享资源上执行临界区之前需要申请锁,只有持有锁的线程才能执行临界区,且在执行完临界区之后释放锁。
从图3可以看出,每个节点上分别运行中一个或多个线程,每个节点可以包括至少一个锁变量存储队列。示例性的,每个节点的锁变量存储队列可以位于静态随机存取存储器(static random access memory,SRAM)中,锁变量存储队列的访问速度和高速缓存cache的访问速度相近,每个队列可以配置包括的元素的数量和宽度。同时,每个节点的CPU可以包括为锁变量存储队列提供服务的硬件加速器。
在本申请实施例中,NUMA系统在启动并初始化时,可以进行线程与锁变量存储队列的绑定。具体的,针对彼此之间需要竞争同一资源的线程,可以建立线程与锁变量存储队列的绑定关系。在本申请实施例中,可以将需要竞争同一资源的线程与该线程所位于的节点中的任意一个硬锁变量存储队列进行绑定。
这样,在第一线程305a释放锁(彼此之间需要原子性执行的临界区)时,第一节点(NUMA系统300所包括的多个节点中的任意一个节点,比如说图3中的节点302a)对锁变量存储队列3021a进行操作,示例性的,对锁变量存储队列3021a进行的操作可以是向锁变量存储队列3021a中的第一硬件队列写入锁授权消息。因此,在硬件单元3022a监测到锁变量存储队列3021a中的第一硬件队列中被写入锁授权信息时,说明锁被释放出来了,硬件单元3022a可以去唤醒等待该锁的第二线程,然后为第二线程分配上述临界区的资源。又一示例性的,对锁变量存储队列3021a进行的操作还可以是从锁变量存储队列3021a中的第二硬件队列获取锁等待消息。因此,第一节点302a在从第二硬件队列中读取到锁等待消息的情况下,说明此时有在等待该锁的相乘,硬件单元3022a可以去唤醒等待该锁的第二线程,然后为第二线程分配上述临界区的资源。可以理解的是,上述锁等待消息可以是第二线程在没有抢到锁的情况下,向第二硬件队列中写入的。
可以看出,多个线程在争抢锁时,可以基于该线程所在的NUMA节点中的锁硬件队列中存储的消息,通过硬件来实现同步锁。由于该硬件队列位于线程所在的节点的硬件层中,可以有效避免在使用锁的过程中,远程访问锁变量,减少跨节点,跨socket(套接字)的访问开销。
请参见图4,图4是本申请实施例提供的一种实现同步锁的方法流程示意图,该方法包括但不限于如下步骤:
步骤S401:在第一线程释放锁时,对锁变量存储队列进行操作。
具体地,线程是程序执行中的一个单一的顺序控制流程,是程序执行流的最小单元。进程是一个具有一定独立能力的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的独立单元。而一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。所以,本申请实施例提及的第一线程可以是一个进程所包含的一个或多个线程中的任意一个。
当多个线程访问同一数据资源时,为了保证数据的一致性,可以使用锁来保证。第一线程获取到锁之后,会执行自身临界区的操作,并在其临界区的执行完毕之后释放锁。在第一线程释放锁时,电子设备可以对锁变量存储队列进行操作。其中,锁变量存储队列为硬件队列,位于电子设备的硬件层。
在一种可能的实施方式中,锁变量存储队列包含第一硬件队列和第二硬件队列。
其中,第一硬件队列用于锁授权,也即,第一硬件队列用于存储锁授权消息。
因此,在一种可能的实现方式中,在第一线程释放锁时,电子设备可以向第一硬件队列写入锁授权消息。当第一硬件队列中存储有锁授权消息时,说明锁没有被占用。
第二硬件队列用于锁等待,也即,当某一线程获取不到锁授权消息时,可以向第二硬件队列写入锁等待消息。
因此,在另一种可能的实现方式中,在第一线程释放锁时,电子设备可以从第二硬件队列中获取锁等待消息。当第二硬件队列中存储有锁等待消息时,说明有线程在等着锁。
步骤S402:基于操作后的锁变量存储队列中存储的消息,通过硬件层实现同步锁。
在一种可能的实施方式中,对锁变量存储队列的操作可以包含:在第一线程释放锁时,电子设备向锁变量存储队列中的第一硬件队列写入锁授权消息。
因此,电子设备监测到第一硬件队列发生变化时,也即监测到第一硬件队列中被写入锁授权消息时,电子设备可以通过硬件层去唤醒等待该锁的第二线程,然后为第二线程分配第一资源。可以理解的是,第一资源为第一线程是释放锁之前被第一线程所占用的临界区的资源。
在另一种可能的实施方式中,对锁变量存储队列的操作还可以包括:在第一线程释放锁时,电子设备从第二硬件队列中获取锁等待消息。
因此,在电子设备从第二硬件队列中读取到锁等待消息的情况下,电子设备可以通过硬件层唤醒第二线程,从而可以为第二线程分配第一资源。可以理解的是,第一资源为第一线程是释放锁之前被第一线程所占用的临界区的资源。
可以理解的是,锁等待消息为第二线程在没有获取到锁的情况下,电子设备向第二硬件队列中写入的,因此,在第二线程获取锁时,电子设备可以先从锁变量存储队列中的第一硬件队列中读取锁授权消息,如果读成功,则表示第二线程抢到锁。如果没有读到锁授权消息,说明读失败,则需要挂起第二线程,然后向锁变量存储队列中的第二硬件队列写入锁等待消息。
可以看出,相比于现有技术中的软件唤醒来说,硬件唤醒的精度更高更快,因为软件有时间达不到纳秒(ns)级别的精度,使用硬件可以更快地唤醒线程。通过硬件来唤醒线程,可以避免因使用系统调用接口而陷入内核的开销,减少了调度器的开销。
上述详细阐述了本申请实施例的方法,下面提供本申请实施例的装置。
请参见图5,图5是本申请实施例提供的一种节点设备的结构示意图,该节点设备50可以是服务器或用户设备,也可以是服务器或用户设备中的一个器件,例如芯片、集成电路等。该节点设备50用于实现前述的实现同步锁的方法,例如图4所示实施例中的实现同步锁的方法。
一种可能的实施方式中,节点设备50可以包括通信单元501和处理单元502。
通信单元501,用于在第一线程释放锁时,对锁变量存储队列进行操作;其中,锁变量存储队列位于硬件层;
处理单元502,用于操作后基于锁变量存储队列中存储的消息,通过硬件层实现同步锁;其中,同步锁用于在第一线程和第二线程访问第一资源时,保证第一资源的一致性;第二线程为等待获取锁的线程,锁变量存储队列与第一线程和第二线程具有对应关系。
在一种可能的实施方式中,锁变量存储队列包含第一硬件队列,通信单元501具体用于:在第一线程释放锁时,向第一硬件队列写入锁授权消息。
在一种可能的实施方式中,处理单元502具体用于:监测到第一硬件队列中被写入锁授权消息时,通过硬件层唤醒第二线程;为第二线程分配第一资源;其中,第一资源为第一线程在释放锁之前被第一线程所占用的。
在一种可能的实施方式中,锁变量存储队列包含第二硬件队列,通信单元501具体用于:在第一线程释放锁时,从第二硬件队列获取锁等待消息;其中,锁等待消息为在第二线程没有获取到锁的情况下,向第二硬件队列中写入的。
在一种可能的实施方式中,处理单元502具体用于:在从第二硬件队列中读取到锁等待消息的情况下,通过硬件层唤醒第二线程;为第二线程分配第一资源;其中,第一资源为第一线程在释放锁之前所占用的。
在一种可能的实施方式中,处理单元502还用于:在第二线程获取锁时,从锁变量存储队列中读消息;在没有读到锁授权消息的情况下,挂起第二线程,向锁变量存储队列写入锁等待消息。
应理解,相关描述还可以参见图4所示实施例中的描述,此处不再赘述。
请参见图6,图6是本申请实施例提供的一种节点设备60的结构示意图,该节点设备60可以为独立设备(例如服务器、或用户设备等等中的一个或者多个),也可以为独立设备内部的部件(例如芯片或者硬件模块等)。该节点设备60可以包括至少一个处理器601。可选的还可以包括至少一个存储器603。进一步可选的,节点设备60还可以包括通信接口602。更进一步可选的,还可以包含总线604,其中,处理器601、通信接口602和存储器603通过总线604相连。
其中,处理器601是进行算术运算和/或逻辑运算的模块,具体可以是中央处理器(central processing unit,CPU)、图片处理器(graphics processing unit,GPU)、微处理器(microprocessor unit,MPU)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA)、复杂可编程逻辑器件(Complex programmable logic device,CPLD)、协处理器(协助中央处理器完成相应处理和应用)、微控制单元(Microcontroller Unit,MCU)等处理模块中的一种或者多种的组合。
通信接口602可以用于为至少一个处理器提供信息输入或者输出。和/或,通信接口602可以用于接收外部发送的数据和/或向外部发送数据,可以为包括诸如以太网电缆等的有线链路接口,也可以是无线链路(Wi-Fi、蓝牙、通用无线传输、车载短距通信技术以及其他短距无线通信技术等)接口。可选的,通信接口602还可以包括与接口耦合的发射器(如射频发射器、天线等),或者接收器等。
存储器603用于提供存储空间,存储空间中可以存储操作系统和计算机程序等数据。存储器603可以是随机存储记忆体(random access memory,RAM)、只读存储器(read-only memory,ROM)、可擦除可编程只读存储器(erasable programmable read onlymemory,EPROM)、或便携式只读存储器(compact disc read-only memory,CD-ROM)等等中的一种或者多种的组合。
该节点设备60中的至少一个处理器601用于执行前述的实现同步锁的方法,例如图4所示实施例所描述的实现同步锁的方法。
可选的,处理器601,可以是专门用于执行这些方法的处理器(便于区别称为专用处理器),也可以是通过调用计算机程序来执行这些方法的处理器,例如通用处理器。可选的,至少一个处理器还可以既包括专用处理器也包括通用处理器。可选的,在节点设备包括至少一个处理器601的情况下,上述计算机程序可以存在存储器603中。
在一种可能的实施方式中,该节点设备60中的至少一个处理器601用于执行调用计算机指令,以执行以下操作:
在第一线程释放锁时,通过通信接口602对锁变量存储队列进行操作;其中,锁变量存储队列位于硬件层;
基于操作后的锁变量存储队列中存储的消息,通过硬件层实现同步锁;其中,同步锁用于在第一线程和第二线程访问第一资源时,保持第一资源的一致性;第二线程为等待获取锁的线程,锁变量存储队列与第一线程和第二线程具有对应关系。
在一种可能的实施方式中,锁变量存储队列包含第一硬件队列,处理器601具体用于:在第一线程释放锁时,通过通信接口602向第一硬件队列写入锁授权消息。
在一种可能的实施方式中,处理器601具体用于:监测到第一硬件队列中被写入锁授权消息时,通过硬件层唤醒第二线程;为第二线程分配第一资源;其中,第一资源为第一线程在释放锁之前被第一线程所占用的。
在一种可能的实施方式中,锁变量存储队列包含第二硬件队列,处理器601具体用于:在第一线程释放锁时,通过通信接口602从第二硬件队列获取锁等待消息;其中,锁等待消息为在第二线程没有获取到锁的情况下,向第二硬件队列中写入的。
在一种可能的实施方式中,处理器601具体用于:在从第二硬件队列中读取到锁等待消息的情况下,通过硬件层唤醒第二线程;为第二线程分配第一资源;其中,第一资源为第一线程在释放锁之前所占用的。
在一种可能的实施方式中,处理器601还用于:在第二线程获取锁时,从锁变量存储队列中读消息;在没有读到锁授权消息的情况下,挂起第二线程,向锁变量存储队列写入锁等待消息。
应理解,相关描述还可以参见图4所示实施例中的描述,此处不再赘述。
本申请还提供了一种算机可读存储介质,计算机可读存储介质中存储有指令,当指令在至少一个处理器上运行时,实现前述的实现同步锁的方法,例如图4所示的实现同步锁的方法。
本申请还提供了一种计算机程序产品,该计算机程序产品包括计算机指令,在被计算设备执行时,实现前述的实现同步锁的方法,例如图4所示的实现同步锁的方法。
本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其他实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
本申请中实施例提到的“至少一个”是指一个或者多个,“多个”是指两个或两个以上。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a、b、或c中的至少一项(个),可以表示:a、b、c、(a和b)、(a和c)、(b和c)、或(a和b和c),其中a、b、c可以是单个,也可以是多个。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A、同时存在A和B、单独存在B这三种情况,其中A、B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。
以及,除非有相反的说明,本申请实施例使用“第一”、“第二”等序数词是用于对多个对象进行区分,不用于限定多个对象的顺序、时序、优先级或者重要程度。例如,第一用户设备和第二用户设备,只是为了便于描述,而并不是表示这第一用户设备和第二用户设备的结构、重要程度等的不同,在某些实施例中,第一用户设备和第二用户设备还可以是同样的设备。
上述实施例中所用,根据上下文,术语“当……时”可以被解释为意思是“如果……”或“在……后”或“响应于确定……”或“响应于检测到……”。以上仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的构思和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
Claims (20)
1.一种实现同步锁的方法,其特征在于,包括:
在第一线程释放锁时,对锁变量存储队列进行操作;其中,所述锁变量存储队列位于硬件层;
基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保持所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述锁变量存储队列与所述第一线程和所述第二线程具有对应关系。
2.根据权利要求1所述的方法,其特征在于,所述锁变量存储队列包含第一硬件队列,所述在第一线程释放锁时,对锁变量存储队列进行操作,包括:
在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
3.根据权利要求2所述的方法,其特征在于,所述基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁,包括:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
4.根据权利要求1所述的方法,其特征在于,所述锁变量存储队列包含第二硬件队列,所述在第一线程释放锁时,对锁变量存储队列进行操作,包括:
在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
5.根据权利要求4所述的方法,其特征在于,所述基于操作后的所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁,包括:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
6.根据权利要求4或5所述的方法,其特征在于,所述在第一线程释放锁时,对锁变量存储队列进行操作之前,还包括:
在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;
在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
7.一种非统一内存访问NUMA系统,其特征在于,所述NUMA系统包括多个节点,每个节点上分别运行有一个或多个线程,每个节点具有对应的锁变量存储队列;
在第一线程释放锁时,第一节点用于对第一锁变量存储队列进行操作;其中,所述第一锁变量存储队列位于所述第一节点的硬件层;所述第一线程为与所述第一节点具有对应关系的线程,所述第一节点为所述多个节点中的任意一个;
基于操作后的所述第一锁变量存储队列中存储的消息,所述第一节点用于通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保证所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述第二线程为与所述第一节点具有对应关系的线程。
8.根据权利要求7所述的系统,其特征在于,所述第一锁变量存储队列包含第一硬件队列,所述第一节点具体用于:
在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
9.根据权利要求8所述的系统,其特征在于,所述第一节点具体用于:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
10.根据权利要求7所述的系统,其特征在于,所述第一锁变量存储队列包含第二硬件队列,所述第一节点具体用于:
在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
11.根据权利要求10所述的系统,其特征在于,所述第一节点具体用于:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
12.根据权利要求10或11所述的系统,其特征在于,所述第一节点还用于:
在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;
在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
13.一种节点设备,其特征在于,包括:
通信单元,用于在第一线程释放锁时,对锁变量存储队列进行操作;其中,所述锁变量存储队列位于硬件层;
处理单元,用于操作后基于所述锁变量存储队列中存储的消息,通过所述硬件层实现同步锁;其中,所述同步锁用于在所述第一线程和第二线程访问第一资源时,保证所述第一资源的一致性;所述第二线程为等待获取所述锁的线程,所述锁变量存储队列与所述第一线程和所述第二线程具有对应关系。
14.根据权利要求13所述的设备,其特征在于,所述锁变量存储队列包含第一硬件队列,所述通信单元具体用于:
在第一线程释放锁时,向所述第一硬件队列写入锁授权消息。
15.根据权利要求14所述的设备,其特征在于,所述处理单元具体用于:
监测到所述第一硬件队列中被写入所述锁授权消息时,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前被所述第一线程所占用的。
16.根据权利要求13所述的设备,其特征在于,所述锁变量存储队列包含第二硬件队列,所述通信单元具体用于:
在第一线程释放锁时,从所述第二硬件队列获取锁等待消息;其中,所述锁等待消息为在所述第二线程没有获取到所述锁的情况下,向所述第二硬件队列中写入的。
17.根据权利要求16所述的设备,其特征在于,所述处理单元具体用于:
在从所述第二硬件队列中读取到所述锁等待消息的情况下,通过所述硬件层唤醒所述第二线程;
为所述第二线程分配所述第一资源;其中,所述第一资源为所述第一线程在释放所述锁之前所占用的。
18.根据权利要求16或17所述的设备,其特征在于,所述处理单元还用于:
在所述第二线程获取所述锁时,从所述锁变量存储队列中读消息;
在没有读到锁授权消息的情况下,挂起所述第二线程,向所述锁变量存储队列写入锁等待消息。
19.一种节点设备,其特征在于,所述节点设备包括处理器和存储器;所述处理器用于执行存储器存储的计算机指令,使得所述节点设备实现如权利要求1-6中任一项所述的方法。
20.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在至少一个处理器上运行时,实现如权利要求1-6中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210311599.5A CN116860465A (zh) | 2022-03-28 | 2022-03-28 | 实现同步锁的方法及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210311599.5A CN116860465A (zh) | 2022-03-28 | 2022-03-28 | 实现同步锁的方法及相关设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116860465A true CN116860465A (zh) | 2023-10-10 |
Family
ID=88229104
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210311599.5A Pending CN116860465A (zh) | 2022-03-28 | 2022-03-28 | 实现同步锁的方法及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116860465A (zh) |
-
2022
- 2022-03-28 CN CN202210311599.5A patent/CN116860465A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10241831B2 (en) | Dynamic co-scheduling of hardware contexts for parallel runtime systems on shared machines | |
CN105579961B (zh) | 数据处理系统及操作方法、用于数据处理系统的硬件单元 | |
Alhammad et al. | Schedulability analysis of global memory-predictable scheduling | |
US9063796B2 (en) | Method and apparatus for improving processing performance of a multi-core processor | |
US8572626B2 (en) | Symmetric multi-processor system | |
JP2005284749A (ja) | 並列処理コンピュータ | |
US8516483B2 (en) | Transparent support for operating system services for a sequestered sequencer | |
US10802875B2 (en) | Multithread framework for use in pre-boot environment of a system-on-chip | |
GB2453284A (en) | Mechanism for notifying a kernel of a thread entering a critical section. | |
JP2012104140A (ja) | 待機状態にあるプロセッサ実行リソースの共有 | |
US7103631B1 (en) | Symmetric multi-processor system | |
Molesky et al. | Predictable synchronization mechanisms for multiprocessor real-time systems | |
US11301304B2 (en) | Method and apparatus for managing kernel services in multi-core system | |
Takada et al. | A novel approach to multiprogrammed multiprocessor synchronization for real-time kernels | |
JP7346649B2 (ja) | 同期制御システムおよび同期制御方法 | |
Maier et al. | Asynchronous abstract machines: anti-noise system software for many-core processors | |
CN112306703A (zh) | 一种numa系统中的临界区执行方法及装置 | |
CN116860465A (zh) | 实现同步锁的方法及相关设备 | |
Rothberg | Interrupt handling in Linux | |
Bradatsch et al. | Comparison of service call implementations in an AUTOSAR multi-core os | |
Bordoloi | Scheduling with shared resources | |
Zuepke | Turning futexes inside-out: Efficient and deterministic user space synchronization primitives for real-time systems with IPCP | |
Verwielen | Performance of resource access protocols | |
Chen et al. | Embedded Partitioning Real-Time Operating System Based on Microkernel | |
Labarta et al. | Hybrid Parallel Programming with MPI/StarSs |
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 |