深入理解线程CPU亲和性掩码及调度策略
1. 线程CPU亲和性掩码基础
线程的CPU亲和性掩码是一个重要概念,它本质上是一个每线程的属性。任务结构包含多个与调度相关的属性,其中CPU亲和性位掩码( cpumask_t cpus_allowed )是关键成员。它是一个位数组,每个位代表一个CPU核心。若对应核心的位被设置为1,则线程可以在该核心上调度和执行;若为0,则不可以。
默认情况下,所有CPU亲和性掩码位都被设置,这意味着线程可以在任何核心上运行。例如,在一个有4个CPU核心的系统中,每个线程的默认CPU亲和性位掩码是二进制的1111(十六进制为0xf)。
在运行时,调度器决定线程实际运行的核心。默认情况下,每个CPU核心都有一个关联的运行队列,可运行的线程会位于一个运行队列上,并默认在该队列代表的CPU上运行。不过,调度器的负载均衡组件可以根据需要将线程迁移到其他CPU核心。
2. 操作CPU亲和性掩码的API
内核向用户空间暴露了相关API,如 sched_{s,g}etaffinity(2) 系统调用及其 pthread 包装库API,允许应用程序将线程关联到特定的CPU核心。例如,将CPU亲和性掩码设置为二进制的1010(十六进制为0xa),意味着线程只能在第1和第3个CPU核心(编号从0开始)上执行。
虽然可以手动操作CPU亲和性掩码,但建议避免这样做,因为内核调度器能更好地理解CPU拓扑结构并实现系统负载均衡。不过,在某些情况下,显式设置CPU亲和性掩码是有益的:
- 减少缓存失效 <
超级会员免费看
订阅专栏 解锁全文

706

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



