gpt4 book ai didi

multicore - 如何控制进程运行在哪个核心上?

转载 作者:行者123 更新时间:2023-12-03 05:48:05 29 4
gpt4 key购买 nike

我可以理解如何编写一个使用多个进程或线程的程序:fork()一个新进程并使用IPC,或者创建多个线程并使用这些类型的通信机制。

我也理解上下文切换。也就是说,操作系统只用一个CPU,为每个进程调度时间(并且有大量的调度算法),从而实现多个进程同时运行。

现在我们有了多核处理器(或多处理器计算机),我们可以让两个进程在两个单独的核心上同时运行。

我的问题是关于最后一个场景:内核如何控制进程在哪个核心上运行?哪些系统调用(在 Linux 中,甚至 Windows 中)在特定核心上调度进程?

我问的原因是:我正在为学校开展一个项目,我们将在其中探索计算领域的一个最新主题 - 我选择了多核架构。似乎有很多关于如何在这种环境中编程(如何观察死锁或竞争条件)的 Material ,但关于控制各个内核本身的 Material 却很少。我希望能够编写一些演示程序并呈现一些汇编指令或 C 代码,以实现“看,我在第二个核心上运行无限循环,看看 CPU 利用率的峰值”特定核心”。

有代码示例吗?或者教程?

编辑:澄清一下 - 很多人都说这是操作系统的目的,并且应该让操作系统来处理这个问题。我完全同意!但我要问(或试图了解)的是操作系统实际上做了什么来做到这一点。不是调度算法,而是更多“一旦选择了核心,必须执行哪些指令才能让该核心开始获取指令?”

最佳答案

正如其他人所提到的,处理器亲和性是特定于操作系统的。如果您想在操作系统的范围之外执行此操作,您会享受到很多乐趣,我的意思是痛苦。

也就是说,其他人提到了 SetProcessAffinityMask 对于 Win32。没有人提到 Linux 内核设置处理器关联的方法,所以我会提到。您需要使用 sched_setaffinity(2) 系统调用。这是a nice tutorial如何。

此系统调用的命令行包装器是 taskset(1) 。例如
taskset -c 2,3 perf stat awk 'BEGIN{for(i=0;i<100000000;i++){}}'限制繁忙循环的 perf-stat 在核心 2 或 3 上运行(仍然允许它在核心之间迁移,但仅限于这两个核心之间)。

关于multicore - 如何控制进程运行在哪个核心上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663958/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com