Есть ли в любом случае, чтобы выяснить Java Timeslice на окнах? - PullRequest
2 голосов
/ 13 сентября 2010

Я знаю, что потоки временных интервалов jvm, по крайней мере, в Windows. Могу ли я узнать, каков временный интервал по умолчанию, или изменить его?

Один из способов, о котором я подумал, - написать свой собственный циклический планировщик и запустить его как поток с высоким уровнем приоритета, чтобы он контролировал все остальные потоки. Будет ли это работать?

Ответы [ 2 ]

5 голосов
/ 13 сентября 2010

Фактически, если вы не используете JVM, которая использует «зеленые потоки», именно операционная система в конечном итоге выполняет распределение времени потока и планирование потока. Если вам нужно изменить расписание и т. Д., Начните с поиска средств, которые можно сделать в вашей операционной системе.

Один из способов, о котором я подумал, - написать свой собственный циклический планировщик и запустить его как поток с высоким уровнем приоритета, чтобы он контролировал все остальные потоки. Будет ли это работать?

Нет никаких гарантий. Это зависит от того, насколько реагирует планировщик потоков ОС на изменения приоритетов потоков.

Другие проблемы с этим подходом (корректировка приоритетов потоков):

  • это неизбежно сделает ваше приложение более специфичным для платформы в отношении взаимодействия между вашим планировщиком и планировщиком реального (черного ящика) потока,
  • будет очень сложно узнать, работает ли ваш планировщик эффективно, и
  • это усложнит отслеживание "heisenbugs" в вашем приложении.

Почему вы считаете, что это необходимо сделать?

1 голос
/ 26 июня 2012

Чтобы ответить на первую часть вашего вопроса.

Я думаю, что следующий тест может оценить временной интервал.Общая идея: запустить 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 миллисекунд.

«Термин« квант »- это единица измерения времени для каждого отрезка времени, в течение которого поток будет работать до тех пор, пока не произойдет« переключение контекста », и другой поток (либо внутри той же программы, либо из другой).Программа) выбрана для запуска. Это предотвращает монополизацию процессора процессором, связанным с процессором. В настоящее время в Windows 3 кванта равны либо 10 миллисекундам (один процессор), либо 15 миллисекундам (многопроцессорный Pentium). Это зависит от аппаратного обеспеченияУровень абстракции (HAL) выбран для вашего компьютера. HAL оригинального производителя оборудования (OEM) могут иметь другое значение. В настоящее время при выборе фоновых сервисов используются временные интервалы, которые фиксированы в 36 количествах (как вы могли бы выбрать при обычной установке сервера). "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...