Я играл в Hypnospace Outlaw, игру о ретро-тематической ОС. У этой ОС есть особенность: при загрузке веб-страницы, если пошевелить курсором мыши, страница загрузится быстрее.
Это напомнило мне кое-что. Когда я был молод, если я правильно помню, у Windows 95 (если не 98) было такое странное поведение, что при установке программ шевеление курсора мыши ускоряло процесс. Чем это было вызвано? Я искал это в гугле, но не смог найти ничего связанного.
Извините за нечеткое объяснение.
Это связано с недостатком в том, как Windows 95 генерирует события, и с тем, что многие приложения управляются событиями.
Приложения Windows 95 часто используют асинхронный ввод-вывод, то есть они просят выполнить какую-либо файловую операцию, например, копирование, а затем сообщают ОС, что они могут быть переведены в спящий режим до завершения этой операции. В состоянии сна они позволяют другим приложениям работать, а не тратить время процессора на бесконечные запросы о том, завершилась ли файловая операция.
По не совсем понятным причинам, но, вероятно, из-за проблем с производительностью на маломощных машинах, Windows 95 имеет тенденцию собирать сообщения о завершении операций ввода-вывода в пакет и не сразу будит приложение для их обслуживания. Однако она будит приложение для ввода данных пользователем, предположительно для того, чтобы оно было отзывчивым, и когда приложение бодрствует, оно также обрабатывает все ожидающие сообщения ввода-вывода.
Таким образом, шевеление мышью заставляет приложение быстрее обрабатывать сообщения ввода-вывода и быстрее устанавливать. Эффект был достаточно выраженным; большие приложения, установка которых могла занять час, можно было сократить до 15 минут при соответствующем управлении мышью.
Да, это реальный эффект, приводящий к заметному ускорению, и его можно воспроизвести по желанию:
Попробуйте открыть большой файл с помощью Блокнота на современной машине. Окно не должно быть полноэкранным. После загрузки выделите весь текст с помощью мыши (клавиатура тоже работает, просто требуется больше ручной сноровки). Удерживая кнопку нажатой (и делая пометку), перемещайте мышь вниз, чтобы текст был помечен и прокручен. Теперь сравните скорость прокрутки при удержании мыши и при ее движении. В зависимости от вашей машины скорость может быть в несколько раз выше.
Удивительно, не правда ли?
Это можно наблюдать и во многих других программах, Notepad - просто легко воспроизводимый пример. Это связано с тем, как работала многозадачность в ранних версиях Windows. Здесь все вращалось вокруг очереди сообщений. Шевеление мышью приводило к потоку сообщений о движении мыши, что, в свою очередь, заставляло программы просыпаться чаще и (в зависимости от их структуры) каждый раз обновлять свои состояния, снова попадая в цикл сообщений, давая время на обновление экрана, что в целом приводило к более быстрой реакции. Здесь показан один из способов, которые MS использовала для того, чтобы сделать Windows достаточно отзывчивой, несмотря на ее кооперативную потоковую природу.
Это была не только Windows 95, но и Windows 3.x, хотя они работают совсем по-другому.
Другие ответы говорят об упреждающей многозадачности, поэтому давайте сначала уточним это:
Window 3.x использовал совместную многозадачность, когда каждое приложение выпускало cpu для других приложений, чтобы использовать его. Windows 95 использует упреждающую многозадачность, когда каждому приложению выделяется временной фрагмент.
Ответ связан с тем, как работает графический интерфейс: в графическом приложении Windows есть цикл, называемый «насос сообщений»:
Каждое событие (мышь перемещается, окно изменяется и т. Д.) Выталкивается в очередь. Приложение отвечает за проверку наличия сообщений и, если да, затягивает их и обрабатывает.
Именно в этот момент Windows 3.x переключалась на другие приложения, поскольку была единственная точка, в которой находились все приложения, но это не относится к Windows 95.
Что на самом деле происходит, так это, на обеих ОС, Вам нужно обработать цикл сообщений, но если вы хотите обновить что-то в фоновом режиме, как задача, обновление дисплея, так далее, ты и № 39;d установите таймер, и таймер будет помещать сообщение в очередь с регулярным интервалом.
Это были лучшие способы сделать что-то в Windows 95, но разработчикам потребовалось время, чтобы перейти с Windows 3.x, и многие приложения были структурированы одинаково.
Поскольку основной механизм должен был полагаться только на цикл сообщений, а фоновые операции выполнялись с помощью сообщений таймера, перемещение мыши вызывало множество сообщений, перемещало приложение в приоритетном порядке, пробуждало приложение и заставляло приложение обрабатывать сообщения фоновых задач. Не перемещая мышь, сообщения таймера будут считываться только с довольно медленным интервалом.
Самым известным приложением для этого был дефрагментатор диска, где операции будут ждать сообщения для обновления графического интерфейса! так что встряхивание мыши ускорит дефрагмент.
Причина в том, что WM_TIMER
по умолчанию ограничен интервалами в 15,6 мс. Если вы вызываете SetTimer ()
с интервалом 1 мс, он все равно будет вызываться с интервалом 15,6 мс. WM_TIMER
использует много вещей в приложениях Win32, таких как обработка сетевых пакетов и тому подобное.
Перемещение мыши приводит к тому, что события WM_TIMER
чаще запускаются на Win95. Таким образом, некоторые приложения будут работать быстрее.
Значение 15,6 мс было установлено по разным причинам: не засорять очередь событий, чтобы такие вещи, как «WM_PAINT», все еще отправлялись достаточно часто, а в последнее время и, что важно, чтобы сохранить власть. Есть тонны статей, говорящих об этом:
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
У Рэймонда Чена из Microsoft есть отличный ответ [в его блоге](https://devblogs.microsoft.com/oldnewthing/?р = 36423):
Одна опасность функции
MsgWaitForMultipleObjects
звонит, когда уже есть сообщения, ожидающие подлежит обработке, потому чтоMsgWaitForMultipleObjects
возвращается только тогда, когда в очереди появляется новое событие.
Его блог отлично читается!
Возможно, это распространенная ошибка в раннем программном обеспечении, основанная на цикле обработки событий, а не на ошибке Windows: если некоторые DD-пути цикл обрабатывает только одно событие, затем каждый раз, когда два события генерируются одновременно, обрабатывается только одно, а другое застревает. Перемещение мыши генерирует больше входящих событий и перезапускает цикл. События «Mouse move» обычно обрабатываются библиотекой GUI, которая обрабатывает их правильно (то есть обрабатывает все такие события в очереди), поэтому эти события помогают запустить цикл, а затем безвредно исчезают.
Такие ошибки легко пропускаются, когда тестирование выполняется вручную, поскольку сам процесс тестирования генерирует достаточно входных событий, чтобы скрыть ошибку.
Быстрый ответ, перемещая курсор, вы говорите Windows, что вы - самое важное событие в процессе. Когда вы прекращаете взаимодействие, окна отдают приоритет другим событиям. Таким образом, установка программ, даже если они находятся на переднем плане, будет отдавать приоритет менее важным событиям. Эта ошибка больше не присутствует в текущих версиях Windows.
Windows pre-NT (Windows 1,2,3,3.11,95,98) была кооперативной многозадачностью по сравнению с NT's (2000, XP, Vista, 7 & 10) вытесняющей многозадачностью.
При кооперативной многозадачности приложение на переднем плане должно уступать управление другим задачам. Таким образом, если приложение на переднем плане застревало, вся машина зависала.
При вытесняющей многозадачности система обычно имела аппаратное прерывание, обычно таймер, для принудительной передачи управления.
В Windows 95 клавиатура и мышь генерировали прерывания, перемещение мыши вызывало срабатывание прерывания, и ОС обслуживала очередь событий. Форма вытесняющей многозадачности, вместо фиксированного прерывания по таймеру это делали вы.
ОС обновляла статус на экране в момент прерывания, а затем шла обслуживать другие задачи. Обновление экрана создавало впечатление, что ОС работает быстрее.
EDIT - 1/2 права ... Невозможно упреждающее многозадачное выполнение приложений Win16, поскольку для запуска приложений Win16 используется та же модель системной виртуальной машины (VM), что и в Windows 3.1. Таким образом, Windows 95 вернется к кооперативной многозадачной среде при запуске приложений Win16 и предоставит им эксклюзивный контроль над процессором на все время, пока приложения выполняются. В результате, истинное вытеснение невозможно при многозадачности смеси Win16 и Win32 приложений.