Что такое системный таймер в диспетчере устройств
Системный таймер в Windows: большое изменение
Поведение планировщика Windows значительно изменилось в Windows 10 2004 без каких-либо предупреждений и изменения документации. Вероятно, это поломает несколько приложений. Такое происходит не первый раз, но эта перемена посерьёзнее.
Если вкратце, то вызовы timeBeginPeriod из одного процесса теперь влияют на другие процессы меньше, чем раньше, хотя эффект ещё присутствует.
Думаю, что новое поведение — это по сути улучшение, но оно странное, и заслуживает того, чтобы быть задокументированным. Честно предупреждаю — у меня только результаты собственных экспериментов, поэтому могу только догадываться о целях и каких-то побочных эффектах этого изменения. Если какие-либо из моих выводов неверны, пожалуйста, дайте знать.
Прерывания таймера и смысл их существования
Во-первых, немного контекста о дизайне операционных систем. Желательно, чтобы программа могла засыпать, а позже — просыпаться. На самом деле это не следует делать очень часто — потоки обычно ждут событий, а не таймеров, — но иногда необходимо. Итак, в Windows есть функция Sleep — передайте ей желаемую продолжительность сна в миллисекундах, и она разбудит процесс:
Стоит подумать о том, как это реализуется. В идеале при вызове Sleep(1) процессор переходит в спящий режим. Но как операционная система разбудит поток, если процессор спит? Ответ — аппаратные прерывания. ОС программирует микросхему — аппаратный таймер, который затем запускает прерывание, которое пробуждает процессор, и ОС затем запускает ваш поток.
Функции WaitForSingleObject и WaitForMultipleObjects также имеют значения таймаута, и эти таймауты реализуются с использованием того же механизма.
Если много потоков ждут таймеров, то ОС может запрограммировать аппаратный таймер на индивидуальное время для каждого потока, но это обычно приводит к тому, что потоки просыпаются в случайное время, а процессор так нормально и не засыпает. Энергоэффективность CPU сильно зависит от времени его сна (нормальное время от 8 мс), и случайные пробуждения тому не способствуют. Если несколько потоков синхронизируют или объединяют свои ожидания таймера, то система становится более энергоэффективной.
Существует множество способов объединения пробуждений, но основной механизм в Windows — глобальное прерывание таймера, тикающего с постоянной скоростью. Когда поток вызывает Sleep(n), то ОС запланирует запуск потока сразу после первого прерывания таймера. Это означает, что поток может в конечном итоге проснуться немного позже, но Windows — это не ОС реального времени, она вообще не гарантирует определённое время пробуждения (в это время ядра процессора могут быть заняты), поэтому вполне нормально проснуться чуть позже.
Интервал между прерываниями таймера зависит от версии Windows и железа, но на всех моих машинах он по умолчанию составлял 15,625 мс (1000 мс/64). Это означает, что если вызвать Sleep(1) в какое-то случайное время, то процесс будет разбужен где-то между 1,0 мс и 16,625 мс в будущем, когда сработает следующее прерывание глобального таймера (или через одно, если это сработало слишком рано).
Короче говоря, природа задержек таймера такова, что (если только не используется активное ожидание процессора, а его, пожалуйста, не используйте) ОС может пробуждать потоки только в определённое время с помощью прерываний таймера, а Windows использует регулярные прерывания.
Некоторым программам не подходит такой большой разброс в задержках ожидания (WPF, SQL Server, Quartz, PowerDirector, Chrome, Go Runtime, многие игры и т. д.). К счастью, они могут решить проблему с помощью функции timeBeginPeriod, которая позволяет программе запросить меньший интервал. Есть также функция NtSetTimerResolution, которая позволяет устанавливать интервал меньше миллисекунды, но она редко используется и никогда не требуется, поэтому не буду больше её упоминать.
Десятилетия безумия
Вот сумасшедшая вещь: timeBeginPeriod может вызвать любая программа, и она изменяет интервал прерывания таймера, при этом прерывание таймера — это глобальный ресурс.
Представим, что процесс А находится в цикле с вызовом Sleep(1). Это неправильно, но это так, и по умолчанию он просыпается каждые 15,625 мс, или 64 раза в секунду. Затем появляется процесс B и вызывает timeBeginPeriod(2). Это заставляет таймер срабатывать чаще, и внезапно процесс А просыпается 500 раз в секунду вместо 64-х раз в секунду. Это безумие! Но именно так всегда работала Windows.
В этот момент, если бы появился процесс C и вызвал timeBeginPeriod(4), это ничего бы не изменило — процесс A продолжал бы просыпаться 500 раз в секунду. В такой ситуации правила устанавливает не последний вызов, а вызов с минимальным интервалом.
Таким образом, вызов timeBeginPeriod от любой работающей программы может установить глобальный интервал прерывания таймера. Если эта программа завершает работу или вызывает timeEndPeriod, то вступает в силу новый минимум. Если одна программа вызывает timeBeginPeriod(1), то теперь это интервал прерывания таймера для всей системы. Если одна программа вызывает timeBeginPeriod(1), а другая timeBeginPeriod(4), то всеобщим законом становится интервал прерывания таймера в одну миллисекунду.
Это имеет значение, потому что высокая частота прерываний таймера — и связанная с ней высокая частота планирования потоков — может впустую расходовать значительную мощность CPU, как обсуждалось здесь.
Одним из приложений, которому необходимо планирование на основе таймера, является веб-браузер. В стандарте JavaScript есть функция setTimeout, которая просит браузер вызвать функцию JavaScript через несколько миллисекунд. Для реализации этой и других функций Chromium использует таймеры (в основном WaitForSingleObject с таймаутами, а не Sleep). Это часто требует повышенной частоты прерываний таймера. Чтобы это не слишком сказывалось на времени автономной работы, Chromium недавно модифицировали таким образом, чтобы при работе от батареи частота прерываний таймера не превышала 125 Гц (интервал 8 мс).
timeGetTime
Функция timeGetTime (не путать с GetTickCount) возвращает текущее время, обновлённое прерыванием таймера. Процессоры исторически не очень хороши в ведении точного времени (их часы специально колеблются, чтобы не служить FM-передатчиками, и по другим причинам), поэтому для поддержания точного времени CPU часто полагаются на отдельные генераторы тактовых импульсов. Чтение с этих чипов стоит дорого, поэтому Windows поддерживает 64-битный счётчик времени в миллисекундах, обновляемый прерыванием таймера. Этот таймер хранится в общей памяти, поэтому любой процесс может дёшево считывать оттуда текущее время, не обращаясь к генератору тактовых импульсов. timeGetTime вызывает ReadInterruptTick, который по сути просто считывает этот 64-битный счётчик. Все просто!
Поскольку счётчик обновляется прерыванием таймера, мы можем его отследить и найти частоту прерывания таймера.
Новая недокументированная реальность
С выпуском Windows 10 2004 (апрель 2020 года) некоторые из этих механизмов слегка изменились, но очень запутанным образом. Сначала появились сообщения, что timeBeginPeriod больше не работает. На самом деле всё оказалось куда сложнее.
Первые эксперименты дали смешанные результаты. Когда я запустил программу с вызовом timeBeginPeriod(2), то clockres показал интервал таймера 2,0 мс, но отдельная тестовая программа с циклом Sleep(1) просыпалась около 64 раз в секунду вместо 500 раз, как в предыдущих версиях Windows.
Научный эксперимент
Тогда я написал пару программ для изучения поведения системы. Одна программа (change_interval.cpp) просто сидит в цикле, вызывая timeBeginPeriod с интервалами от 1 до 15 мс. Она удерживает каждый интервал в течение четырёх секунд, а затем переходит к следующему, и так по кругу. Пятнадцать строк кода. Легко.
Другая программа (measure_interval.cpp) запускает несколько тестов для проверки, как её поведение изменяется при изменении change_interval.cpp. Программа отслеживает три параметра.
Это означает, что timeBeginPeriod по-прежнему устанавливает интервал глобального таймера во всех версиях Windows. Из результатов timeGetTime() можно сказать, что прерывание срабатывает с такой скоростью по крайней мере на одном ядре процессора, и время обновляется. Обратите также внимание, что 2.0 в первой строке для 1909 года тоже было 2.0 в Windows XP, затем 1.0 в Windows 7/8, а затем вроде опять вернулось к 2.0?
Однако поведение планировщика резко меняется в Windows 10 2004. Ранее задержка для Sleep(1) в любом процессе просто равнялась интервалу прерывания таймера, за исключением timeBeginPeriod(1), давая такой график:
В Windows 10 2004 соотношение между timeBeginPeriod и задержкой сна в другом процессе (который не вызывал timeBeginPeriod) выглядит странно:
Точная форма левой части графика неясна, но она определённо уходит в противоположную сторону от предыдущего!
Последствия
Как было указано в обсуждении reddit и hacker-news, вероятно, левая половина графика представляет собой попытку максимально точно имитировать «нормальную» задержку, учитывая доступную точность глобального прерывания таймера. То есть с интервалом прерывания 6 миллисекунд задержка происходит примерно на 12 мс (два цикла), а с интервалом прерывания 7 миллисекунд — примерно на 14 мс (два цикла). Однако измерение фактических задержек показывает, что реальность ещё более запутанна. При прерывании таймера, установленном на 7 мс, задержка Sleep(1) в 14 мс даже не самый распространённый результат:
Некоторые читатели могут обвинить случайный шум в системе, но когда частота прерывания таймера 9 мс и выше, шум равен нулю, так что это не может быть объяснением. Попробуйте сами запустить обновлённый код. Особенно противоречивыми кажутся интервалы прерывания таймера от 4 мс до 8 мс. Вероятно, измерения интервалов следует выполнять с помощью QueryPerformanceCounter, поскольку на текущий код беспорядочно влияют изменение правил планирования и изменение точности таймера.
Всё это очень странно, и я не понимаю ни логики, ни реализации. Может, это и ошибка, но я в этом сомневаюсь. Думаю, что за этим стоит сложная логика обратной совместимости. Но самый эффективный способ избежать проблем совместимости — это документировать изменения, желательно заранее, а здесь правки сделаны без какого-либо уведомления.
Это не повлияет на большинство программ. Если процесс хочет более быстрое прерывание таймера, то он сам должен вызвать timeBeginPeriod. Тем не менее, могут возникнуть следующие проблемы:
HPET: что это и как с его помощью оптимизировать Windows
HPET был введен компаниями Intel и Microsoft в 2005 году. Это аппаратный таймер, который находится в пределах южного моста – компонента, отвечающего за связь процессора с жестким диском, видеокартой, оптическим приводом и другими устройствами для обеспечения максимальной пропускной способности.
Функции аппаратного таймера
Задачей таймера является подсчет количества системных событий, связанных, например, с доступом к жесткому диску. В момент, когда предварительно установленное значение будет достигнуто, создается прерывание. Процессор приостанавливает текущую программу и реализует связанный с новой командой код.
В частности, задача HPET состоит в синхронизации мультимедийных потоков, обеспечении плавного воспроизведения аудио и видео в операционной системе и разгрузке таймеров процессора.
Симптомом неправильной работы HPET (или полного его бездействия) являются, например, регулярные секундные зависания Windows. Компьютер со временем начинает медленно работать. В такой ситуации следует задуматься над изменением параметров указанной функции.
Как сменить значение таймера и ускорить Windows
Сначала нужно определить, поддерживает ли ее в целом наша платформа. Здесь все просто – Windows Vista и новые версии поддерживают HPET, XP делает это частично, старые «окна» вообще не используют этот дополнительный таймер. В случае сомнений следует заглянуть в BIOS.
В дополнительных параметрах (Advanced) должна быть опция Configuration PCH или HPET Mode (название может немного отличаться в зависимости от версии BIOS и производителя материнской платы). Нам нужно найти High Precision Timer, ACPI HPET Table или похожее. Здесь можно ее включить или отключить.
Тем не менее Windows имеет тенденцию к перезаписи установленных параметров и использовать HPET, несмотря на настройки в Биосе. Поэтому после загрузки системы нужно открыть командную строку с правами администратора. Для ее вызова в Windows 10 кликните правой кнопкой на меню Пуск и выберите соответствующий пункт.
HPET сможете включить с помощью команды:
bcdedit /set useplatformclock true
Это единственный таймер, который активируется через Windows. Для его отключения используйте команду:
bcdedit /deletevalue useplatformclock
Тогда операционная система будет вынуждена использовать таймеры, встроенные непосредственно в процессор.
Важно: в этом обзоре речь не идет о том, что HPET должен быть полностью включен или выключен. Если вы столкнулись с проблемами зависания системы – медленно открываются программы или рывки в работе компьютера — то следует проверить, работает ли HPET, и попробовать разные настройки. Полученный результат будет зависеть от точного определения причины указанной проблемы.
Системный таймер на материнской плате что это
Иногда при загрузке пользователь ПК слышит 4 коротких сигнала BIOS. Что они означают? В данном случае мы имеем дело с информационным сообщением BIOS, говорящем об определенной ошибке при прохождении процедуры проверки оборудования POST.
Поскольку различные производители БИОС имеют различные кодовые обозначения звуковых сигналов, то значение четырех коротких сигналов зависит от материнской платы и типа БИОС, установленной на плате. Для того, чтобы узнать тип БИОС, вы должны обратиться к инструкции материнской платы (разумеется, в том случае, если название производителя BIOS не пишется на экране монитора при загрузке или его невозможно найти на поверхности материнской платы).
Обычно четыре коротких сигнала задействуют такие производители БИОС, как AMI и AST. В их БИОС подобные информационные сообщения имеют различное значение. У AMI четыре коротких сигнала BIOS означают неисправность системного таймера – специальной микросхемы, которая используется для измерения промежутков времени, а также управления некоторыми устройствами материнской платы. Если подобный сигнал вы слышите в первый раз, то есть смысл перезагрузить компьютер и проверить, не был ли предыдущий сбой случайным. Если сигнал повторяется, то это означает, что микросхема системного таймера вышла из строя и ее придется менять. Неисправность системного таймера, в свою очередь, повлечет за собой необходимость ремонта материнской платы или ее замены.
Также 4 коротких сигнала BIOS могут теоретически услышать те пользователи, которые обладают компьютерами с установленной AST BIOS. У AST BIOS данное сообщение имеет совсем другой смысл, нежели у AMI BIOS, а именно – невозможность обратиться к клавиатуре. Очень часто данная ошибка бывает лишь следствием того, что клавиатура плохо подсоединена к системному блоку. Чтобы полностью исключить данную возможность, вам необходимо проверить надежность подсоединения штекера клавиатуры в соответствующий разъем системного блока. Если эта процедура не приводит к успеху, то клавиатуру следует заменить. Данное сообщение не возникает при неисправности самого контроллера клавиатуры, поскольку в AST BIOS для этого случая предусмотрен другой сигнал.
Наш железный друг каждый день разговаривает с нами, да именно разговаривает, не нужно смотреть на меня как на сумасшедшую.
Каждый раз, когда мы включаем компьютер, он уходит в режим само тестирования и по итогам этого теста сообщает о своем самочувствии, с помощью набора звуковых сигналов.
Беда в том, что большая часть пользователей не знает значения этих сигналов.
В этой статье, я побуду переводчиком.
Первое, что нам нужно сделать – это выяснить, какая модель BIOS установлена у нас на компьютере.
Версию BIOS можно узнать при загрузке компьютера,
или можно воспользоваться сторонними программами, например BiosAgent.
Так же можно открыть боковую крышку компьютера и найти чип с надписью о версии BIOS.
Теперь, когда мы узнали версию BIOS, осталось понять ее язык.
AMI BIOS
Сигналов нет
Ошибки по питанию
Неисправен или не подключен к материнской плате блок питания. Или не подключен к материнской плате динамик.
Решение – проверить материнскую плату с другим блоком питания, проверить подключение динамика, заменить материнскую плату
1 короткий
Ошибок не обнаружено
Все проверки прошли нормально
2 коротких
Ошибка четности ОЗУ
Проблема с планками памяти.
Решение – прочистка слотов памяти пылесосом, прочистка контактов планок памяти. Смена слотов для планки (поменять местами), запуск с одной планкой. Замена памяти.
3 коротких
Другие ошибки ОЗУ
Проблема с планками памяти.
Решение – прочистка слотов памяти пылесосом, прочистка контактов планок памяти. Смена слотов для планки (поменять местами), запуск с одной планкой. Замена памяти.
4 коротких
Неисправность системного таймера.
Неисправность системного таймера или первого банка памяти.
Решение – Заменить материнскую плату
5 коротких
Ошибка процессора
Неисправность процессора
Решение – Заменить процессор
6 коротких
Ошибка линии управления A20
Неисправность микросхемы контроллера клавиатуры, которая не позволяет переключить процессор в защищенный режим.
Решение – Замените клавиатурный контроллер
7 коротких
Ошибка виртуального режима процессора
Неисправность в процессоре или материнской платы
Решение – проверить материнскую плату с другим процессором. Замена мат. платы или процессора
8 коротких
Ошибка чтения/записи видеопамяти
Отсутствует или неисправен видеоадаптер.
Решение – Заменить видео карту.
9 коротких
Несовпадение контрольной суммы ПЗУ BIOS
Возможно, неисправна и должна быть заменена или перепрошита микросхема ПЗУ BIOS
Решение – Сбрось CMOS-память джампером
10 коротких
Ошибка чтения/записи регистра управления питанием в энергонезависимой памяти
Невозможна запись в RAM CMOS.
Решение – Заменить материнскую плату
1 длинный, 2 коротких
Ошибка видеосистемы
Не работает видеокарта.
Решение – Проверить разъем монитора и его подключение. Слот расширения. Неисправна видеокарта — заменить
1 длинный, 3 коротких
Ошибка при проверке видео памяти.
Обнаружена ошибка в памяти выше 64К
Не работает видеокарта.
Решение – Проверить разъем монитора и его подключение. Слот расширения. Неисправна видеокарта — заменить
1 длинный, 8 коротких
Ошибка при проверке дисплейного адаптера
Не подключен монитор.
Решение – Проверить разъем монитора и его подключение. Проверить монитор. Замена дисплейного адаптера
AWARD BIOS
Сигналов нет
Не работает блок питания или материнская плата.
Неисправен или не подключен к материнской плате блок питания. Или не подключен к материнской плате динамик.
Решение – проверить материнскую плату с другим блоком питания, проверить подключение динамика, заменить материнскую плату
непрерывный
Ошибка питания или Ошибка памяти
Неисправен или не подключен к материнской плате блок питания.
Решение – проверить материнскую плату с другим блоком питания, проверить подключение динамика, заменить материнскую плату или блок питания.
Проблема с планками памяти.
Решение – прочистка слотов памяти пылесосом, прочистка контактов планок памяти. Смена слотов для планки (поменять местами), запуск с одной планкой. Замена памяти.
1 короткий
Ошибок не обнаружено
Все проверки прошли нормально
2 коротких
Обнаружены незначительные ошибки
Решение – На экране монитора появляется предложение войти в программу CMOS и исправить настройки. Проверьте надежность крепления шлейфов в разъемах жесткого диска и материнской платы.
3 длинных
Ошибка контроллера клавиатуры
Решение – Проверьте крепление разъёма клавиатуры, перегрузите компьютер. Замена мат. платы.
1 длинный + 1 короткий
Проблемы с оперативной памятью
Проблема с планками памяти.
Решение – прочистка слотов памяти пылесосом, прочистка контактов планок памяти. Смена слотов для планки (поменять местами), запуск с одной планкой. Замена памяти.
1 длинный +2 коротких
Неисправен видеоадаптер или нет контакта в его разъёме. Также возможен неконтакт кабеля монитора.
Не работает видеокарта.
Решение – Проверить разъем монитора и его подключение. Слот расширения. Неисправна видеокарта — заменить
1 длинный + 3 коротких
Ошибка инициализации клавиатуры или нет видеокарты или ошибка видеопамяти
Решение – Проверить провод и подключение.
Замените клавиатурный контроллер.Нет видеокарты или ошибка видеопамяти.
1 длинный + 9 коротких
Ошибка при чтении из ПЗУ
Решение – Проверь батарею и сбрось CMOS
1 длинный повторяющийся
Ошибка памяти
Проблема с планками памяти.
Решение – прочистка слотов памяти пылесосом, прочистка контактов планок памяти. Смена слотов для планки (поменять местами), запуск с одной планкой. Замена памяти.
1 короткий повторяющийся
Проблемы с блоком питания
Решение – прочистка блока питания от пыли. Замена Б.П.
Высоко тональные во время работы
Перегрев процессора
Решение – Заменить вентилятор процессора.
Чередующиеся низко- и высоко тональные
Процессор
Решение – проверить крепление процессора. Замена процессора.
Так же встречаются следующие виды BIOS: Phoenix BIOS, AST BIOS, Compaq BIOS, IBM Desktop BIOS, IBM Thinkpad BIOS, Mylex BIOS, Mylex 386 BIOS, Quadtel BIOS
Наверняка вы знаете, что при включении компьютера он издает характерный звук, который может многое нам поведать. Как правило, 1 короткий звуковой сигнал говорит о полной исправности компьютера и готовности его к загрузке.
Однако, что могут означать 4 коротких звуковых сигнала, раздающихся при включении компьютера?
Разным типам BIOS соответствуют разные виды сигналов. Давайте рассмотрим три основных типа BIOS — AMI BIOS, AWARD BIOS, PHOENIX BIOS.
4 коротких сигнала для AMI BIOS – говорят о неисправности системного таймера. А у двух других типов BIOS и вовсе нет такого рода сигналов. Поэтому если при включении компьютера вы услышите 4 коротких сигнала, значит у вас AMI BIOS. Какие пути решения данной проблемы существуют?
Как правило, выполнение этих пунктов достаточно, чтобы исправить ошибку системного таймера. Однако бывают варианты выхода из строя комплектующих, а также возможна поломка материнской платы. Для выявления неисправностей, следует продиагностировать компьютер, что лучше сделать в соответствующем сервисе.