我很少有与线程和进程调度相关的查询。
- 当我的进程进入睡眠状态并重新唤醒时,它总是会被安排在与之前安排的相同 CPU 上吗?
- 当我从进程创建一个线程时,它是否也总是在同一个 CPU 上执行?即使其他 CPU 空闲且处于睡眠状态。
我想具体了解Linux中的机制。我也正在通过 pthread 库创建线程。我面临一个随机挂断问题,该问题始终不可重现。需要这些信息才能朝着正确的方向前进。
我很少有与线程和进程调度相关的查询。
我想具体了解Linux中的机制。我也正在通过 pthread 库创建线程。我面临一个随机挂断问题,该问题始终不可重现。需要这些信息才能朝着正确的方向前进。
在单处理器/核心系统上
在多处理器/核心系统上
使用任务集来检索或设置进程在多核系统上的 CPU 亲和性。将 CPU 亲和性设置为特定的处理器/核心将改变答案
也适用于多核系统。
在应用程序中,您可以使用sched_setaffinity 和/或 sched_getaffinity来调整 CPU 亲和性。
编辑:有关缓存缺点如何/何时管理 CPU 交换的其他详细信息:
Linux/SMP 调度程序: “......为了获得良好的系统性能,Linux/SMP(2.4 内核)采用经验规则来解决困境......”阅读链接参考中的详细信息,Linux/SMP部分调度器。
对于较新的 CFS(完全公平调度程序),您可以查看sched_migration_cost
. “...如果任务的实际运行时间小于此参数的值,则调度程序假定它仍在缓存中,并在负载平衡过程中尝试避免将任务移动到另一个 CPU...”(例如:完全公平调度器及其调优)。
当进程进入睡眠状态和唤醒时,它没有必要在同一个 cpu 上进行调度。如果你有多处理器环境,那么根据调度程序策略它将在任何 cpu 上进行调度。当进程进入睡眠状态时有不同的原因,它进入睡眠状态,因为它正在等待 io,任何资源。当事件发生时,它会从等待状态变为就绪状态。届时,哪个 cpu 将是空闲的调度程序将在空闲 cpu 上调度该进程。没有必要将安排在同一个 cpu 上。有关 linux 发布树路径中调度程序的调度程序开源代码的更多信息。