Многопоточность: какой смысл в большем количестве потоков, чем в ядрах? - PullRequest
111 голосов
/ 27 июня 2010

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

Ответы [ 17 ]

2 голосов
/ 27 июня 2010

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

Процесс - это другое имя приложения.Как правило, процессы не зависят друг от друга.Если один процесс умирает, это не приводит к смерти другого процесса.Процессы могут взаимодействовать или совместно использовать ресурсы, такие как память или ввод / вывод.

Каждый процесс имеет отдельное адресное пространство и стек.Процесс может содержать несколько потоков, каждый из которых может выполнять инструкции одновременно.Все потоки в процессе используют одно и то же адресное пространство, но каждый поток будет иметь свой собственный стек.

Надеемся, что эти определения и дальнейшие исследования с использованием этих основ помогут вам понять.

1 голос
/ 27 июня 2010

Идеальное использование потоков - действительно, по одному на ядро.

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

Кроме того, типичные языки программирования затрудняют использование 1 потока на процессор.Языки, разработанные на основе параллелизма (такие как Erlang), могут упростить возможность не использовать дополнительные потоки.

1 голос

При разработке некоторых API у вас есть нет выбора , но вы можете запускать их в отдельном потоке (что угодно с операциями блокировки). Примером могут служить HTTP-библиотеки Python (AFAIK).

Обычно это не большая проблема, хотя (если это проблема, ОС или API должны поставляться с альтернативным асинхронным режимом работы, например: select(2)), потому что это, вероятно, означает, что поток будет спит во время ожидания завершения ввода / вывода. С другой стороны, если что-то делает тяжелые вычисления, у вас есть , чтобы поместить его в отдельный поток, скажем, в поток GUI (если вы не наслаждаетесь ручным мультиплексированием).

0 голосов
/ 03 ноября 2017

Я знаю, что это очень старый вопрос с множеством хороших ответов, но я здесь, чтобы указать на то, что важно в текущей среде:

Если вы хотите разработать приложение для многопоточности, вам не следует проектировать для конкретного аппаратного параметра. Технология ЦП развивается довольно быстро в течение многих лет, и число ядер неуклонно растет. Если вы намеренно проектируете свое приложение так, чтобы оно использовало только 4 потока, то вы потенциально ограничиваете себя в системе с ядром octa-core (например). Теперь даже 20-ядерные системы коммерчески доступны, поэтому такой дизайн определенно приносит больше вреда, чем пользы.

0 голосов
/ 26 августа 2011

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

0 голосов
/ 27 июня 2010

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

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

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

0 голосов
/ 27 июня 2010

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

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

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

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