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;
}
相关推荐
Web3探索者17 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo19 小时前
Linux系统中网线与USB网络共享冲突
linux
Sokach10152 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao3 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3104 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒6 天前
TShark:Wireshark CLI 功能
linux
A小辣椒6 天前
TShark:基础知识
linux
AlfredZhao6 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao7 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi