Приложения пользовательского режима обычно не могут замедлять графический интерфейс вашей ОС. Однако ситуация не так однозначна, как кажется. Не существует ни одного приложения в пользовательском режиме, которое бы на 100% было пользовательским, либо из-за системных вызовов (особенно файловой системы), либо из-за сопоставления виртуальной памяти.
В большинстве случаев ОС не застревает в процессе работы процессора, она застревает в ожидании какого-либо ресурса ввода-вывода. Это особенно очевидно, когда вы исчерпываете физическую память и начинаете заходить в файл подкачки (хотя учтите, что ОС может свободно помещать память в файл подкачки, даже если имеется достаточно физической памяти). Windows обычно довольно умна в этом, но вполне возможно "сломать" это.
Если это действительно процессор, скорее всего, это из-за жадного драйвера (подавляющее большинство которого не написано Microsoft). Драйверы режима ядра освобождаются от упреждающей многозадачности (как из-за задержек, так и по причинам надежности), поэтому, если драйвер запускает второй длинный цикл на процессоре, вам не повезло, это не будет прервано.
Отличный и простой инструмент, чтобы увидеть кое-что из этого, - Process Explorer (из SysInternals), который показывает время ядра процессора (т. Е. Сколько работы процессора над ядром выполняется в ядре, а не пользователю). сами приложения). Windows 7 и более поздние версии также включают это в свой диспетчер задач (это красная линия на графиках использования процессора).
В общем, упреждающая многозадачность не избавляет разработчиков ОС от необходимости идти на компромиссы. Это всегда обходится дорого, а планирование задач действительно очень сложно (сейчас моя ОС манипулирует более чем 2000 потоками - это довольно много, и я ничего не делаю). Было бы лучше выделить потокам меньше времени и тратить больше времени на переключение контекста? Было бы лучше дать им больше времени, жертвуя латентностью?
Итак, проверьте, что делают жесткие диски. Проверьте, как используется ваша память. Проверьте время ядра. Это вполне вероятно покажет вам, почему Windows теряет отзывчивость, когда вы выполняете тяжелую работу. Некоторые из них можно исправить (освобождая память, ограничивая нарушителя памяти, выбирая привязку к процессору вручную ...), некоторые решаются простым обновлением драйверов (графические драйверы были довольно заметны по причинам, которые они вызывали, что, вероятно, сыграло свою роль в Windows, сбрасывая их из режима ядра в режим пользователя в последних версиях).
Кроме того, говоря о графическом процессоре, современные Windows используют ускорение графического процессора для визуализации графического интерфейса (на самом деле, в некоторой степени, так же, как и Windows XP). Если ваше приложение значительно облагает налогом GPU, это может также привести к медленной реакции Windows, особенно в Aero. Поскольку графические процессоры все чаще используются в качестве "гипер" процессоров GP, это может быть важно даже вне игр и тому подобного.
Еще одним серьезным нарушителем является плохо написанное многопоточное приложение. Кэширование памяти довольно легко убить, если вы делаете глупые вещи, а ОЗУ крайне медленное по сравнению с самим ЦП, поэтому без эффективного кеширования ЦП работает очень и очень медленно (даже если он в основном ожидает все время). Это еще сложнее на многоядерных ЦП (и многопроцессорных системах), поскольку для обеспечения согласованности многие многопоточные операции требуют аннулирования кэшированных данных (так что один ЦП не имеет доступа к "старому" значению переменная в памяти вне ее кеша / регистров). Все это невероятно быстро, но ... Процессоры быстрее. Намного быстрее. Что, конечно, также представляет проблемы разных поставщиков ЦП, которые по-разному обрабатывают одни и те же вещи, совершенно отдельно от гораздо более высокого уровня ОС. Современные процессоры (486+, так что да, это очень старая особенность, о которой многие программисты даже не подозревают) на самом деле сильно распараллелены, они больше не выполняют одну инструкцию за другой.
Таким образом, даже если ОС все делает идеально (очевидно, невозможный идеал), она все равно может остановиться из-за проблем с оборудованием и связи с оборудованием. Что хорошего в том, что у вас есть 4-ядерный процессор, когда ваше приложение полностью насыщает память R/W? Что хорошего в том, что у него быстрый жесткий диск, когда каждый считываемый байт должен проходить через процессор (помните PIO?). Каждая аппаратная операция, которая не использует прямой доступ к памяти, может потенциально остановить ваш процессор.
И теперь большая часть Windows работает как приложения пользовательского режима. И они также взаимодействуют с запущенными приложениями - если я попрошу, чтобы explorer.exe
что-то сделал для меня, он не может сделать ничего другого в это время. Если я отправлю миллиарду оконных сообщений в окно, оно оставит след.
Просто так много всего происходит, все время ... гарантии очень трудны. Обратите внимание, как быстро все становится быстрее, как только появляется экран «ctrl-alt-delete» - внезапно, как будто ничего не случилось :)