Диспетчер задач говорит, что система работает с более чем тысячей потоков

Я открыл диспетчер задач и посмотрел в области «Система» и увидел:

Темы: 1337

  • Потоки ядра и виртуальный адрес процесса
  • Так как у меня есть двухъядерный процессор с гиперпотоком (имеется в виду четыре потока), как можно иметь 1000+ потоков, когда на моем процессоре должно быть только четыре?

  • Почему мой Intel i7-920 отображает 8 ядер вместо 4 ядер?
  • Windows 100% CPU без видимых причин
  • Как работают многоядерные процессоры?
  • Что подразумевается под терминами CPU, Core, Die и Package?
  • Как предотвратить использование flash и javascript моего процессора?
  • Разница между графическим процессором и процессором
  • 3 Solutions collect form web for “Диспетчер задач говорит, что система работает с более чем тысячей потоков”

    Простой ответ заключается в том, что не все потоки выполняются одновременно. Для более полного объяснения, читайте дальше.

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

    Однако планировщик задач фактически не планирует приложения (процессы), он планирует потоки . Каждое приложение имеет хотя бы один поток, но потенциально может использовать большое количество потоков для разделения работы, которую она делает на связанные или независимые части. Например, для приложения обычно используется один поток, который обрабатывает пользовательский интерфейс, и создает другой поток, когда пользователь инициирует потенциально долговременную операцию (что может быть похоже на печать, пересчет электронной таблицы, среду разработки, выполняющую Поиск символа и т. Д.). Некоторые среды программирования вводят некоторое количество потоков, невидимых для программистов; Например, Java и .NET могут делать сборку мусора в отдельном потоке, который находится вне непосредственного контроля программиста. Некоторые программы создают несколько потоков на раннем этапе и объединяют их, потому что создание новых потоков – сравнительно дорогостоящая операция (так что вы не обязательно должны создавать поток каждый раз, когда вам это нужно). Все, что делает предварительный просмотр, обычно выполняется в отдельном потоке, поэтому остальная часть пользовательского интерфейса остается отзывчивой во время создания предварительного просмотра. И так далее. В совокупности все это означает, что количество потоков в системе в любое время может быть во много раз больше количества процессов.

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

    Количество потоков, которое вы видите в диспетчере задач, – это общее количество потоков в любом из этих состояний. Например, в системе Windows 7, которую я набираю, в настоящее время запущено около 70 процессов, но почти 900 потоков. Со всеми фоновыми процессами для обработки различных задач и того, как они, вероятно, подразделяются на множество потоков каждый, это не возмутительное число.

    Пойдя немного в глубину технической реализации, в самом ядре планировщика задач с предустановленной многозадачной операционной системой обычно есть своего рода аппаратный прерыватель. Это означает, что ядро ​​может остановить процессор, когда у него нет полезной работы (это почти наверняка является одной из причин, если не причина, почему Linux проверяет инструкцию HLT при загрузке на совместимых с IA-32 процессорах и, возможно, Выполняет аналогичные проверки на других архитектурах), безопасно в понимании того, что в какой-то разумной детерминированной перспективе будет прерываться прерывание, и будет вызываться планировщик задач. Поскольку прерывание срабатывает независимо от того, какую другую работу выполняет процессор (это идея прерываний), планировщик запускается регулярно и получает возможность определить, какой поток должен выполняться в течение следующего временного фрагмента. Поскольку коммутаторы контекста относительно дороги, обычно возможно (по крайней мере, через исходный код) настраивать, насколько агрессивно переключается планировщик между потоками; Более частое переключение потоков приводит к тому, что система становится более отзывчивой, но накладные расходы на переключение означают, что общее время завершения заданного набора задач больше. Самая быстрая система будет той, которая только переключается между потоками, когда работающий поток больше не может запускаться (что означает, что он блокируется в ожидании чего-либо или он завершил свое задание), поскольку это минимизирует накладные расходы, тогда как наиболее отзывчивая система переключается Между потоками каждый раз, когда вызывается планировщик, потому что это минимизирует среднее время ожидания до того, как конкретный поток получит процессорное время. Идеальная настройка обычно находится где-то между этими двумя, и компромисс между этими выборами, вероятно, является одной большой причиной того, почему Linux предлагает несколько планировщиков на выбор, а также некоторые параметры настройки через конфигурацию ядра.

    Совместно с многозадачными операционными системами и средами, с другой стороны ( Windows 3.x является одним из примеров), полагайтесь на каждое приложение, чтобы регулярно уступать управление планировщику. Обычно есть функция API, специально предназначенная для этого, и часто многие функции API будут выполнять ее как часть внутреннего потока выполнения, поскольку это помогает сделать пользователя более плавным. Такой подход к проектированию работает хорошо, если все приложения хорошо управляются и управляются кодами с короткими интервалами во время любых длительных операций (длительное значение более чем на небольшую часть секунды), но приложение, которое не может засориться Всей системы. Это одна из главных причин того, почему Windows 3.x плохо справлялась с тестом многозадачности, о котором я упоминал выше, в то время как OS / 2 весело прогуливалась по тому же решению на одном и том же оборудовании: приложение могло сказать, что дисковод гибких дисков записывает определенные Сектор и время, необходимое для этого, до того, как возвращенный вызов действительно может быть измеримым (от десятков до сотен миллисекунд или более); Система упреждающего многозадачности будет иметь свой планировщик в своем следующем запланированном вызове, обратите внимание, что поток, который в настоящее время «работает», фактически блокируется вызовом записи и просто переключается на другой поток, который запускается. (На практике это немного больше, но это общая идея.)

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

    Подумайте о четырех автомагистралях с 1037 автомобилями.

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

    То, что показывает ваш диспетчер задач, – текущая загрузка системы. То, что показывают ваши спецификации comp, – это то, сколько потоков (в интерфейсе) принято для параллельного выполнения. Не вдаваясь в различие между функциями hyperthreading и multicore, с более логичным интерфейсом, который будет восприниматься, система, как правило, будет работать лучше.

    Мы должны отступить и спросить себя: как компьютер с одним процессором имеет два потока?

    Темы – это программные объекты, а не аппаратные средства. Чтобы иметь другой поток, вам просто нужна память для объектов, составляющих поток, таких как структура дескриптора и стек.

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

    Из всех потоков, существующих в системе, только подмножество обычно находится в состоянии, которое обычно называется «runnable». Бегущие потоки хотят запускать: они либо выполняются, либо сидят в «очереди выполнения», ожидая отправки диспетчером. Потоки, которые не выполняются, «блокируются», ожидая получения некоторого ресурса или приема ввода или «спящего», который, как блокируется на входе, где «вход» – это время. «Переключатель контекста» имеет место, когда функция планировщика в операционной системе просматривает очередь выполнения процессора и выбирает другой поток для выполнения.

    Не путайте с помощью «hyperthreading» , который является именем Intel для конкретной аппаратной функции.

    Давайте будем гением компьютера.