5

Это открытый вопрос со многими возможными ответами, но, возможно, есть одна большая вещь, которую я упускаю из виду. Если нет, возможно, этот вопрос должен быть вики сообщества.


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

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

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

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

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

5 ответов5

5

Единственные вещи, которые действительно могут привести к зависанию одной из "современных многозадачных ОС":

  1. аппаратный сбой
  2. Процессор застрял в драйвере устройства (из-за 1 или плохого программирования)
  3. фатальное исключение в драйвере устройства или другом коде ядра (из-за 1 или плохого программирования)

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

Скорее всего, оболочка не отвечает. В Windows это explorer.exe . Вы можете попробовать следующее:

  • альтернативная оболочка Windows (Litestep и т. д.)
  • уничтожьте все файлы explorer.exe с помощью taskmgr.exe , затем запустите cmd.exe и выполните свои действия с помощью командной строки. Или запустите небольшую программу, предназначенную для запуска других программ.

explorer.exe - это одна из тех программ Windows, в которых много компонентов, которые можно подключить. Вот и посмотри как дела без этого.

3

Попробуйте Linux. Если вы на самом деле компилируете ядро, вы можете указать временной интервал. Также вы можете увидеть эффект preempt. Срез времени в 1000us лучше, если вы создаете сервер, который (вероятно) не будет иметь пользовательского интерфейса, о котором нужно беспокоиться (но он все равно будет превентивной многозадачной ОС). С другой стороны, 100us приведут к чрезвычайно отзывчивой системе. Большинство дистрибутивов имеют 100us на своих настольных ОС, что означает, что даже если мой ЦП на 100% использует все ядра, мой пользовательский интерфейс все еще отзывчив (вы можете попробовать).

2

Что касается Windows, то Windows 7 работает намного лучше, чем XP, когда дело доходит до такого рода вещей, поэтому я бы не согласился с вашим утверждением "все версии Windows". Но даже с XP, когда вы используете клиентскую версию ОС, Windows отдает приоритет перед приложением переднего плана (по умолчанию). Независимо от того, какая версия ОС, если все процессы застряли в ожидании одного и того же общего ресурса (может быть, ввода-вывода), все они будут вести себя без ответа.

Еще один способ решения этой проблемы: если explorer.exe занят в ожидании общего ресурса (включая время процессора), то сам рабочий стол / оконный менеджер будет вести себя без ответа. Аналогично для любых приложений, которые прямо или косвенно ожидают освобождения explorer.exe.

1

Приложения пользовательского режима обычно не могут замедлять графический интерфейс вашей ОС. Однако ситуация не так однозначна, как кажется. Не существует ни одного приложения в пользовательском режиме, которое бы на 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» - внезапно, как будто ничего не случилось :)

0

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

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

Почему я предлагаю сначала закрыть небольшие приложения ... Удаляя небольшие приложения в первую очередь, вы освобождаете виртуальную память с минимальной активностью диска и быстро очищаете компьютер. Если вы попытаетесь закрыть большое приложение, например, Firefox или Chrome, все они будут расширены. Это связано с тем, что большинство последних приложений имеют фоновые процессы, которые не исчезнут в течение долгого времени, потому что фоновые процессы также застревают, попадая в файл подкачки и выходя из него. Что еще хуже, они также оказываются с более низким приоритетом, им требуется еще больше времени для завершения их бизнеса, и весь объем виртуальной памяти, запрашиваемый приложением, должен ждать освобождения, пока все фоновые процессы и потоки не будут выполнены.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .