Как потоки выполнения могут выполняться одновременно, когда есть планировщик потока?

1

Из определений, которые я читал:

потоки в основном представляют собой фрагменты кода, которые работают одновременно (в то же время).

Однако как они могут работать одновременно с существованием планировщика потоков?

Я читал, что планировщик потоков в основном выбирает случайный поток для запуска в определенный момент из пула потоков Runnable. Из того, что я получил, что в определенный момент времени, только один runnable поток действительно находится в состоянии выполнения (работает). (все это из учебного пособия SCJP Sun Certified Programmer). Кто-нибудь может это прояснить?

Действительно ли эти потоки работают одновременно?

  • 3
    Они работают одновременно на многоядерных процессорах. Но ядра все еще ограничены. Поэтому, когда потоков больше, чем ядер, некоторый экземпляр должен управлять тем, какой поток работает в любой момент.
  • 0
    Я все еще придерживаюсь этой концепции, но что является ядром?
Показать ещё 4 комментария
Теги:
multithreading
runnable
scheduler

5 ответов

2
Лучший ответ

Однако как они могут работать одновременно с существованием планировщика потоков?

Они не всегда работают одновременно, задание планировщика заключается в том, чтобы менять текущие потоки, чтобы они работали одновременно. т.е. слишком быстро для вас.

Планировщик использует временной срез, который составляет 0,1 мс. Вы можете видеть только мерцание 10 - 25 мс, поэтому это слишком быстро, чтобы вы могли видеть, но он быстро меняет потоки, поэтому появляется параллелизм.

например, вы не видите фильмы, перескакивающие с одного кадра на другой. Каждый кадр изменяется каждые 1/42 секунды секунды, поэтому вы думаете, что видите движение, когда на самом деле на высокоскоростную камеру экран будет выглядеть нервным.

Если у вас есть один логический процессор, весь поток заменяется на один процессор. Если у вас несколько логических процессоров, небольшой набор может быть запущен сразу, а остальным придется ждать.

0

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

Действительно ли эти потоки работают одновременно?

Да. Это верно, если машина имеет несколько ядер или нет. Какие параллельные средства немного меняются в зависимости от того, сколько ядер имеет машина. В частности, машины с несколькими ядрами могут выполнять параллельное выполнение. Таким образом, можно иметь параллелизм без параллелизма.

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

T1-T2-T3-...-TN-T1-T2-T3...TN-...
-------------Time------------->

Когда присутствуют несколько ядер, несколько процессоров или даже потоковые (так называемые HyperThreaded) процессоры, машина способна параллельно выполнять потоки. Это означает, что потоки действительно работают одновременно. Упрощенная визуализация того, что на основе системы, по-видимому, больше не нуждается в планировщике потоков, как вы предполагаете, выглядит так:

T1-T1-T1-T1-T1...
-----Time----->
T2-T2-T2-T2-T2...

Но здесь должна быть очевидная проблема, которая должна быть исправлена с помощью планировщика потоков даже в присутствии нескольких ядер. Можете ли вы угадать, сколько потоков работает одновременно, даже на компьютере, в основном используемом для игры в Интернете? МНОГО! В настоящее время нет технологии, позволяющей выделенные ядра, логические или другие, для каждого потока в системе. Итак, то, что мы имеем сегодня, - параллельный параллелизм. Упрощенный пример, основанный на совершенно справедливом планировщике с круговым движением, будет выглядеть так:

T1-T2-T3-...-TN-T1-T2-T3...TN-...
-------------Time------------->
T4-T5-T6-...-TM-T4-T5-T6...TM-...

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

Для дальнейшего чтения я бы предложил выбрать предполагаемую книгу для OS OS, в которой рассматриваются многие темы параллелизма/многопрограммного программирования.

0

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

Хотя это технически верно, в программировании полезно притворяться, что вы этого не знаете. Относитесь к потокам в Java, как если бы они выполнялись одновременно. Консолидные конструкции java являются абстракцией, поэтому вы можете эффективно запускать команды параллельно, не зная, что происходит на уровне операционной системы и ниже.

0

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

0

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

Тема 1

1-2-3-4-5

Тема 2

ABCDE

JVM переключался между выполнением двух потоков, может быть, что-то вроде этого:

1-АВ-2-3-С-4-ДЕ-5

Оба потока заканчиваются (или вокруг) в одно и то же время, если они происходят в одно и то же время, но на самом деле это не так. Обратите внимание, что я только что составил этот заказ, потому что он случайный и может отличаться на разных JVM или разных машинах, но я надеюсь, что вы можете понять, что я имею в виду. Как правило, JVM достаточно хорош, чтобы заставить его казаться многопоточным, чтобы он не имел никакого значения для программиста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню