【问题标题】:What is the Definition of Thread CPU Time?线程 CPU 时间的定义是什么?
【发布时间】:2012-11-20 22:07:38
【问题描述】:

我们如何为非本地线程定义“线程 CPU 时间”?更具体地说,它是如何在 JVM 上定义的(CPU 大概是从 JVM 中抽象出来的,因此定义可能与较低级别的进程略有不同)......

我正在使用此测量的 JVM 实现:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/management/ThreadMXBean.html,这似乎没有直接定义“线程 CPU 时间”是直接测量的。

【问题讨论】:

  • 实际上,除了给定线程消耗的 CPU 时间量之外,可能是什么?我不确定我是否理解这个问题。
  • 也许您正在考虑非本地线程。计算非本地线程的 CPU 时间可能很困难,因为 JVM(通常是任何进程)不知道它何时获得 CPU 时间(它可以知道它获得了多少,但是它无法计算使用了哪些线程它)。但是对于本机线程,操作系统会提供该信息。
  • 线程 cpu 时间是给定线程(在所有 cpu 上)花费的时间(用户 + 系统)。而且根据热点来源,Solaris是个例外,那里只测量用户时间。
  • 是的,这是一个很好的观点。它在真正的 CPU 中是一个非常明显的定义,但在非本机线程中它并不明显。我已经相应地更新了上面的问题。

标签: java multithreading time cpu


【解决方案1】:

线程 CPU 时间已经是一个非常通用的术语。基本上它代表 CPU 在给定线程上花费的时间。

它的定义没有任何不同,因为它在 JVM 上,唯一需要考虑的重要部分是 JVM 是否真的允许您测量它。有些会,有些不会。

【讨论】:

  • 是的,但问题是 - 花费了多少时间?如果一个线程拥有 CPU 但没有对它做任何事情怎么办?
  • 花费的时间是 CPU 给线程的任何时间。线程是否做“有用”的工作是无关紧要的。在一个while循环中旋转或计算前N个素数,仍然是不能给任何其他进程的时间。
  • 谢谢,这很有帮助——我想我的“真正”问题实际上可能是“如何”一个 java 程序知道真正的 CPU 给了它多少时间。
【解决方案2】:

不一定要打破抽象。 POSIX 确实指定了一种测量每个线程的 cpu 时间的方法。然后是 Windows :)

通过热点源搜索,我看到了:

hotspot/src/share/vm/runtime/os.hpp

  // JVMTI & JVM monitoring and management support
  // The thread_cpu_time() and current_thread_cpu_time() are only
  // supported if is_thread_cpu_time_supported() returns true.
  // They are not supported on Solaris T1.

hotspot/src/os/linux/vm/os_linux.cpp 我确实看到 pthread_getcpuclockid 以及 clock_gettime 被用于此目的

hotspot/src/os/windows/vm/os_windows.cpp 中,我看到使用了 GetThreadTimes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多