Программирование потоков на уровне пользователя - несколько потоков ядра? - PullRequest
0 голосов
/ 19 августа 2011

Многие языки программирования, такие как C ++ (библиотека posix) и Java, позволяют воспроизводить потоки пользовательского уровня. Однако, если все эти потоки пользовательского уровня выполняются в одном потоке ядра - у вас только иллюзия мультипрограммирования или многопроцессорности (если доступно несколько процессоров), верно? Я имею в виду - все эти потоки работают в одном и том же потоке ядра. Правильно ли я это сказал? И если да, то как именно мы планируем повысить производительность, используя потоки на уровне пользователя?

РЕДАКТИРОВАТЬ: Я полагаю, что производительность не была бы возможна на модели многие-к-одному (потоки уровня пользователя для сопоставления потоков ядра). Таким образом, в модели «многие ко многим» улучшение производительности возможно только в том случае, если поток уровня ядра отключается. Поэтому мой вопрос заключается в том, что даже если потоки уровня пользователя имеют низкие накладные расходы, я не могу реально представить улучшение производительности, а также планирование потоков уровня ядра.

РЕДАКТИРОВАТЬ 2: По сути, это то, что я пытаюсь проверить - «Предположим, что на компьютере установлено 4 процессора. Теперь, скажем, моя программа работает только один раз, и она разветвляется на 4 потока, каждый из которых выполняет совершенно независимые действия. если сопоставление, скажем, один к одному (сопоставление пользователя с ядром), я действительно могу получить идеальное ускорение в 4 раза. Однако, если, скажем, (по какой-то причине) все 4 пользовательских потока отображаются в одно и то же пространство потоков ядра - тогда ускорения не происходит из-за многопроцессорности. Это потому, что, хотя у меня есть 4 потока уровня пользователя - они работают в одном и том же пространстве ядра и не могут быть разделены на 4 ядра.

1 Ответ

1 голос
/ 19 августа 2011

Нет, вы просто не правы.

В большинстве случаев использование posix для C / C ++ или реализации Thread для Java для создания и запуска потоков означает, что базовая реализация пользовательского пространства запускает реальные потоки в пространстве памяти одного процесса.Это означает, что запуск 4 потоков на машине с 4 ЦП дает вам реальное ускорение в 4 раза - конечно, если все правильно написано, а сама ОС не каким-то образом заблокирована (не предотвращена) от балансировки использования потоков 2-CPU.

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

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