Выполнение потоков на одноядерных и многоядерных - PullRequest
0 голосов
/ 09 сентября 2018

Это то, что я вижу в документации Oracle и хотел бы подтвердить мое понимание ( источник ):

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

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

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

один поток фактически выполняется в любой момент

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

Таким образом, несколько процессов могут работать на одном ядре.

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

В то же время, конечно, несколько потоков могут работать параллельно на разных ядрах.

0 голосов
/ 09 сентября 2018

Означает ли это, что в одноядерном компьютере только один поток может быть выполнен в данный момент?

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

И означает ли это, что на многоядерной машине в данный момент может выполняться несколько потоков?

Ну да, вы можете выполнять любое количество потоков на любом количестве ядер, при условии, что у вас достаточно памяти, чтобы выделить стек для каждого из них. Очевидно, что если каждый поток интенсивно использует ЦП, он перестанет работать, когда число потоков превысит количество ядер.

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