首页 > 其他分享 >RCU-4——不可抢占RCU代码分析

RCU-4——不可抢占RCU代码分析

时间:2023-04-27 21:12:12浏览次数:51  
标签:抢占 read RCU 代码 bh rcu void

基于 Linux-5.10

一、不可抢占RCU

1. 不可抢占RCU不允许进程在读端临界区被其它进程抢占,使用函数 rcu_read_lock_sched()/rcu_read_unlock_sched() 标记读临界区。前者禁止内核抢占,后者开启内核抢占。

static inline void rcu_read_lock_sched(void) //include/linux/rcupdate.h
{
    preempt_disable();
}

static inline void rcu_read_unlock_sched(void)
{
    preempt_enable();
}

2. 不可抢占RCU通过以下事件观察到静止状态

(1) 进程调度器调度进程。因为不可抢占RCU读临界区禁止内核抢占,所以进程调度器不会在读临界区调度进程,如果调度了进程,那么一定不在读临界区。

(2) 当前进程正在用户模式下运行。

(3) 处理器空闲,正在执行idle线程。

静态的观察位置1:

__schedule(bool preempt) //sched/core.c
    rcu_note_context_switch(preempt); //tree_plugin.h local_irq_disable()后调用,这个函数也要求必须要关中断调用
        rcu_qs();

TODO

 

二、加速版不可抢占RCU

1. 加速版不可抢占RCU(RCU-bh)使用 rcu_read_lock_bh()/rcu_read_unlock_bh() 标记读端临界区,前者禁止软中断,后者开启软中断。

static inline void rcu_read_lock_bh(void)
{
    local_bh_disable();
    ...
}

static inline void rcu_read_unlock_bh(void)
{
    ...
    local_bh_enable();
}

2. 加速版不可抢占RCU通过以下事件观察到静止状态:

(1) 执行完软中断。因为RCU-bh的读端临界区是禁止软中断的,所以进程在读端临界区是不会被软中断抢占。

(2) 当前进程在用户模式下运行。

(3) 处理器空闲,正在执行idle线程。

(4) 处理器没有执行软中断或禁止软中断的代码区域。


3. 检查静止状态的时机

(1) 执行完一轮软中断后,禁止硬中断之前,调用 rcu_qs() 记录静止状态:

irq_exit_rcu
irq_exit
    __irq_exit_rcu
        invoke_softirq
            do_softirq_own_stack
                __do_softirq //softirq.c
                    rcu_softirq_qs //tree.c
                        rcu_qs //tree_plugin.h

(2) tick中断中会检查 

update_process_times

TODO

 

标签:抢占,read,RCU,代码,bh,rcu,void
From: https://www.cnblogs.com/hellokitty2/p/17360214.html

相关文章

  • RCU-2——RCU初探
    一、RCU简介RCU(Read-Copy-Update)的意思是读-复制-更新,是根据原理命名的。写者修改对象的逻辑是:首先复制一个副本,然后更新这个副本,最后使用新的对象替换旧的对象。在写者执行复制更新的时候读者可以读数据。写者删除对象,必须要等到所有读者结束访问,才能执行销毁操作。RCU的关......
  • 在线设计Tkinter界面,生成Python代码,Tkinter布局助手,拖拽生成界面,tkinter designer,可视
    设计地址:https://www.pytk.net/tkinter-helper/? 运行演示  教程地址:https://www.pytk.net/tkinter.html 常用演示"""本代码由[Tkinter布局助手]生成当前版本:3.2.4官网:https://www.pytk.net/tkinter-helperQQ交流群:788392508"""fromtkinterimportmessag......
  • 使用TortoiseGit(小乌龟)管理gitee和本地代码仓库
    一、安装git二、安装TortoiseGitTortoiseGit(小乌龟)的安装三、创建版本库创建一个文件夹,右键,选择Git在这里创建版本库 点击确定 然后我们就会发现多了一个.git的文件,如果没有的话,把查看-->显示-->隐藏的项目勾选就可以看见了 点击拉取 点击管理远端 ......
  • 代码随想录Day38-Leetcode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
    咳咳,因为找实习+摆导致时间被浪费大半;先从动态规划学起吧,之前的慢慢补。理论基础动态规划的解题步骤1.确定dp数组及对应下标的含义2.确定dp的状态转移方程(递推公式)3.确定dp数组如何初始化4.确定dp遍历顺序5.距离推导dp数组验证509.斐波那契数题目链接:https://le......
  • c# 计算程序执行时间,计算一段代码执行所用的时间,测试效率
    usingSystem;usingSystem.Threading;classClass1{ [System.Runtime.InteropServices.DllImport("Kernel32.dll")] staticexternboolQueryPerformanceCounter(reflongcount); [System.Runtime.InteropServices.DllImport("Kernel32.dll")] ......
  • c# winform 用代码生成一张只有一个像素点的图片,保存到硬盘里或者显示到panel里...
    只生成图片stringnullPath="C:\\黑色头发.jpg";Bitmapb=newBitmap(1,1);b.Save(nullPath);b.Dispose();生成图片并显示到panel里Bitmapb=newBitmap(this.panel1.Width,this.panel1.Height);this.panel1.DrawToBitmap(b,newRectangle(0......
  • 001使用HTTPS协议设置免密码提交代码
    一、store模式:将凭证用明文的形式存放在磁盘“home”目录下(默认是“~/.git-credentials”),永不过期,除非手动修改在Git服务器上的密码,否则永远不需要再次输入凭证信息。“git-credentials”文件内容如下:https://username:password@***********.com保存退出后,执行如下命令即可......
  • 在linux系统里将图片通过代码打出来
    打开终端1,访问https://sourceforge.net/projects/aa-project/files打开后选择aa-lib和aview分别下载最新版本2,将这两个安装包上传到linux系统里,并解压。3,这两个包,分别./configure&&make&&makeinstall4,完成后,yuminstallImageMagick5,上传一张图片,使用asciiview......
  • 《Effective C#》系列之(二)——如何使代码易于阅读和理解
    在《EffectiveC#》这本书中,使代码更易于阅读和理解是其中一章的主要内容。以下是该章节的一些核心建议:使用清晰、有意义的名称:变量、方法、类型等的名称应该能够准确地描述其含义,不要使用缩写或过于简短的名称。遵循命名约定:在C#语言中,通常会采用PascalCase或camelCase的命......
  • 零代码
    后端零代码平台(http://www.my0code.com)提供前端页面调试的后台服务,实现表和表字段的增删改查、单表和多表数据的增删改查、字段限制、行锁、软删除、事务、分表、分库、读写分离、缓存、微服务、登录注销、权限管理、日志、文件存储等功能感兴趣的话发送公司名称、姓名、手机号......