2013-05-23 7 views
3

Мои заметки гласят, что существуют две основные категории алгоритмов планирования потоков, превентивный и временный обмен. Я хотел бы прояснить, как именно они работают на Java.Планирование потоков Java

Как я понимаю (и ПОЖАЛУЙСТА, исправьте меня, если я даже немного ошибаюсь!) Preemptive позволяет потоку с более высоким приоритетом брать процессор из потока с более низким приоритетом, когда он входит в состояние runnable. Будет ли он монополизировать процессор до тех пор, пока не появится поток с более высоким приоритетом, или он просто будет потреблять большую часть процессорного времени, но потоки с более низким приоритетом также получат возможность запуска? Я предполагаю, что нет вызовов методам, которые откажутся от процессора, например yield() или sleep().

Во время совместного использования поток более высокого приоритета получает большую долю времени процессора?

Я догадываюсь, что мое объяснение (ну, вопрос, который я поставил) для превентивного, не может быть прав, поскольку тогда это просто похоже на разделение времени! Но я хотел бы быть уверенным в деталях.

И я полагаю, как это все реализовано? Связаны ли JVM или OS с расписанием или зависит от реализации JVM?

+0

В интересах: http://stackoverflow.com/a/18311848/384464 – xagyg

ответ

1

Не эксперт по теме, но позволяющий нитке работать бесконечно, может привести к голоду. Вы по-прежнему уделяете более низкое приоритетное время. Я считаю, что совместное время дает все потоки в основном одинаковой суммы. These notes может немного помочь.

От сказал ноты:

невытесняющее Планирование: текущий процесс освобождает процессор либо заканчивающейся или путем переключения в состояние ожидания. (Используется в семье MS Windows)

  • Плюсы:
    • уменьшает время обработки
    • Не требует специального HW (например, таймер)
  • Против
    • Ограниченный выбор планирования алгоритм

Prefective Scheduling: текущий процесс должен непреднамеренно высвобождать CPU , когда более важный процесс вставлен в очередь готовности или после истечения назначенного времени процессора . (Используется в Unix и Unix-подобных системах)

  • Плюсы:
    • Нет ограничений на выбор алгоритма планирования
  • Cons:
    • Дополнительные накладные расходы (например, более частый контекст коммутация, таймер HW, скоординированный доступ к данным и т. д.)
4

Во-первых, я подозреваю, что ваши записи неверны, и должны быть не -preemptive по сравнению с разделением времени (который также известен как упреждающая). По крайней мере, так сложилось разбиение, когда я взял класс ОС несколько десятилетий назад, и я сомневаюсь, что он изменился.

В модели , но не в, в каждой нитке (/ процессе) предоставляется единственное использование процессора, пока оно явно не отступит от него. Это модель, которую вы найдете в однопользовательских операционных системах, таких как оригинальная Windows или Macintosh (а также множество миникомпьютерных систем, которые предшествовали им). Выполненный процесс мог явно указывать yield() на управление процессором, позволяя запускать другой поток/процесс. Конечно, есть много предостережений, особенно в отношении обработки прерываний, но я оставлю здесь описание.

В упреждающей, так называемой одноразовой модели операционная система может заставить поток/процесс выдать процессор (т. Е. «Упредить» его). Это может произойти в любом количестве мест, но в простейшем случае ОС вызывается на каждый тик часов и решает, какой процесс должен получить процессор для следующего тика часов. Снова упрощая, процесс с наивысшим приоритетом запускается; если существует несколько процессов с одним и тем же приоритетом, алгоритм с наименьшим числом запусков обычно решает.

Но независимо от того, для всех современных реализаций Java это ОС, которая решает, когда (и где) должен выполняться поток, а не JVM.

1

На самом деле нить представляет собой абстрактное понятие. Это просто атомный процесс, который должен быть выполнен. Атомным я подразумеваю процесс, который, если вы его остановите (например, потому что он слишком длинный, и вы хотите выполнить другой), вам нужно сохранить его текущее состояние и восстановить его раньше, чтобы продолжить выполнение процесса. Теперь, что в этом процессе зависит от того, кем вы хотите. В C, например, языке, который был разработан для создания ОС, если я хорошо помню, процесс в основном представляет собой программу. Эта программа может попросить систему запускать другие программы или развернуть себя для запуска клона (с помощью функции fork()). Независимо от того, является ли это другой программой или клоном, это в любом случае другой процесс, который должен выполняться атомарно. В C поток - это программа. В Java поток представляет собой класс, расширяющий Thread. В C вы запускаете поток/программу, выполняя свою функцию main(), в Java вы запускаете поток/класс, выполняя свой метод run(). То есть для концепции потока. Это просто общее имя для программы или экземпляра Thread, который выполняется.

В настоящее время компьютерам необходимо выполнять много вещей параллельно. Это позволяет управлять несколькими потоками одновременно. Здесь идет пул потоков: это список потоков для выполнения. Больше ничего. Простой список. Но с этим у вас есть планировщик: у вас есть определенное количество «процессоров», и вам нужно решить, какие потоки будут выполняться на них, но вы не можете выполнять больше потоков, чем у вас есть «процессоры». Стратегия планировщика должна быть сконструирована так, чтобы экономить как можно больше времени, и это зависит от содержимого и зависимостей потоков. Могут использоваться различные стратегии, такие как сбалансированное время выполнения, круглая ротация, приоритеты и т. Д.

