Linux中CPU亲和性(affinity)

本文将详细解释Linux中CPU亲和性的概念以及如何使用此功能来优化实际应用程序中的性能。
第一的,并行性并发;单核多线程;多核多线程;需要了解许多基本概念,包括物理CPU和逻辑CPU之间的区别以及超线程技术(HT)。
在现代计算机架构中,CPU可以通过并行和并发操作来执行多个任务。
并行是指同时执行多个任务,而并行意味着一次只执行一个任务,但是快速的上下文切换给用户一种多个任务同时运行的错觉。
单核多线程是在单个物理CPU上同时执行多个线程来模拟并发处理,并通过线程调度程序来模拟这些线程之间的顺序处理。
多核和多线程允许多个线程同时运行在多个物理CPU上,提供更高的并发性能。
物理CPU是指计算机硬件中实际安装的CPU数量,而逻辑CPU是指基于物理CPU和超线程技术相结合的虚拟CPU数量。
超线程技术CPU加上额外的逻辑,实现多核多线程效果启用物理CPU模拟。
例如,4核CPU并支持超线程逻辑CPU数量可达8个。
然后引入CPUAffinity的概念。
CPU亲和性描述了进程在特定CPU上运行而不是更频繁地调度到其他处理器的趋势。
这种态度可以通过两种方式实现:软亲密和强亲密。
软关联是Linux内核的默认行为,它允许进程在特定CPU上运行尽可能长的时间。
它运行在特定的CPU上,降低了进程迁移的频率。
硬亲和力允许进程通过修改内核提供的API来显式指定它在特定的CPU内核上运行。
硬亲和力主要在Linux内核中通过修改task_struct结构中的cpus_allowed位掩码来实现。
位掩码通过将位掩码的位置设置为1来对应系统中的逻辑处理器;可以指定进程只能运行在各自的CPU上。
通常,该位掩码指示所有进程都可以在任何CPU上运行。
Linux内核提供了API函数来修改和查询cpus_allowed位掩码。
使用硬亲和力有几个优点。
在计算需求较大的应用场景中;可以通过硬关联将功能绑定到特定的CPU内核。
在多核系统中;硬关联可以通过减少进程间数据交换的延迟并提高缓存命中率来提高应用程序性能。
此外,对于时间敏感或关键任务;硬亲和性确保这些操作始终在特定的CPU核心上执行,以避免因系统调度而造成性能损失。
拥有深厚的友谊;您可以使用Linux内核提供的API函数来设置和查询位掩码。
具体操作包括通过函数设置进程的cpus_allowed位掩码和通过函数查询当前的位掩码。
实施时,设置新的位掩码时;需要注意的是,进程会迁移到指定的CPU核心上,从其他CPU核心上运行。

多核编程与单核多线程编程

讨论多核编程和单核多线程编程的主要区别:

1锁竞争:在单核环境下,当一个线程获取锁时,其他等待的线程将会暂停。
即使使用锁,影响也仅限于加锁和解锁的延迟,CPU继续运行。
在多核中,多个线程竞争同一个锁会导致CPU利用率不均匀,而且即使在多核上,执行仍然可以串行化。

2.线程执行:对于单核来说,多线程的目标是在后台处理计算并提高用户界面的响应能力。
多核下,线程分解更加灵活,旨在均衡数据负载,保证所有CPU核都有任务。

3.负载均衡:单核不需要考虑负载,但多核必须保证任务均匀分布在多个核上,避免核心闲置。

4.任务调度:简单核心依赖于简单的策略,例如时间轮换或优先级。
多核必须考虑任务之间的时间消耗和负载平衡,规划可能需要编程。

5.Cache冲突:在多核中,同一Cacheline的并发写操作会导致问题,但在单核中不存在这种情况。
必须设计策略来避免伪记忆问题。

6优先级规划:单核优先常见多核下,优先级和任务并行度都会影响规划,必须优化策略。

7计算模型:单线程和多线程处理仅限于串行算法,不涉及并行或分布式计算。
多核编程趋向于并行和分布式计算,以提高计算效率和资源利用率。