Подтвердить что ты не робот

Нам действительно нужны все эти 1000 потоков?

Используя новый новый диспетчер задач в Windows 8, я заметил что-то, что для меня стало сюрпризом, в текущем/текущем потоке, где около 1k.

Так как ive просто резонансно коснулся учебников и теории многопоточного программного обеспечения и игр. Я предположил, что если вы хотите получить максимальную производительность из своего программного обеспечения, у вас всегда должен быть хотя бы один поток на каждый логический процессор, когда есть работа. Поскольку этот процессор в противном случае был бы "неиспользуемым".

Но, увидев, что я уже работает около 1000 потоков, не будут ли все процессоры работать над чем-то уже?

Почему многопоточность, если вычислительная мощность уже используется другими 50 процессами? Не будет ли управлять всеми этими 1000 потоками достаточно cpu? Почему я должен как программист обрабатывать потоки, а не оперативную систему? Если каждый поток будет обрабатывать один поток, не будет ли мое программное обеспечение "мулитированным"?

Использует больше потоков только более удобный способ определения приоритетов процессов?

4b9b3361

Ответ 1

Я бы сказал, наверное, нет. Хотя этот вопрос немного риторический, взгляните на этот фрагмент статьи/книги Джеффри Рихтера, Остановите безумие (из книги CLR через С#). В нем обсуждаются только те вещи, которые вы задаете.

Если бы все, о чем мы заботились, это сырая производительность, то оптимальное количество потоков для на любой машине идентичен количеству процессоров на этом компьютере. [...] Все потоки все еще имеют объект ядра, стек ядра, и другие ресурсы, выделенные им. Эта тенденция создания потоков волей-неволей, потому что они дешево приходится останавливаться; нити не дешевы - скорее, они дороги, поэтому используйте их с умом.

Я очень рекомендую эту книгу. Ну стоит читать спереди назад, хотя он довольно большой, ~ 900 страниц.

Многопоточность, хотя и очень сложная тема, и ее нельзя легко ответить всего несколькими строками, она сильно зависит от того, чего вы пытаетесь достичь. Как всегда, это зависит, и вы должны измерять/оценивать/оптимизировать любое решение, чтобы получить оптимальную производительность. Тем не менее, просто рутинное изложение потоков, вероятно, не является хорошей идеей в целом. В качестве побочного примечания управляемый поток выделяет 1 Мб памяти стека, что означает, что создание (и сохранение на) потоков в приложении .NET может быть очень расточительным.

Кроме того, только потому, что протектор существует, это не означает, что он потребляет полное ядро. Он может выполнять некоторую работу, но он также может сидеть без дела и ждать, пока какая-то работа будет работать (это наиболее вероятный случай, в противном случае ваше общее потребление ЦП будет постоянно ближе к 100, чем 0). Тем не менее, они потребляют или, более правильно, ресурсы системы отходов.

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

Короче говоря, вы можете сказать: "Не используйте несколько потоков, если у вас нет причин".
Даже тогда t (h) легко читается.

Ответ 2

Мне нравится ответ Jokob, и я чувствую, что большинство важных моментов уже сделано:

  • 1k нитей (глобально) не означает, что они полностью запущены: они могут быть ВСЕ, сидящими в ожидании.
  • В общем, размышление о глобальном числе потоков в системе очень вводит в заблуждение (см. пояснение ниже).
  • Режимы (не только) используются для параллельного программирования: они используются в ситуациях, когда вам требуется более одной строки выполнения (например, когда вы блокируете ожидание сетевого ответа, но вам все равно необходимо обновить интерфейс и держать его отзывчивым или когда у вас задачи с низким приоритетом (проверка орфографии, проверка кода,...) в том же процессе...). В конце концов, потоки существовали и были полезны задолго до многоядерных процессоров!
  • Теперь, однако, мы часто видим "безумие": слишком много потоков. Это не ново: один из первых случаев, когда ранние сетевые (web?) Серверы: один поток для каждого соединения (!). Глупый, расточительный. Мы продолжили работу, и теперь мы используем threadpool (и более совершенные вещи, такие как порты завершения ввода/вывода) и (совсем недавно) асинхронное программирование.

Однако даже в случае threadpools количество потоков зависит от каждого процесса (если вы не используете системный threadpool, доступный из Windows2000); поэтому, если у вас есть 50 процессов, каждый из которых хочет извлечь максимальную выгоду из четырехъядерной системы, у вас есть глобальное разумное число из 200 потоков (и, как правило, в потоковых пулах есть оптимальное число вокруг 2X ядер, чтобы взять блок ввода-вывода и подождите счёт).

Это естественно, вы должны думать о каждом процессе, а не об ОС. Подумайте, что произойдет, если вы используете централизованный поток с жестким пределом для всех процессов. Предположим, что одно приложение принимает все из них: какой у вас выбор? Нет, у вас не может быть жесткого предела ОС. Каждое приложение в основном само по себе. Это модель, обеспечиваемая "современными" (1990-е годы) ОС на основе отдельных процессов и виртуального, частного адресного пространства, такого как NT и Linux: вы одиноки в ОС и не должны заботиться о других (иногда это сильно принудительно, как в случае с памятью)

Ответ 3

Чтобы быть простой, операционная система делает все приложения такими, как будто они работают на компьютере (компьютере). Например, 32-битное приложение теоретически имеет 4 ГБ памяти, а физический компьютер - 2 ГБ. Os использует такие методы, как мультиплексирование с временным разделением, чтобы обеспечить это. С помощью этого механизма вы можете наблюдать этот поток 1K. (Я видел 72 КБ на терминальном сервере с 28 подключенными пользователями). Поскольку создание потоков - это дорогостоящие программисты, создающие потоки один раз, и они заставляют их спать, когда задача выполняется через механизм, такой как мьютекс, семафор...

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