Linux 内核线程调度与资源管理:CPU 亲和性、调度策略及 cgroups 详解
1. CPU 亲和性掩码的理解与操作
在 Linux 系统中,线程的 CPU 亲和性掩码是一个重要的概念。任务结构包含了多个与调度相关的属性,其中 CPU 亲和性位掩码( cpumask_t cpus_allowed )是一个关键成员。它本质上是一个位数组,每个位代表一个 CPU 核心。如果对应核心的位被设置为 1,则线程可以在该核心上调度和执行;若为 0,则不允许。
默认情况下,所有 CPU 亲和性掩码位都被设置,这意味着线程可以在任何核心上运行。例如,在一个有四个 CPU 核心的系统中,每个线程的默认 CPU 亲和性位掩码为二进制的 1111(十六进制 0xf)。
在运行时,调度器会决定线程实际运行的核心。默认情况下,每个 CPU 核心都有一个关联的运行队列,每个可运行的线程都会位于一个运行队列上,并默认在该队列所代表的 CPU 上运行。不过,调度器的负载均衡组件可以根据需要将线程迁移到其他 CPU 核心。
虽然可以手动操作 CPU 亲和性掩码,但通常建议避免这样做,因为内核调度器能够更好地理解 CPU 拓扑结构并实现系统的负载均衡。不过,在某些情况下,显式设置 CPU 亲和性掩码是有益的,具体如下:
- 减少缓存失效 :确保线程始终在同一 CPU 核心上运行,可大大减少缓存失效和不愉快的缓存“跳动”。
- 消除线程迁移成本 :有效消除核心之间的线程迁移成本。
- CPU 预留 :将核心专门分配给一个
超级会员免费看
订阅专栏 解锁全文
803

被折叠的 条评论
为什么被折叠?



