Linux: lock: preempt_count 是一个线程级别的变量

5.14:

preempt_count 是 Linux 内核中的一个线程级别变量,因为它用于跟踪每个独立线程的抢占状态,确保关键操作的原子性。

和之前的印象有些不太一样,原来一直以为是CPU level的。需要修改。

preempt_count 是一个计数器,其主要目的是:

控制内核抢占: 当 preempt_count 的值大于零时,表示当前线程处于一个不可被抢占的临界区。这意味着调度器不能在此时中断当前线程并切换到另一个线程。

保护临界区: 内核中的许多操作(例如,持有自旋锁、处理中断、访问共享数据结构)需要原子性。通过在进入这些临界区时增加 preempt_count,并在退出时减少它,可以防止在这些关键操作中间发生抢占,从而避免数据损坏和竞态条件。

preempt_count 必须是线程级别的变量,原因如下:

独立的抢占状态: 每个线程都有其自己的执行路径和可能进入的临界区。一个线程可能正在执行一个需要禁用抢占的关键操作,而另一个线程则可能处于可以安全抢占的状态。如果 preempt_count 是全局的,那么一个线程禁用抢占会影响所有其他线程,导致不必要的延迟和性能问题。

上下文切换的需要: 当内核进行上下文切换时,它会从一个线程切换到另一个线程。每个线程的 preempt_count 值是其执行上下文的一部分。通过将其存储在 thread_info 结构中(如您提供的代码片段 current_thread_info()->preempt_count 所示,current_thread_info() 返回当前线程的 thread_info 结构),可以确保在线程切换时,每个线程都能恢复其正确的抢占状态。

避免竞态条件: 如果 preempt_count 是一个全局变量,多个 CPU 上的不同线程会同时尝试修改它,这将引入复杂的同步问题和竞态条件。将其作为线程局部变量,每个线程在自己的私有副本上操作,从而避免了这些问题。

简而言之,preempt_count 是线程级别的,以确保每个线程能够独立地管理其自身的抢占状态,从而在保证内核操作正确性的同时,最大化系统的并发性和响应性。

c 复制代码
static __always_inline volatile int *preempt_count_ptr(void)
{
	return &current_thread_info()->preempt_count;
}
相关推荐
_upupup10 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
JeJe同学10 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR10 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
闲云野鹤在人间11 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡12 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛12 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库0113 小时前
Linux 8个常见运维故障排查
java·linux·运维
零基础12313 小时前
Ubuntu 常用命令汇总
linux·运维·开发语言
Android系统攻城狮14 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
xiaoqiMikko14 小时前
Linux 实战(一):CentOS 7、Rocky 9、Ubuntu 24.04 三台真机实测 —— 认清系统、换源、装包的版本坑
linux·centos