Linux CPU 亲和性

软亲和性意味着进程并不会在处理器之间频繁迁移,而硬亲和性则意味着进程需要在您指定的处理器上运行。


Linux调度程序同时提供软硬CPU亲和性机制。虽然它尽力通过一种软的亲和性试图使进程尽量在同一个处理器上运行,但它也允许用户强制指定“这个进程无论如何都必须在这些处理器上运行。”这种硬CPU亲和性保存在进程task_struct的cpus_allowed这个位掩码标志中。该掩码标志的每一位对应一个系统可用的处理器。默认情况下,所有的位都被设置,进程可以在系统中所有可用的处理器上执行。用户可以通过sched_setaffinity()设置一个不同的一个或几个位组合的位掩码。而调用sched_getaffinity()则返回当前的cpus_allowed位掩码。

使用硬亲和性的3个原因

1、有大量计算要做
基于大量计算的情形通常出现在科学和理论计算中,但是通用领域的计算也可能出现这种情况。一个常见的标志是您发现自己的应用程序要在多处理器的机器上花费大量的计算时间。这时就可以通过sched_setaffinity()设置cpus_allowed位掩码,使该计算进程在多个处理器上执行。


2、保持高CPU缓存命中率
如果一个给定的进程迁移到其他地方去了,那么它就失去了利用 CPU 缓存的优势。实际上,如果正在使用的 CPU 需要为自己缓存一些特殊的数据,那么所有其他 CPU 都会使这些数据在自己的缓存中失效。

因此,如果有多个线程都需要相同的数据,那么将这些线程绑定到一个特定的 CPU 上是非常有意义的,这样就确保它们可以访问相同的缓存数据(或者至少可以提高缓存的命中率)。否则,这些线程可能会在不同的 CPU 上执行,这样会频繁地使其他缓存项失效。

3、实时进程的需要
例如,您可能会希望使用硬亲和性来指定一个8路主机上的某个处理器专门来处理实时进程的调度,而同时允许其他7个处理器处理所有普通进程的调度。这种做法确保对时间敏感的应用程序可以得到运行,同时可以允许其他长时间运行的应用程序独占其余的计算资源。


Linux内核提供的硬CPU亲和性的方怯很简单


首先,当进程第一次创建时,它继承了其父进程的相关掩码。由于父进程运行在指定处理器上,子进程也运行在相应处理器上。

其次,当处理器绑定关系改变时,内核会采用“移植线程”把任务推到合适的处理器上。

最后,加载平衡器只把任务拉到允许的处理器上(当然是由该进程描述符的cpus_allowed域设置的)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值