当前位置: 首页 > 面试题库 >

如何查看线程在哪个CPU内核中运行?

上官季
2023-03-14
问题内容

在Linux中,假设线程的pid为[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息。例如,这些proc文件/ proc /
[pid] / status,/ proc / [pid] / stat和/ proc / [pid] /
schedstat都是有用的。但是,如何获取线程正在运行的CPU核心号?如果线程处于睡眠状态,我如何才能知道线程在再次调度后将在哪个内核上运行?

顺便说一句,有没有一种方法可以转储每个CPU内核的正在运行和正在hibernate的任务的进程(线程)列表?


问题答案:

任务不会睡在任何特定的内核中。而且调度程序不会提前知道它将在哪个内核上运行线程,因为这将取决于这些内核的未来使用情况。

要获取所需的信息,请查看/ proc / / task / / status。如果线程正在运行,则第三个字段将为“
R”。从最后一个字段开始的第六个将是线程当前正在运行的核心,或者如果线程当前未在运行,则它将最后运行(或已迁移到)该核心。

31466(bc) S 31348 31466 31348 34819 31466 4202496 2557 0 0 0 5006 16 0 0
20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839
140737264235072 140737264232056 217976807456 0 0 0 137912326
18446744071581662243 0 0 17 3 0 0 0 0 0 0

当前未运行。最后一次运行在核心3上。

31466(bc) R 31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0
20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839
140737264235072 140737264231824 4235516 0 0 0 2 0 0 0 17 2 0 0 0 0

当前在核心2上运行。

要了解其余字段的含义,请查看Linux内核源代码-
尤其是或中的do_task_stat函数。fs/proc/array.cDocumentation/filesystems/stat.txt

请注意,所有这些信息在您获得时可能已过时。在您open在proc中对该文件进行调用与该调用返回之间的某个时间点是正确的。



 类似资料:
  • 问题内容: 我想用Java解决带有多个线程的数学问题。我的数学问题可以分为多个工作单元,我想通过几个线程来解决。 我不希望有固定数量的线程在工作,而是与CPU核心数量匹配的线程数量。我的问题是,为此我在互联网上找不到简单的教程。我发现的只是带有固定线程的示例。 如何才能做到这一点?你能提供例子吗? 问题答案: 你可以通过使用静态运行时方法,确定提供给Java虚拟机的进程数availableProc

  • 问题内容: 有人可以提供解释,说明当JVM仅是Linux上的单个进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有内核?有没有很好的深入文章详细介绍了该主题? 编辑#1 :我不是在寻找有关如何在Java中实现多线程程序的建议。我正在寻找有关JVM如何在Linux / Windows上内部管理以使用多个内核而仍是OS上的单个进程的解释。 编辑#2 :我设法找到

  • 我在Android Studio / Gradle中寻找一个参数或配置,它可以设置构建,以便在构建期间使用我所有的CPU核心。例如,如果我有一个四核CPU,每个核心运行8个线程,我如何优化构建,以便它将使用它可以获得的每个资源(当然是并行的)? 非常感谢。

  • 问题内容: 假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程: 运行,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序。最好将jstack的输出重定向到文件。 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。 重复步骤1和2

  • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在

  • 所以从一开始:当计算机启动时,引导线程(通常是处理器0中核心0中的线程0)就开始从地址0xFFFFFFF0中提取代码。所有剩下的CPU/核都处于特殊的Hibernate状态,称为等待-SIPI(WFS)。 然后,在OS加载后,它开始管理进程,并在CPU/核之间调度它们,通过高级可编程中断控制器(APIC)向WFS中的每个线程发送一个特殊的处理器间中断(IPI)(启动IPI)。SIPI包含该线程应该