CN105138475A - 一种内存池及内存分配方法 - Google Patents

一种内存池及内存分配方法 Download PDF

Info

Publication number
CN105138475A
CN105138475A CN201510519075.5A CN201510519075A CN105138475A CN 105138475 A CN105138475 A CN 105138475A CN 201510519075 A CN201510519075 A CN 201510519075A CN 105138475 A CN105138475 A CN 105138475A
Authority
CN
China
Prior art keywords
queue
memory
cache
memory pool
pool
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
Application number
CN201510519075.5A
Other languages
English (en)
Other versions
CN105138475B (zh
Inventor
金健
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Neusoft Corp
Original Assignee
Neusoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Neusoft Corp filed Critical Neusoft Corp
Priority to CN201510519075.5A priority Critical patent/CN105138475B/zh
Publication of CN105138475A publication Critical patent/CN105138475A/zh
Application granted granted Critical
Publication of CN105138475B publication Critical patent/CN105138475B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明公开一种内存池,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列;当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。本发明提供的内存池能够符合访问局部性原理,即使在执行高吞吐量的网络数据转发时,也不会使系统频繁的访问大范围的内存,避免了系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出,很大程度上提高了CPU的Cache的命中率。

Description

一种内存池及内存分配方法
技术领域
本发明涉及数据处理领域,具体涉及一种内存池及内存分配方法。
背景技术
目前,传统的内存池中的内存对象是由一个队列进行分配和释放。内存池在初始化时,各个内存对象的指针都存入上述队列中,并在外部模块向内存池申请内存对象时,从该队列读出指针返给外部模块,以使外部模块利用该指针获取内存对象。当外部模块释放一个内存对象给内存池时,队列将该内存对象的指针入队。
由于内存对象的分配和释放是采用队列的先进先出原则,在执行高吞吐量的网络数据转发时,会进行大量的内存对象的分配和释放操作。如果内存池容量较大,则会使系统频繁的访问大范围的内存,最终不仅导致系统访问内存对象时,CPU的Cache失效,而且如果占用了大量CPU的Cache资源,也会将CPU的Cache中的有效数据换出,降低CPU的Cache的有效利用率。
发明内容
有鉴于此,本发明提供了一种内存池及内存分配方法。
本发明提供了一种内存池,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列;
当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。
优选地,当上一级队列对应的内存对象被分配完后,下一级队列用于将自身对应的内存对象补充到所述上一级队列。
优选地,所述内存池中的所述至少两级队列分别与CPU的各级Cache具有对应关系;
其中,除最后一级队列的其他各级队列的原始长度小于自身对应的Cache的长度。
优选地,当任一级队列释放内存对象后,使得当前队列长度超出原始长度时,将自身对应的若干内存对象回收至下一级队列。
优选地,当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
本发明还提供了一种内存分配方法,所述方法应用于内存池,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列,所述方法包括:
当外部模块向所述内存池申请内存对象时,所述第一级队列优先为所述外部模块分配内存对象。
优选地,所述方法还包括:
当上一级队列对应的内存对象被分配完后,下一级队列将自身对应的内存对象补充到所述上一级队列。
优选地,所述内存池中的所述至少两级队列分别与CPU的各级Cache具有对应关系;
其中,除最后一级队列的其他各级队列对应的内存对象,能够被自身对应的Cache容纳。
优选地,所述方法还包括:
当任一级队列释放内存对象后,使得当前队列长度超出原始长度时,将自身对应的若干内存对象回收至下一级队列。
优选地,当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
本发明提供的内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列;当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。本发明提供的内存池能够符合访问局部性原理,即使在执行高吞吐量的网络数据转发时,也不会使系统频繁的访问大范围的内存,避免了系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出,很大程度上提高了CPU的Cache的命中率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的内存池结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
由于现有的内存池在执行高吞吐量的网络数据转发时,会进行大量的内存对象的分配和释放操作。如果内存池容量较大,则会使系统频繁的访问大范围的内存,最终不仅导致系统访问内存对象时,CPU的Cache失效,而且如果占用了大量CPU的Cache资源,也会将CPU的Cache中的有效数据换出,降低CPU的Cache的有效利用率。
本发明实施例基于访问局部性原理提出了一种内存池,其中,该内存池中包括至少两级队列,各级队列中存储了内存池中内存对象的指针,通过指针的出队和入队操作完成内存对象的分配和释放。其中,该内存池包括第一级队列,具体的,当外部模块向内存池申请内存对象时,该第一级队列优先用于为其分配内存对象。也就是说,当第一级队列中存在未出队的指针时,仅利用第一级队列为外部模块分配内存对象。这样,即使内存池的容量较大,系统频繁访问的也仅是第一级队列范围内的内存。不会导致系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出。
访问局部性原理具体是指:在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。
本发明实施例提供了一种内存池,参考图1,图1为本发明实施例提供的一种内存池的结构示意图。
其中,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列。
当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。
实际应用中,如图1所示,所述内存池至少包括第一级队列和最后一级队列。进一步的,所述内存池至少包括能够被CPU的Cache容纳的第一级队列,以及包含剩余全部内存对象的最后一级队列。所述内存池还包括一个用于存储内存对象的数组,在内存池初始化时,该数组中的所有内存对象的指针均入队至内存池中的各级队列。也就是说,所述内存池中的各级队列存储了各个内存对象的指针,即各级队列分别与数组中存储的内存对象具有对应关系,通过指针的入队和出队操作,各级队列实现内存对象的申请和释放。
当外部模块向内存池申请一个内存对象时,系统从某级队列中出队一个指针,返回给外部模块,该外部模块就可以调用该指针所指的内存对象。当外部模块释放一个内存对象给内存池时,某级队列将该指针入队。
值得注意的是,为了符合访问局部性原理,本实施例提供的内存池在接收到外部模块申请内存对象的请求时,优先利用第一级队列为该外部模块分配内存对象。也就是说,当第一级队列中存在未出队的指针时,仅利用第一级队列为外部模块分配内存对象。
本实施例中,所述内存池中包括的队列的个数可以根据CPU的Cache确定。假如CPU具有三级Cache,则所述内存池可以设置三级队列,其中,除最后一级队列的其他各级队列的原始长度小于自身对应的Cache的长度。具体的,第一级队列与CPU的第二级Cache具有对应关系,且第一级队列能够被CPU的第二级Cache容纳;第二级队列与CPU的第三级Cache具有对应关系,且第二级队列能够被CPU的第三级Cache容纳;最后一级队列包含内存池中剩余全部内存对象。实际应用中,当外部模块向内存池申请内存对象时,优先利用第一级队列为该外部模块分配内存对象。当第一级队列对应的内存对象被分配完时,下一级队列,即第二级队列为第一级队列补充内存对象,即将自身对应的内存对象补充到上一级队列中,事实上是将第二级队列中的指针补充到第一级队列中。依此类推,本实施例的内存池中,当上一级队列对应的内存对象被分配完后,下一级队列用于将当前自身存在的指针补充到所述上一级队列。
另外,所述内存池中的各级队列通过释放内存对象,使得指针入队,最终队列自身的长度增加。实际应用中,系统的另一个线程负责判断各级队列的当前队列长度是否超出被配置的原始长度,如果任一级队列的当前队列长度超出原始长度,则将其自身对应的若干内存对象回收至其下一级队列,即将该队列当前存在的多余指针回收至下一级队列,使得被回收后的当前队列的长度不超出原始长度。这样做的目的是为了保证各级队列能够被其所对应的CPU的Cache容纳,进而保证访问局部性原理。
为了符合访问局部性原理,本实施例中的内存池优先利用一个队列为外部模块分配内存。所以,本实施例符合访问局部性原理,即使内存池的容量较大,系统频繁访问的也仅是第一级队列范围内的内存。不会导致系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出,很大程度上提高了CPU的Cache的命中率。
另外,本发明实施例提供的内存池设置了防最高级Cache污染机制,即当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
本实施例以防三级Cache污染机制为例,具体的,当第一级队列对应的内存对象超过预设容量C(通常是CPU的第三级Cache的容量)时,分配内存对象时跳过载入CPU的第三级Cache的操作。由于频繁申请释放内存池中的内存对象的过程会访问大范围的内存,此时,即使将内存对象缓存至CPU的第三级Cache也会很快被换出,并且还会影响到CPU的第三级Cache中其他频繁使用的有效数据。实际应用中,可以预先在内存池中设置触发防三级Cache污染机制的条件。具体的,当第一级队列的当前队列长度超过原始长度,且时间持续超过预设的T秒时,则该内存池会触发该防三级Cache污染机制。
本实施例提供的内存池能够应用于数据层开发套件(DataPlaneDevelopmentKit,DPDK)平台中。
传统的数据层开发套件(DataPlaneDevelopmentKit,DPDK)平台中的内存池,即缓冲池rte_mempool,支持在外部模块申请内存对象时,仅能申请一个或多个固定长度的内存块,即内存对象。内存池初始化时,指定每个内存对象的长度字节数,内存对象的总个数等。内存池是由一个用于分配和释放内存对象的队列和一个存储内存对象的数组组成。初始化时,该数组中的所有内存对象的指针都入对至该队列。当外部模块向内存池申请一个内存对象时,该队列将任一内存对象的指针出队,并返回至该外部模块完成内存对象的分配。当外部模块释放一个内存对象时,该队列将释放的内存对象的指针入队。在内存池被创建后,该队列中当前存在的内存对象的指针对应的即为内存池中的空闲内存对象,已经出队的指针对应的内存对象即为已经分配的内存对象,整个内存对象的申请和释放操作实际上只是该队列中指针的入队和出队操作。
但是对于传统DPDK平台中的内存池,由于内存对象的分配和释放是采用队列的先进先出原则,在执行高吞吐量的网络数据转发时,会进行大量的内存对象的分配和释放操作。假如内存池容量较大,则会使系统频繁的访问大范围的内存,最终不仅导致系统访问内存对象时,CPU的Cache失效,而且一旦占用了大量CPU的Cache资源,也会将有效数据换出CPU的Cache,降低CPU的Cache利用率。
本发明实施例提供的内存池应用于DPDK平台中,该应用于DPDK平台的内存池(简称DPDK内存池)包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列。
当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。
当DPDK内存池中的上一级队列对应的内存对象被分配完后,下一级队列用于将自身对应的内存对象补充到所述上一级队列。
所述DPDK内存池中的所述至少两级队列分别与CPU的各级Cache具有对应关系;其中,除最后一级队列的其他各级队列的原始长度小于自身对应的Cache的长度。
当该DPDK内存池中的任一级队列释放内存对象后,使得当前队列长度超出原始长度时,将自身对应的若干内存对象回收至下一级队列。
当该DPDK内存池中的第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
综上,本发明实施例提供的DPDK内存池能够符合访问局部性原理,即使在执行高吞吐量的网络数据转发时,也不会使系统频繁的访问大范围的内存,避免了系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出,很大程度上提高了CPU的Cache的命中率。
本发明实施例还提供了一种内存分配方法,该方法应用于内存池,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列,所述方法包括:
当外部模块向所述内存池申请内存对象时,所述第一级队列优先为所述外部模块分配内存对象。
另外,当所述内存池中的上一级队列对应的内存对象被分配完后,则下一级队列将自身对应的若干内存对象补充到所述上一级队列中。
在实际应用中,预先在所述内存池中设置各级队列分别与CPU的Cache的对应关系。具体的,所述内存池中除最后一级队列的其他各级队列对应的内存对象,能够被自身对应的CPU的Cache容纳。假如CPU的Cache为三级Cache,则所述内存池可以设置三级队列,其中,除最后一级队列的其他各级队列的原始长度小于自身对应的CPU的Cache的长度。具体的,第一级队列与CPU的第二级Cache具有对应关系,且第一级队列能够被CPU的第二级Cache容纳;第二级队列与CPU的第三级Cache具有对应关系,且第二级队列能够被CPU的第三级Cache容纳;最后一级队列包含内存池中剩余全部内存对象。
另外,所述内存池的各级队列还用于释放内存对象。当任一级队列释放内存对象,即队列将该内存对象的指针入队后,使得当前队列的长度超出原始长度时,将自身对应的若干内存对象回收至当前队列的下一级队列,以使得当前队列的长度不超过原始长度。
另外,本发明实施例还提供了防最高级Cache污染机制,即当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
本发明实施例提供的内存分配方法应用于内存池中,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列。当外部模块向所述内存池申请内存对象时,所述第一级队列优先为所述外部模块分配内存对象。本实施例符合访问局部性原理,即使在执行高吞吐量的网络数据转发时,也不会使系统频繁的访问大范围的内存,避免了系统访问内存对象时,CPU的Cache失效,也不会将CPU的Cache中的有效数据换出,很大程度上提高了CPU的Cache的命中率。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明实施例所提供的一种内存池及内存分配方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种内存池,其特征在于,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列;
当外部模块向所述内存池申请内存对象时,所述第一级队列,优先用于为所述外部模块分配内存对象。
2.根据权利要求1所述内存池,其特征在于,
当上一级队列对应的内存对象被分配完后,下一级队列用于将自身对应的内存对象补充到所述上一级队列。
3.根据权利要求1所述的内存池,其特征在于,所述内存池中的所述至少两级队列分别与CPU的各级Cache具有对应关系;
其中,除最后一级队列的其他各级队列的原始长度小于自身对应的Cache的长度。
4.根据权利要求3所述的内存池,其特征在于,
当任一级队列释放内存对象后,使得当前队列长度超出原始长度时,将自身对应的若干内存对象回收至下一级队列。
5.根据权利要求3所述的内存池,其特征在于,
当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
6.一种内存分配方法,其特征在于,所述方法应用于内存池,所述内存池包括至少两级队列,所述至少两级队列分别与所述内存池中的内存对象具有对应关系,且用于分配和释放自身对应的内存对象;所述至少两级队列中包括第一级队列,所述方法包括:
当外部模块向所述内存池申请内存对象时,所述第一级队列优先为所述外部模块分配内存对象。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
当上一级队列对应的内存对象被分配完后,下一级队列将自身对应的内存对象补充到所述上一级队列。
8.根据权利要求6所述的方法,其特征在于,所述内存池中的所述至少两级队列分别与CPU的各级Cache具有对应关系;
其中,除最后一级队列的其他各级队列对应的内存对象,能够被自身对应的Cache容纳。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
当任一级队列释放内存对象后,使得当前队列长度超出原始长度时,将自身对应的若干内存对象回收至下一级队列。
10.根据权利要求8所述的方法,其特征在于,
当第一级队列对应的内存对象超过CPU的最高级Cache的容量时,跳过载入所述最高级Cache的操作。
CN201510519075.5A 2015-08-21 2015-08-21 一种内存池及内存分配方法 Active CN105138475B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510519075.5A CN105138475B (zh) 2015-08-21 2015-08-21 一种内存池及内存分配方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510519075.5A CN105138475B (zh) 2015-08-21 2015-08-21 一种内存池及内存分配方法

Publications (2)

Publication Number Publication Date
CN105138475A true CN105138475A (zh) 2015-12-09
CN105138475B CN105138475B (zh) 2018-08-03

Family

ID=54723828

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510519075.5A Active CN105138475B (zh) 2015-08-21 2015-08-21 一种内存池及内存分配方法

Country Status (1)

Country Link
CN (1) CN105138475B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020259208A1 (zh) * 2019-06-25 2020-12-30 平安科技(深圳)有限公司 内存调度方法、装置、设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101122883A (zh) * 2006-08-09 2008-02-13 中兴通讯股份有限公司 一种避免内存碎片化的内存分配方法
CN101266575A (zh) * 2007-03-13 2008-09-17 中兴通讯股份有限公司 一种提高内存池利用率的方法
US20090216988A1 (en) * 2008-02-27 2009-08-27 Michael Palladino Low overhead memory management system and method

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101122883A (zh) * 2006-08-09 2008-02-13 中兴通讯股份有限公司 一种避免内存碎片化的内存分配方法
CN101266575A (zh) * 2007-03-13 2008-09-17 中兴通讯股份有限公司 一种提高内存池利用率的方法
US20090216988A1 (en) * 2008-02-27 2009-08-27 Michael Palladino Low overhead memory management system and method

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020259208A1 (zh) * 2019-06-25 2020-12-30 平安科技(深圳)有限公司 内存调度方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN105138475B (zh) 2018-08-03

Similar Documents

Publication Publication Date Title
US9965392B2 (en) Managing coherent memory between an accelerated processing device and a central processing unit
US9898338B2 (en) Network computer system and method for dynamically changing execution sequence of application programs
CN107154012A (zh) 图形处理器及其操作方法
JP2019532450A5 (zh)
CN103003791B (zh) 分配共享堆栈的部分的系统和方法
US10223253B2 (en) Allocation systems and method for partitioning lockless list structures
CN102831068B (zh) 一种内存操作记录的处理方法及装置
CN105843748A (zh) 一种对内存中内存页的处理方法及装置
US9098406B2 (en) Managing addressable memory in heterogeneous multicore processors
EP3217406B1 (en) Memory management method and device, and memory controller
US11237756B2 (en) System and method of writing to nonvolatile memory using write buffers
JP2011076604A5 (zh)
CN101847127A (zh) 一种内存管理方法及装置
US20100257336A1 (en) Dependency Matrix with Reduced Area and Power Consumption
US20020138702A1 (en) Using non-executable memory as executable memory
CN105335306A (zh) 一种内存控制方法和装置
CN103218305A (zh) 存储空间的分配方法
CN106325995B (zh) 一种gpu资源的分配方法及系统
CN111104219A (zh) 虚拟核心与物理核心的绑定方法、装置、设备及存储介质
CN104216684A (zh) 一种多核并行系统及其数据处理方法
CN106254270A (zh) 一种队列管理方法及装置
CN105138475A (zh) 一种内存池及内存分配方法
KR20150136075A (ko) 공유 메모리 시스템
CN103377141A (zh) 高速存储区的访问方法以及访问装置
CN104572483A (zh) 动态内存管理装置及方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant