в моей многопоточной программе .net мне интересно все эти темы
работает на одном и том же процессе или на разных процессах?
Поток всегда выполняется в процессе, однако несколько потоков могут выполняться в одном процессе, и каждый поток может обрабатываться различным ядром.
Если у вас одно ядро, это не значит, что оно не может запустить несколько потоков, это просто означает, что ядро не может выполнить несколько потоков в в то же время. Если вы посмотрите на картинку выше, вы заметите, что:
- Поток # 1 выполняется в течение некоторого времени.
- Тема # 1 "останавливается".
- Поток # 2 выполняется в течение некоторого времени.
- Тема № 2 "останавливается".
- Поток # 1 снова выполняется в течение некоторого времени.
Это иллюстрирует, что происходит, когда ядро запускает несколько потоков: ядро выполняет только один поток за раз , но для запуска обоих потоков ядро должно выполнить переключение контекста . Другими словами: ядро запускает несколько команд из потока 1, переключается в поток 2 и запускает из него несколько команд, а затем переключается обратно в поток 1 для выполнения еще нескольких команд.
Жонглирование апельсинами:
Хорошая метафора - жонглирование апельсинами: технически у вас есть только две руки, и вы можете держать только один апельсин в каждой руке за раз, поэтому максимум, который вы можете держать, - это два апельсина. В этом случае налоговая часть содержит апельсины. Однако, если вы бросите апельсин в воздух, то вы можете удерживать третий апельсин, пока второй находится в воздухе. Чем выше вы бросаете апельсины, тем больше апельсинов вы можете жонглировать. Если быть более точным: чем дольше апельсин возвращается в вашу руку, тем больше апельсинов можно жонглировать. Конечно, вы не можете манипулировать огромным количеством апельсинов, потому что бросание апельсина требует больше энергии, чем просто его удержание.
По сути, ваш ЦП выполняет жонглирование потоков: чем дольше поток остается в стороне от выполнения кода на ЦП, тем больше потоков ЦП может «жонглировать». Если поток ожидает ввода-вывода (например, запрос к базе данных), тогда CPU может одновременно выполнить код другого потока. По этой же причине вы видите 54 процесса и 800 потоков в диспетчере задач: многие
из этих потоков делают вещи, которые не связаны с процессором.
Sleep:
мой процессор все время работает с этими 800 потоками, или только 800
потоки стоят в очереди, ожидая обработки процессором?
Многие потоки, которые вы заметили в диспетчере задач, простаивают / спят, поэтому они используют очень мало (если есть) ЦП. Однако те, которые работают , выполняются с переключением контекста (если потоков больше, чем ядер, что происходит в большинстве случаев). Есть много вещей, которые могут привести к тому, что поток будет бездействовать / спать, см. Пример с оранжевым жонглированием.
Загрузка ЦП:
если я хочу, чтобы моя многопоточная программа полностью использовала мой четырехъядерный процессор, могу
я поднимаю использование процессора, создавая больше потоков (кажется, противоречит
Тэрой, что только одна нить, одно ядро за раз)
Становится сложно :). Представьте себе, что вместо апельсинов у вас есть шары для боулинга: это ОЧЕНЬ обременительно для ваших рук, поэтому даже если вы попробуете, вы, вероятно, не сможете держать более 2 шаров для боулинга, не говоря уже о том, чтобы жонглировать третьим. При максимальной нагрузке вы можете удерживать столько предметов, сколько у вас есть руки. То же самое относится и к процессору: при максимальной нагрузке процессор может выполнять столько потоков, сколько имеется ядер.
Причина, по которой вы можете запускать больше потоков, чем количество ядер, заключается в том, что поток не оказывает максимальной нагрузки на ядра.Если ваши потоки связаны с процессором, то есть они выполняют вычислительные операции тяжелые и облагают ядром 100%, то вы можете запустить только столько потоков, сколько у вас ядер.Тем не менее, процессор - самая быстрая вещь в вашем компьютере, и ваш поток может получать доступ к другим частям вашего компьютера, которые значительно медленнее, чем ваш процессор (жесткий диск, сетевая карта и т. Д.), Поэтому вы можете запускать больше потоков.