Потоки Java и количество ядер

У меня просто был быстрый вопрос о том, как работают процессоры и потоки. Согласно моему текущему пониманию, ядро может выполнять только 1 Процесс за раз. Но мы можем создать пул потоков(скажем, 30) с большим числом, чем количество ядер, которыми мы располагаем (скажем, 4), и запустить их одновременно. Как это возможно, если у нас есть только 4 ядра? Я также могу запустить программу 30 thread на своем локальном компьютере, а также продолжать выполнять другие действия на своем компьютере например, смотреть фильмы или просматривать интернет.

Я где-то читал, что планирование потоков происходит, и это дает иллюзию, что эти 30 потоков выполняются одновременно 4 ядрами. Это правда, и если да, может ли кто-нибудь объяснить, как это работает, а также рекомендовать хорошее чтение?

заранее спасибо за помощь.

3 ответов


процессы против потоков

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

параллелизм против параллелизма

когда два потока работают в параллельно, они оба работает в то же время. Например, если у нас есть два потока, A и B, то их параллельное выполнение будет выглядеть так:

ПРОЦЕССОР 1: A ------------------------->

CPU 2: B ------------------------->

когда два потока бег!--11-->по совместительству, их исполнение совпадения. Перекрытие может происходить одним из двух способов: либо потоки выполняются одновременно (т. е. параллельно, как указано выше), либо их выполнение чередуется на процессоре, например:

ПРОЦЕССОР 1: A -----------> B ----------> А -----------> B ---------->

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

планирование

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

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

логические vs физические ядра

согласно моему текущему пониманию, ядро может выполнять только 1 Процесс за раз

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

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

может кто-нибудь объяснить, как это работает, а также рекомендовать некоторые хорошие чтения на это?

Я бы порекомендовал Концепции Операционной Системы если вы действительно хотите понять, как процессы, потоки и планировать все вместе.


короче говоря, ваше понимание ядра является правильным. Ядро может выполнять 1 поток (он же процесс) одновременно.

однако ваша программа не действительно запустить 30 потоков сразу. Из этих 30 потоков только 4 работают одновременно, а остальные 26 ждут. Процессор будет планировать потоки и давать каждому потоку отрезок времени для запуска на ядре. Таким образом, CPU заставит все потоки работать по очереди.

общий заблуждение:

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

FALSE: наличие большего количества потоков будет не всегда сделать вашу программу работать быстрее. Это просто означает, что CPU должен делать больше переключения, и на самом деле, слишком много потоков заставит вашу программу работать медленнее из-за накладных расходов, вызванных отключением всех различных процессов.


Java не выполняет резьба планирование, Он оставляет это на Операционные Системы для выполнения планирования потоков.

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

ядро может выполнять только 1 Процесс за раз

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

Как это возможно, если у нас есть только 4 ядра? Я также могу запустите мою программу 30 thread на моем локальном компьютере, а также продолжите выполнять другие действия на компьютере

Это возможно из-за многозадачность (т. е. параллелизм). Допустим, вы запустили 30 потоков, а ОС также работает 50 потоков, все 80 потоков будут делиться 4 ядрами процессора, получая фрагмент времени процессора один за другим (по одному потоку на ядро за раз). Что означает, в среднем каждое ядро будет работать 80/4=20 потоков одновременно. И вы почувствуете, что все потоки / процессы работают одновременно.

может кто-нибудь объяснить, как это работает

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

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

Примечание: вы также можете исследовать на актеры что еще абстрагирование за нити. Такие языки, как Erlang, Scala и т. д., используют актеров для выполнения задач. Один поток может иметь сотню акторов; каждый актер может выполнять разные задачи (похожие на потоки в java).

Это очень!--1-->обширная и активная тема исследования и есть много вещей, чтобы учиться.