【问题标题】:Is there anyway to figure out the java timeslice on windows?无论如何要弄清楚Windows上的Java时间片吗?
【发布时间】:2011-04-11 10:46:42
【问题描述】:

我知道 jvm 对线程进行时间切片,至少在 Windows 上是这样。 无论如何我可以找出默认时间片是什么,或者更改时间片吗?

我想到的一种方法是编写自己的循环调度程序并将其作为高优先级的线程运行,并让它控制所有其他线程。这行得通吗?

【问题讨论】:

  • 你看过 JDK5 中的并发 api 吗?我同意 Stephen C 的观点,您为什么觉得有必要编写自己的调度程序?

标签: java multithreading time


【解决方案1】:

实际上,除非您使用的是使用“绿色线程”的 JVM,否则最终执行线程时间分片和线程调度的是操作系统。如果您需要修改调度等行为,请首先查看您的操作系统提供的执行此操作的工具。

我想到的一种方法是编写自己的循环调度程序并将其作为高优先级的线程运行,并让它控制所有其他线程。这行得通吗?

没有任何保证。这取决于操作系统的线程调度程序对线程优先级变化的响应程度。

这种方法(调整线程优先级)的其他问题是:

  • 这将不可避免地使您的应用程序在您的调度程序和真实(黑盒)线程调度程序之间的交互方面更加特定于平台,
  • 很难知道您的调度程序是否有效工作,并且
  • 这将使追踪应用程序中的“heisenbugs”变得更加困难。

为什么你认为有必要这样做?

【讨论】:

    【解决方案2】:

    回答您问题的第一部分。

    我认为下面的测试可以估计时间片。总体思路:启动 N 个线程(N > Runtime.getRuntime().availableProcessors() )运行在以下循环中:

        public void run() {
            long warmUp = 20000;
    
            long milli0 = System.currentTimeMillis();
            long nano0 = System.nanoTime();
            while (true) {
                long milli1 = System.currentTimeMillis();
                long nano1 = System.nanoTime();
                if (warmUp > 0) {
                    warmUp--;
                } else {
                    if (nano1 < nano0) {
                        log("WARNING: Nanotime goes back by " + (nano1 - nano0) + " ns");
                        warmUp = 20000;
                    } else
                    if (nano1 - nano0 > SPIKE) {
                        log("WARNING: Nanotime gap: " + (nano1 - nano0)/MILLIS_PER_NANO + " ms. System time delta: " + (milli1 - milli0) + " ms.");
                        warmUp = 20000;
                    }
    
                }
                nano0 = nano1;
                milli0 = milli1;
            }
        }
    

    结果很大程度上取决于平台。在我的 Windows 2008 Server 上,我得到 5-15 毫秒。

    "The term "quantum" is a unitless measure of time for each time slice that a thread will run until a "context switch" occurs and another thread (either within the same program or from within another program) is selected to run. This prevents a CPU-bound process from monopolizing the processor. Currently in Windows, 3 quantums are equal to either 10 milliseconds (single processor) or 15 milliseconds (multiple-processor Pentium). This depends on the hardware abstraction layer (HAL) selected for your computer. Original Equipment Manufacturer (OEM) HALs may have a different value. Time slices that are fixed at 36 quantums are currently used when background services are selected (as you might choose in a typical server installation)."

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多