CN117785496A - 一种微内核操作系统的用户级rcu实现方法 - Google Patents
一种微内核操作系统的用户级rcu实现方法 Download PDFInfo
- Publication number
- CN117785496A CN117785496A CN202311871108.3A CN202311871108A CN117785496A CN 117785496 A CN117785496 A CN 117785496A CN 202311871108 A CN202311871108 A CN 202311871108A CN 117785496 A CN117785496 A CN 117785496A
- Authority
- CN
- China
- Prior art keywords
- rcu
- function
- read
- cpu
- thread
- 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 22
- 230000006870 function Effects 0.000 claims abstract description 58
- 230000003068 static effect Effects 0.000 claims abstract description 28
- 230000008859 change Effects 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 4
- 230000004888 barrier function Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
Landscapes
- Storage Device Security (AREA)
Abstract
本发明公开了一种微内核操作系统的用户级RCU实现方法,在微内核操作系统的用户态中部署RCU服务,读线程访问共享数据时为读操作进行加锁和解锁操作,写线程在对共享数据进行更改后,开启全局宽限期并为其分配世代号,内核为每个CPU设置一个位图变量的bit位,CPU在经历静止状态后则将该bit位置为0,当位图变量转为0向量标志着对应的宽限期结束,内核向RCU服务发送静止事件,RCU服务调用宽限期对应的回调函数,回收内存资源。本发明可以在微内核操作系统的用户态实现RCU,提高RCU效率。
Description
技术领域
本发明属于微内核技术领域,更为具体地讲,涉及一种微内核操作系统的用户级RCU实现方法。
背景技术
Read-Copy Update(RCU)是一种用于在多线程环境下管理共享数据的并发编程技术,它旨在提供高性能且低开销的并发读取访问,同时确保数据的一致性,而无需使用传统的互斥锁。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。当需要更新共享数据时,不会立即修改原始数据,而是创建一个新的数据副本。这个新副本只有在没有任何线程引用旧副本时才会成为新的主要数据。旧数据副本并不立即销毁,而是被延迟回收。
目前已经有多种方法可以实现RCU,但是仍然存在无法实现用户态应用,或易产生阻塞等问题,需要进一步改进。
发明内容
本发明的目的在于克服现有技术的不足,提供一种微内核操作系统的用户级RCU实现方法,在微内核操作系统的用户态实现RCU,提高RCU效率。
为了实现上述发明目的,本发明微内核操作系统的用户级RCU实现方法包括以下步骤:
S1:在微内核操作系统的用户态中部署RCU服务,并对操作接口进行配置,操作接口函数包括读加锁函数rcu_read_lock,读解锁函数rcu_read_unlock,发布函数rcu_assign_pointer,同步函数synchronize_rcu和回调函数call_rcu;
S2:读线程访问共享数据时,采用rcu_read_lock函数和rcu_read_unlock函数为读操作进行加锁和解锁操作;
S3:当需要更改一个共享数据的内容时,写线程向RCU服务申请新内存空间,将原始共享数据拷贝到新内存空间,然后对新内存空间中的数据进行更改,更改完成后写线程将数据链表中对于原始内存空间的链接关系转移至新内存空间,完成共享数据替换;
S4:共享数据更新完成后,写线程调用synchronize_rcu函数或call_rcu函数注册回调函数从而开启宽限期;写线程为宽限期分配一个独一无二的世代号,将回调函数和指针保存至回调函数队列;然后RCU服务阻塞,写线程继续运行;
S5:内核中设置位图变量,每一位bit对应一个微内核操作系统中的CPU,每个CPU对应的bit值初始值均为1;内核对每个CPU进行监测,判断该CPU是否经历静止状态,如果未经历则不作任何操作,如果经历则将位图变量中对应bit置为0;当位图变量为全0时,则宽限期结束,生成一次静止事件,然后将位图变量重置为1;然后向RCU服务上报静止事件;
S6:RCU服务收到静止事件,从回调函数队列中取出宽限期对应的回调函数和数据指针,调用回调函数回收内存资源。
本发明微内核操作系统的用户级RCU实现方法,在微内核操作系统的用户态中部署RCU服务,读线程访问共享数据时为读操作进行加锁和解锁操作,写线程在对共享数据进行更改后,开启全局宽限期并为其分配世代号,内核为每个CPU设置一个位图变量的bit位,CPU在经历静止状态后则将该bit位置为0,当位图变量转为0向量标志着对应的宽限期结束,内核向RCU服务发送静止事件,RCU服务调用宽限期对应的回调函数,回收内存资源。
本发明具有以下有益效果:
1)本发明提供了RCU在用户态的实现,拓宽了RCU的使用场景;
2)本发明中,写线程在更改数据开启宽限期后可以直接继续运行,无需等待宽限期结束,之后通过回调函数将旧数据的内存空间释放掉,有效减少了阻塞,从而大大提高RCU的效率。
附图说明
图1是本发明微内核操作系统的用户级RCU实现方法的具体实施方式流程图;
图2是共享数据替换操作的示意图;
图3是本实施例中RCU实现过程的示例图。。
具体实施方式
下面结合附图对本发明的具体实施方式进行描述,以便本领域的技术人员更好地理解本发明。需要特别提醒注意的是,在以下的描述中,当已知功能和设计的详细描述也许会淡化本发明的主要内容时,这些描述在这里将被忽略。
实施例
图1是本发明微内核操作系统的用户级RCU实现方法的具体实施方式流程图。如图1所示,本发明微内核操作系统的用户级RCU实现方法的具体步骤包括:
S101:部署RCU服务:
在微内核操作系统的用户态中部署RCU服务,并对操作接口进行配置,操作接口函数包括读加锁函数rcu_read_lock,读解锁函数rcu_read_unlock,发布函数rcu_assign_pointer,同步函数synchronize_rcu和回调函数call_rcu。
S102:读线程访问共享数据:
读线程访问共享数据时,采用rcu_read_lock函数和rcu_read_unlock函数为读操作进行加锁和解锁操作。当读线程读取数据时,调用rcu_read_lock函数进行上锁,此处会有一个内存屏障,以避免流水线内存读取顺序,此外,该函数还会禁止中断,不然程序进入内核态会造成记录信息错乱。这里的上锁只是表示线程对资源的占用,并没有任何锁原语。当读线程结束读操作时,调用rcu_read_unlock函数解锁,它会开启中断并生成一个内存屏障。这里的解锁只是表示线程对资源的释放,也并没有任何锁原语。
S103:写线程对共享数据进行替换操作:
当需要更改一个共享数据的内容时,写线程申请新内存空间,将原始共享数据拷贝到新内存空间,然后对新内存空间中的数据进行更改,更改完成后写线程将数据链表中对于原始内存空间的链接关系转移至新内存空间,完成共享数据替换。这是一个原子操作,防止读线程访问到还未更改完成的数据。在更改操作之前的读线程只会访问到旧数据,在更改操作之后的读线程只会访问到新数据。不管怎样,读线程只会访问到旧数据或是新数据,不可能访问到一个中间状态的数据。
图2是共享数据替换操作的示意图。如图2所示,线程1正在对共享数据B进行读取,当线程2需要对共享数据B进行修改,先申请新内存空间复制数据并修改后得到共享数据B’,然后将数据A和数据C与原始共享数据B的链接关系转移到共享数据B’,从而在不影响线程1的读操作情况下完成共享数据替换。替换操作需要保证原子性,因为替换操作并不需要花过长的事件,所以本实施例中写线程采用自旋锁进行同步,而不采用互斥锁。
S104:开启宽限期:
在RCU同步机制中,宽限期是实现数据同步的重要一环。宽限期指的是每个CPU经历至少一次静止状态的时间间隔。(注意,任何包含宽限期的时间间隔其本身也是宽限期。)共享数据更新完成后,写线程调用synchronize_rcu函数或call_rcu函数注册回调函数从而开启宽限期。由于RCU服务中同一时间可能存在多个宽限期,每个宽限期的起始时间和结束时间不一定相同,为了对宽限期做区分,为每个宽限期分配一个唯一的世代号,通过世代号就可以快速查找宽限期状态和回调函数。因此本发明中写线程为宽限期分配一个独一无二的世代号,将回调函数和指针保存至回调函数队列。然后RCU服务阻塞,写线程继续运行。
S105:内核上报静止事件:
内核中设置位图变量,每一位bit对应一个微内核操作系统中的CPU,每个CPU对应的bit值初始值均为1。内核对每个CPU进行监测,判断该CPU是否经历静止状态,如果未经历则不作任何操作,如果经历则将位图变量中对应bit置为0。在多核CPU下,只有所有CPU都经历静止状态,宽限期才能结束,否则认为当前还有读线程在引用旧数据。因此,当位图变量为全0时,则宽限期结束,生成一次静止事件,然后将位图变量重置为1。然后向RCU服务上报静止事件。
本实施例中,CPU静止状态的判断方法为:如果CPU处于空闲线程或线程执行在内核态,则CPU处于静止状态。线程执行在内核态一般包括系统调用和中断异常,这是因为读线程在读取过程中不会进入内核态,当读线程进入内核态时,就说明已经读取完数据。
此外,为了避免内核频繁向RCU服务发送事件,可以在内核设置静止事件计数器,每经历一次位图变量归0则令计数器加1,当计数器的值达到预设阈值,内核则向RCU服务上报静止事件,否则不作任何操作。因为RCU服务本来就是延迟回收内存资源,所以上述的操作并不会影响RCU的性能。
S106:回收内存资源:
RCU服务收到静止事件,从回调函数队列中取出宽限期对应的回调函数和数据指针,调用回调函数回收内存资源。
在Linux操作系统中使用软中断等方式调用回调函数,而本发明直接由RCU服务进行该操作,调用已结束的宽限期的回调函数,回收原始数据所在的内存空间,更加便捷。
图3是本实施例中RCU实现过程的示例图。如图3所示,假设写进程对共享数据进行修改时,有读者1、2、3、4正在对共享数据进行读取,开启宽限期时读者2完成读取,尚有读者1、3、4进行读取,此时仍然是对原始内存空间的数据进行读操作。宽限期内,有读者6、7、8发起读线程,此时是对新内存空间的数据进行读操作。读者1、3、4相继完成读取,对应CPU出现静止状态,且CPU3在宽限期内也经历过静止状态,内核将其对应的位图向量bit位置为0。读者4所对应的CPU4上报事件后,位图向量转为0向量,内核向RCU服务上报静止事件,RCU服务回收原始数据所在的内存空间。
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
Claims (3)
1.一种微内核操作系统的用户级RCU实现方法,其特征在于,包括以下步骤:
S1:在微内核操作系统的用户态中部署RCU服务,并对操作接口进行配置,操作接口函数包括读加锁函数rcu_read_lock,读解锁函数rcu_read_unlock,发布函数rcu_assign_pointer,同步函数synchronize_rcu和回调函数call_rcu;
S2:读线程访问共享数据时,采用rcu_read_lock函数和rcu_read_unlock函数为读操作进行加锁和解锁操作;
S3:当需要更改一个共享数据的内容时,写线程向RCU服务申请新内存空间,将原始共享数据拷贝到新内存空间,然后对新内存空间中的数据进行更改,更改完成后写线程将数据链表中对于原始内存空间的链接关系转移至新内存空间,完成共享数据替换;
S4:共享数据更新完成后,写线程调用synchronize_rcu函数或call_rcu函数注册回调函数从而开启宽限期;写线程为宽限期分配一个独一无二的世代号,将回调函数和指针保存至回调函数队列;然后RCU服务阻塞,写线程继续运行;
S5:内核中设置位图变量,每一位bit对应一个微内核操作系统中的CPU,每个CPU对应的bit值初始值均为1;内核对每个CPU进行监测,判断该CPU是否经历静止状态,如果未经历则不作任何操作,如果经历则将位图变量中对应bit置为0;当位图变量为全0时,则宽限期结束,生成一次静止事件,然后将位图变量重置为1;然后向RCU服务上报静止事件;
S6:RCU服务收到静止事件,从回调函数队列中取出宽限期对应的回调函数和数据指针,调用回调函数回收内存资源。
2.根据权利要求1所述的用户级RCU实现方法,其特征在于,所述步骤S5中CPU静止状态的判断方法为:如果CPU处于空闲线程或线程执行在内核态,则CPU处于静止状态。
3.根据权利要求1所述的用户级RCU实现方法,其特征在于,所述步骤S5中在内核设置静止事件计数器,每经历一次位图变量归0则令计数器加1,当计数器的值达到预设阈值,内核则向RCU服务上报静止事件,否则不作任何操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311871108.3A CN117785496A (zh) | 2023-12-29 | 2023-12-29 | 一种微内核操作系统的用户级rcu实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311871108.3A CN117785496A (zh) | 2023-12-29 | 2023-12-29 | 一种微内核操作系统的用户级rcu实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117785496A true CN117785496A (zh) | 2024-03-29 |
Family
ID=90384897
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311871108.3A Pending CN117785496A (zh) | 2023-12-29 | 2023-12-29 | 一种微内核操作系统的用户级rcu实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117785496A (zh) |
-
2023
- 2023-12-29 CN CN202311871108.3A patent/CN117785496A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5727209A (en) | Apparatus and method for achieving reduced overhead mutual-exclusion and maintaining coherency in a multiprocessor system utilizing execution history and thread monitoring | |
US7650602B2 (en) | Parallel processing computer | |
US7395383B2 (en) | Realtime-safe read copy update with per-processor read/write locks | |
JP2559959B2 (ja) | 複数の非同期的プロセスによりレコードを更新する方法 | |
US20020016879A1 (en) | Resource locking and thread synchronization in a multiprocessor environment | |
JP4051703B2 (ja) | シングルプロセッサ向けosによる並列処理システム、並列処理プログラム | |
US11132294B2 (en) | Real-time replicating garbage collection | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US9378069B2 (en) | Lock spin wait operation for multi-threaded applications in a multi-core computing environment | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
CN111857993B (zh) | 一种内核态调用用户态函数的方法 | |
CN101833475A (zh) | 用于增强线程级推测的原语 | |
JPH07191944A (ja) | 多重プロセッサによる多数の資源への命令におけるデッドロックを防止するためのシステムおよび方法 | |
US5495614A (en) | Interface control process between using programs and shared hardware facilities | |
CN115454653B (zh) | 一种基于嵌入式实时操作系统的rcu实现方法 | |
CN117112244A (zh) | 一种面向混合实时性任务集的非对称stm同步方法 | |
CN117785496A (zh) | 一种微内核操作系统的用户级rcu实现方法 | |
US6366946B1 (en) | Critical code processing management | |
Kaiser et al. | Multiple concurrency control policies in an object-oriented programming system | |
EP0551528B1 (en) | Method and apparatus for reducing lock period of shared buffer | |
JP4242155B2 (ja) | 永続的記憶装置へのダーティデータ項目の書込を調整するための方法、当該方法をコンピュータに行なわせるためのプログラムを格納したコンピュータ読出可能な媒体、および、永続的記憶装置へのダーティデータ項目の書込を調整するための装置 | |
EP1366420B1 (en) | Disk writes in a distributed shared disk system | |
WO2001013229A2 (en) | System and method for data exchange | |
CN111723250A (zh) | 一种基于引用计数的链表管理方法 | |
US11640246B2 (en) | Information processing device, control method, and computer-readable recording medium storing control program |
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 |