C: Как многопоточная программа может работать быстрее, чем многопоточная на одном и том же ядре? - PullRequest
1 голос
/ 12 августа 2011

У меня есть сервер и клиентская программа.Серверная программа все время работает в ожидании запросов от клиентов.Чтобы сервер мог ответить каждому клиенту, требуется 5 секунд с помощью функции sleep ().

В многопоточной версии, если я вызываю двух клиентов одновременно, для каждого * 1004 требуется около 5 секунд.* чтобы получить ответ.В этом же тесте 5 секунд для первого клиента и 10 для второго клиента в не многопоточной версии.Нечто ожидаемое, очевидно.Хотя есть некоторая проблема.Процессор представляет собой одноядерный Athlon!

Как многопоточный серверный модуль может работать быстрее, чем не многопоточный, если ядро ​​на процессоре только одно?

Ответы [ 7 ]

7 голосов
/ 12 августа 2011

Потому что вы имитируете «работу», когда спите.Так что планировщику нужно перевести только один поток в спящий режим на 5 секунд;после этого можно «обслуживать» другой поток .

Короче говоря, вы не используете процессор, поэтому теоретически вы могли бы обслуживать множество клиентов таким образом.Теперь, если вы будете делать что-то с процессором в течение 5 секунд, вы увидите разницу.

То же самое произойдет, если "работа" будет I/O.Поскольку процессор на самом деле не задействован, многие потоки работают одновременно.

5 голосов
/ 12 августа 2011

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

From wiki :

В информатике поток выполнения - это наименьшая единица обработки, которая можетбыть запланировано операционной системой.

4 голосов
/ 12 августа 2011

Чтобы сервер мог ответить каждому клиенту, требуется 5 секунд с помощью функции sleep ().

Два потока могут одновременно находиться в спящем режиме.Сон не занимает всего ядра ...

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

«Одноядерный» означает просто «одну операцию с ЦП за один раз» (при условии отсутствия гиперпоточности), а не «одну общую операцию за один раз».

3 голосов
/ 12 августа 2011

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

2 голосов
/ 13 августа 2011

Темы как люди.Предположим, вам нужно вырыть яму, у вас есть одна лопата, и это займет два часа.Рабочий может копать в течение 1 часа, но затем должен спать в течение 5 часов.Если вы нанимаете одного или двух рабочих?

Один рабочий может копать в течение 1 часа, спать в течение 5 часов, копать в течение 1 часа, спать в течение 5 часов, в общей сложности 12 часов.С двумя работниками один может копать в течение часа и идти спать, затем второй может копать в течение часа и также спать, пока первый спит.Таким образом, общее время составляет 7 часов, прежде чем они оба проснутся и будут готовы к другой работе.

2 голосов
/ 12 августа 2011

Сон ничего не делает.

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

Если бы у вас было это на самом деле, что-то делало в течение 5 секунд (очень длинный цикл или чтение с диска), это бывернитесь к 10 секундам.

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

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

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

...