Я поставил «процессоры» в кавычки, потому что я имею в виду здесь «вычислительные устройства». Это может быть физический процессор компьютера или CPU, который в настоящее время имеет от 2 до 8 ядер (что означает, что он может запускать 2-8 потоков одновременно) и выполнять инструкции CPU (как правило, RISC). Это могут быть процессоры графической карты или GPU, которые имеют несколько десятков или сотен ядер, но используют другой набор инструкций. Iit также может быть процессором с виртуальной машины Java или JVM, который может запускать только один поток и использовать собственный набор инструкций (байт-код).Основное различие между JVM и двумя предыдущими заключается в том, что CPU и GPU взаимодействуют напрямую с оборудованием без посредников, в то время как JVM переводит свой собственный байт-код в инструкции RISC и запрашивает CPU для их выполнения.

CPU использует свой собственный планировщик для выполнения своих потоков (блок RISC-инструкций, а не только один). Позвольте называть его «системным потоком». Но когда вы программируете на Java, ваша среда исполнения не является системой, а JVM, которая предоставляет вам абстракцию системы (так вы можете запускать программу Java на любой машине, не заботясь о системе внизу). Это означает, что вам не разрешено напрямую связываться с системой, поэтому Java предоставляет вам способ обработки потоков на своем собственном уровне, позволяя создавать потоки (новый Thread()) и предоставлять их планировщику (SwingUtilities, Исполнители и т. Д.). Как ваши потоки Java транслируются в потоки системы и как ваш планировщик Java используется для замены системного планировщика, является задачей JVM.

Итак, когда вы говорите о потоке в Java, вы не говорите о потоке на системном уровне. Это JVM, который будет взаимодействовать с системой, чтобы вы имели подобное поведение. Но ваш поток Java не управляется процессором, поэтому вы можете запросить определенную стратегию планирования независимо от стратегии планирования процессора.

Как выполняется планирование потоков в Java ?. Доступно с: https://www.researchgate.net/post/How_is_Thread_scheduling_in_Java_done [доступно 22 мая 2017 года].

1

Этот ответ найден на другом источнике ..im довольно confused.but размещение в любом случае. Я действительно не знаю спецификации Java или того, как фактически реализованы JVM. Но вот мои рассуждения об этом. Некоторые люди упомянули, что JVM может запускать только один поток в операционной системе и выполнять собственное планирование внутри JVM. Для меня это не имеет смысла, поскольку по сравнению с другим программным обеспечением, которое будет использовать несколько реальных потоков на уровне ОС, ваше программное обеспечение на Java будет иметь гораздо худшую производительность (в упрощенном виде каждый поток ОС будет получать одинаковое количество времени, а несколько Java потоки должны были бы делиться временем одного потока ОС).

Итак, более вероятно, что JVM запустит поток уровня ОС для каждого потока, созданного на Java. Тогда операционная система должна запланировать потоки. Указание приоритета потока в Java может отображаться по-разному для потоков ОС в зависимости от реализации JVM и возможностей операционной системы. Например, для Linux приоритеты сочетаются с циклическим планированием. В основном это зависит от количества времени, которое запланировано для потока. Временные срезы не должны иметь нулевой длины, что предотвращает полное голодание нити. Тем не менее, существует возможность использовать потоки реального времени в Linux (вероятно, недоступные из Java), чтобы ОС полностью не реагировала.

Я предполагаю, что спецификация Java упоминает планирование превентивного потока, поскольку существует много основных способов многопоточности: существует преимущественное планирование и совместная многопоточность. Для превентивной многопоточности вам нужна поддержка аппаратного обеспечения и операционной системы. С другой стороны, совместная многопоточность означает, что вам нужно будет вызвать функцию внутри вашего исходного кода, чтобы активно переключаться между потоками. Если ваш собственный исходный код не вызывает эту функцию, в совместной многопоточности ни один другой поток не может работать.

В ответ на один из ответов вы также спросили о пулах потоков. Обычно пулы потоков используются следующим образом: у вас есть пул с фиксированным числом потоков. Например, это может быть один поток на ядро. При создании пула потоков все потоки не имеют никакой работы. Теперь вы можете назначать задачи пулу. Затем пул будет использовать свои потоки, чтобы в конечном итоге обеспечить результат для каждой задачи. Преимущество этого заключается в том, что вы можете добавить в пул гораздо больше задач, чем в реальных потоках. Это простой способ не перегружать вашу систему слишком большим количеством потоков одновременно (используя один поток на одну задачу одновременно).Чтобы узнать больше об этом, вы можете искать «фьючерсы».

Как выполняется планирование потоков в Java ?. Доступно с: https://www.researchgate.net/post/How_is_Thread_scheduling_in_Java_done [доступно 22 мая 2017 года].

Смежные вопросы