Что такое счетчик в компьютере
Windows Счетчики производительности обеспечивают высокоуровневый уровень абстракции с единообразным интерфейсом для сбора различных типов системных данных, таких как ЦП, память и статистика использования диска. Системные администраторы используют счетчики производительности для наблюдения за проблемами производительности или поведения. Разработчики программного обеспечения используют счетчики производительности для проверки использования ресурсов их компонентов.
Windows Счетчики производительности оптимизированы для обнаружения и сбора данных по администрированию и диагностике. Они не подходят для сбора данных с высокой частотой или для профилирования приложений, так как они не предназначены для сбора более одного раза в секунду. Для доступа к системной информации с более низкими издержками можно использовать более прямые API, такие как вспомогательное состояние процесса, глобалмемористатусекс, жетсистемтимесили GetProcessTimes. Для профилирования можно выполнять сбор журналов ETW с данными профилирования системы с помощью tracelog.exe с -critsec -dpcisr параметрами, -eflag или с -ProfileSource помощью профилирования счетчика оборудования.
не путайте Windows счетчики производительности с API QueryPerformanceCounter . Windows Счетчики производительности обеспечивают высокоуровневую абстракцию для многих типов системных данных. Функция QueryPerformanceCounter предоставляет оптимизированный доступ к метке времени с высокой точностью.
Приступая к работе
- Используйте средства счетчиков производительности , если требуется получить или просмотреть данные о производительности из системы.
- Используйте API сбора счетчиков производительности , если требуется написать сценарий или программу, собирающую данные о производительности из локальной системы.
- Используйте Классы счетчиков производительности WMI , если требуется получить данные о производительности из локальной или удаленной системы с помощью инструментария WMI.
- Используйте API поставщика счетчиков производительности , если требуется опубликовать данные о производительности из программного компонента.
Основные понятия
система счетчиков производительности Windows организована в виде потребителей, поставщиков, каунтерсетс, счетчиков, экземпляров и значений счетчиков.
Потребитель — это программный компонент, который использует данные о производительности. Windows включает несколько встроенных средств , которые используют данные о производительности. К ним относятся диспетчер задач, монитор ресурсов, монитор производительности, typeperf.exe, logman.exe и relog.exe. Разработчики могут создавать сценарии и приложения, обращающиеся к счетчикам производительности через API-интерфейсы счетчика производительности.
Поставщик — это программный компонент, который создает и публикует данные производительности. Поставщик будет публиковать данные для одного или нескольких каунтерсетс. Например, система базы данных может зарегистрироваться в качестве поставщика данных о производительности.
- Поставщик v1 — это программный компонент, который публикует данные производительности с помощью библиотеки DLL производительности , которая выполняется в процессе потребителя. Поставщик v1 устанавливается на компьютере с помощью .ini файла. Архитектура поставщика v1 устарела. Новые поставщики должны использовать архитектуру поставщика v2.
- Поставщик v2 — это программный компонент, который публикует данные производительности с помощью API поставщика счетчиков производительности. Поставщик v2 устанавливается на систему через .man файл (XML-манифест).
Набор счетчиков — это группирование данных о производительности в поставщике. Набор счетчиков имеет имя и один или несколько счетчиков. Сбор данных из набора счетчиков возвращает число экземпляров. в некоторых Windows api каунтерсетс называются объектами производительности. Например, поставщик данных производительности для системы базы данных может предоставлять набор счетчиков для статистики по базе данных.
Счетчик — это определение отдельной части данных о производительности. У счетчика есть имя и тип. Например, набор счетчиков «статистика по базе данных» может содержать счетчик с именем «транзакций в секунду» с типом PERF_COUNTER_COUNTER .
Экземпляр — это сущность, в которой сообщается о данных о производительности. Экземпляр имеет имя (строка) и одно или несколько значений счетчика. Например, набор счетчиков «статистика по базе данных» может содержать по одному экземпляру на базу данных. Имя экземпляра будет именем базы данных, а каждый экземпляр будет содержать значения счетчика для счетчиков "транзакций в секунду", "использование памяти" и "использование диска".
Значение счетчика — это значение одного элемента данных счетчика производительности. Значение счетчика — это целое число без знака, 32-бит или 64-бит, в зависимости от типа соответствующего счетчика. При разговоре об экземпляре значение счетчика иногда может называться счетчиком или значением.
Может быть полезно связать термины счетчиков производительности с более привычными условиями электронной таблицы. Набор счетчиков подобен таблице. Счетчик похож на столбец. Экземпляр похож на строку. Значение счетчика похоже на ячейку в таблице.
Один экземпляр каунтерсетс всегда содержит данные только для одного экземпляра. Это распространено для каунтерсетс, которые сообщают о глобальной системе статистики. например, Windows имеет встроенный набор счетчиков с одним экземпляром "память", который сообщает об использовании глобальной памяти.
Каунтерсетс с несколькими экземплярами содержит данные для переменного числа экземпляров. Это распространено для каунтерсетс, которые сообщают о сущностях в системе. например, Windows имеет встроенный набор счетчиков с несколькими экземплярами "сведения о процессоре", который сообщает по одному экземпляру для каждого установленного цп.
Потребители периодически собираются и записывают данные из CounterSet поставщика. Например, потребитель может получать данные один раз в секунду или один раз в минуту. Собранные данные называются примером. Пример состоит из меток времени и данных для экземпляров набора счетчиков. Данные для каждого экземпляра включают имя экземпляра (строку) и набор значений счетчика (целые числа, по одному значению для каждого счетчика в наборе счетчиков).
Имена экземпляров должны быть уникальными в образце, т. е. поставщик не должен возвращать два экземпляра с одним и тем же именем как часть одного примера. Некоторые старые поставщики не соответствуют этому правилу, поэтому потребители должны иметь возможность допускать неуникальные имена экземпляров. Имена экземпляров не учитывают регистр, поэтому экземпляры не должны иметь имен, отличающихся только регистром.
В целях обратной совместимости набор счетчиков "процесс" возвращает неуникальные имена экземпляров на основе имени файла EXE. Это может привести к путанице в результатах, особенно при запуске или завершении процесса с неуникальным именем, так как это обычно приводит к сбою данных из-за неправильного соответствия имен экземпляров между выборками. Потребители в наборе счетчиков "процесс" должны иметь возможность допускать эти неуникальные имена экземпляров и результирующие данные.
Имена экземпляров должны быть стабильными в образцах, т. е. поставщик должен использовать одно и то же имя экземпляра для одной и той же сущности каждый раз при сборе набора счетчиков.
Каждый счетчик имеет тип. Тип счетчика указывает тип необработанного значения счетчика (беззнаковое 32-разрядное целое число или неподписанное 64-разрядное целое число). Тип счетчика также указывает, что представляет собой необработанное значение счетчика, которое определяет, как обработанное значение должно обрабатываться для создания полезной статистики.
Хотя некоторые типы счетчиков просты и имеют необработанное значение, которое напрямую полезно, многие типы счетчиков нуждаются в дополнительной обработке , чтобы создать полезное отформатированное значение. Для создания форматированного значения некоторым типам счетчиков требуются необработанные значения из двух выборок, для некоторых типов счетчиков требуются метки времени, а для некоторых типов счетчиков требуются необработанные значения из нескольких счетчиков. Вот несколько примеров.
- PERF_COUNTER_LARGE_RAWCOUNT — Это 64-разрядное необработанное значение, которое не требует никакой обработки. Он подходит для значений на момент времени, например "байт используемой памяти".
- PERF_COUNTER_RAWCOUNT_HEX — Это 32-разрядное необработанное значение, которое должно быть полезно только для простого шестнадцатеричного форматирования. Он подходит для получения точки во времени или идентификации, например "Flags" или "базовый адрес".
- PERF_COUNTER_BULK_COUNT — Это 64-разрядное необработанное значение, указывающее количество событий и используемое для вычисления скорости возникновения событий. Чтобы быть полезным, для этого типа счетчика требуется два образца, которые были разделены по времени. Отформатированное значение — это частота событий, т. е. количество событий, произошедших в секунду за интервал между двумя примерами. Учитывая два образца s0 и s1 , отформатированное значение (частота событий) будет вычисляться как (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds) .
Предполагается, что поставщики ведут себя так, как если бы они не изменяют состояние, т. е. сбор данных из набора счетчиков не должен заметно влиять на состояние поставщика. Например, поставщик не должен сбрасывать значения счетчика в 0 при сборе набора счетчиков и не должен использовать отметку времени предыдущей коллекции для корректировки значений в текущей коллекции. Вместо этого он должен предоставлять простые необработанные значения счетчиков с точными типами, чтобы потребитель мог вычислить полезную статистику на основе необработанных значений и их меток времени.
Архитектура API производительности
Потребители счетчиков производительности включают:
-
, такие как диспетчер задач, монитор ресурсов, монитор производительности и typeperf.exe.
- Предоставляемые корпорацией Майкрософт высокоуровневые поверхности API, которые предоставляют данные счетчиков производительности, такие как классы производительности WMI.
- Собственные приложения или скрипты, использующие API-интерфейсы потребителя счетчика производительности.
Большинство потребителей счетчиков производительности используют API из PDH.dll для получения данных о производительности. PDH управляет множеством сложных аспектов сбора счетчиков производительности, таких как анализ запросов, сопоставление экземпляров по нескольким примерам и вычисление форматированных значений из необработанных данных счетчиков. Реализация PDH использует API реестра при использовании данных от поставщика v1 и использует API-интерфейсы потребителя v2 При использовании данных от поставщика v2.
Некоторые старые получатели счетчиков производительности используют API реестра для получения данных о производительности из специального HKEY_PERFORMANCE_DATA раздела реестра. Это не рекомендуется для нового кода, поскольку обработка данных из реестра является сложной и подвержена ошибкам. Реализация API реестра напрямую поддерживает сбор данных от поставщиков v1. Он косвенно поддерживает сбор данных от поставщиков v2 через слой перевода, использующий API-интерфейсы потребителя версии 2.
Некоторые потребители счетчиков производительности используют функции-потребители версии PerfLib v2 для прямого доступа к данным из поставщиков v2. Это сложнее, чем использование данных с помощью интерфейсов API PDH, но этот подход может быть полезен, если интерфейсы API PDH не могут быть использованы из-за проблем с производительностью или зависимостями. Реализация PerfLib v2 напрямую поддерживает сбор данных от поставщиков v2. Он не поддерживает сбор данных от поставщиков v1.
Windows OneCore не включает PDH.dll и не поддерживает использование данных счетчиков производительности с помощью api-интерфейсов реестра. потребители, работающие на OneCore, должны использовать функции потребителя версии 2 PerfLib.
Поставщики v1 реализуются как библиотека DLL поставщика, которая загружается в процесс потребителя. Реализация API реестра управляет загрузкой библиотеки DLL поставщика, вызовом библиотеки DLL для получения данных о производительности и выгрузкой библиотеки DLL соответствующим образом. библиотека DLL поставщика отвечает за сбор данных о производительности по мере необходимости, например с помощью обычных Windows api, RPC, именованных каналов, общей памяти или других механизмов взаимодействия между процессами.
поставщики V2 реализуются как программа пользовательского режима (часто это Windows служба) или драйвер режима ядра. Обычно код поставщика данных о производительности интегрируется непосредственно в существующий компонент (т. е. драйвер или служба сообщает о своей статистике). Реализация PerfLib v2 управляет запросами и ответами с помощью расширения ядра PCW.sys, поэтому поставщику обычно не требуется реализовывать взаимодействие между процессами для предоставления данных о производительности.
Windows API и средства счетчика производительности включают ограниченную поддержку доступа к счетчикам производительности с других компьютеров с помощью удаленного реестра (для поставщиков v1) и RPC (для поставщиков v2). Эту поддержку часто трудно использовать в терминах элементов управления проверки подлинности (средства и API-интерфейсы могут проходить проверку подлинности только в качестве текущего пользователя), а также в плане конфигурации системы (необходимые конечные точки и службы отключены по умолчанию). Во многих случаях лучше обращаться к счетчикам производительности удаленных систем через инструментарий WMI , а не через встроенную поддержку удаленного доступа.
Аудитория разработчиков
Поставщики счетчиков производительности обычно реализуются как драйверы режима ядра или службы пользовательского режима. Поставщики счетчиков производительности обычно пишутся на C или C++.
Требования к среде выполнения
Сведения о требованиях времени выполнения для определенного программного элемента см. в разделе "требования" на странице справочника по этому элементу.
Счетчик - устройство для подсчета числа входных импульсов. Счетчик можно реализовать на нескольких триггерах.
по модулю счёта:
с произвольным постоянным модулем счёта;
с переменным модулем счёта;
по направлению счёта:
по способу формирования внутренних связей:
с последовательным переносом;
Символом счетчиков на схемах служат буквы СТ (от англ. counter — счетчик), после символа проставляют число, характеризующее модуль счета (например, 2 или 10 — СТ2, СТ10).
Основными эксплуатационными показателями счетчика являются емкость и быстродействие. Емкость счетчика, численно равная коэффициенту счета, равна числу импульсов за один цикл.
В суммирующих счетчиках каждый входной импульс увеличивает число на его выходе на единицу, в вычитающих счетчиках каждый входной импульс уменьшает это число на единицу. Наиболее простые счетчики - двоичные. Счетчики можно реализовать на триггерах, которые соединяют последовательно. Выход каждого триггера действует на тактовый вход следующего. Для того чтобы реализовать суммирующий счетчик, необходимо счетный вход очередного триггера подключать к инверсному выходу предыдущего. Для того чтобы изменить направление счета (реализовать вычитающий счетчик), используют следующие способы:
а). считывание выходных сигналов счетчика не с прямых, а с инверсных выходов триггеров;
б). изменение структуры связей в счетчике. Подача на счетный вход следующего триггера сигнала не с инверсного, а с прямого выхода предыдущего триггера.
Реверсивный счетчик может работать в качестве суммирующего и вычитающего. Эти счетчики имеют дополнительные входы для задания направления счета. Режим работы определяется управляющими сигналами на этих входах. В программе EWB такие счетчики представлены ИМС 74163 и 74169 (К155ИЕ18, ИЕ17).
Главное достоинство счетчиков с последовательным переносом — простота схемы. Увеличение разрядности осуществляется подключением дополнительных триггеров к выходу последнего триггера. Основной недостаток счетчиков с последовательным переносом — сравнительно низкое быстродействие, поскольку триггеры срабатывают последовательно, один за другим. Счетчики этого класса в библиотеке EWB не представлены.
Счетчики с последовательным переносом представляют собой цепочку триггеров, в которой импульсы, подлежащие счету, поступают на вход первого триггера, а сигнал переноса передается последовательно от одного разряда к другому.
Счетчики с параллельным переносом состоят из синхронных триггеров. Счетные импульсы подаются одновременно на все тактовые входы, а каждый из триггеров цепочки служит по отношению к последующим только источником информационных сигналов. Срабатывание триггеров параллельного счетчика происходит синхронно, и задержка переключения всего счетчика равна задержке одного триггера. В таких счетчиках используются JK- и D-триггеры. В схемном отношении они сложнее счетчиков с последовательным переносом. Число разрядов у этих счетчиков обычно невелико (4. 6), поскольку с повышением числа разрядов число внутренних логических связей быстро растет.
Счетчики с параллельным переносом (их чаще называют синхронными) в библиотеке EWB представлены счетчиками 74160, 74162, 74163 и 74169 (аналоги — К155ИЕ9, ИЕН, ИЕ18, ИЕ17 соответственно).
Счетчики с параллельным переносом применяются в быстродействующих устройствах. Они обладают более высокой помехоустойчивостью, так как в паузах между импульсами триггеры счетчика блокированы. К их недостаткам следует отнести меньшую нагрузочную способность отдельных разрядов из-за дополнительной нагрузки внутренними связями. Каскад, предшествующий счетчику, должен иметь достаточную мощность, чтобы управлять входами нескольких триггеров.
Проектирование счетчика сводится к определению числа триггеров и организации связей между ними и логическими элементами, а также вычислению разрешающей способности счетчика (максимальной частоты счета).
Вопрос №36
Узлы как структурная единица ЭВМ, их типы.
Основные узлы ЭВМ.
Основными узлами ЭВМ являются :
- центральный процессор (ЦП)
- оперативная память (ОЗУ)
- постоянное запоминающее устройство (ПЗУ)
- внешняя память (ВЗУ)
- устройства Ввода (УВв)
- устройства Вывода (УВыв)
Все устройства ЭВМ подсоединены к единой ИНФОРМАЦИОННОЙ
Основные узлы ЭВМ объединены в следующую схему.
УУ |
АЛУ |
Ц П |
Системные программы |
ПЗУ |
Программа Данные Результаты |
ОЗУ |
Системная шина |
Устройства ВВОДА |
ВНЕШНЯЯ ПАМЯТЬ |
Устройства ВЫВОДА |
1. Центральный процессор
Главным элементом любой ЭВМ является ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР . ЦП сосотоит из - Устройства Управления (УУ) - Арифметико-Логического устройства (АЛУ) |
Назначение ЦП : 1) Управление узлами компьютера
2) Обработка информации, которая сводится к
выполнению арифметических операций.
УУ - управляет работой ЭВМ, путем исполнения команд ПРОГРАММЫ. Рабочая программа хранится в ОЗУ. |
(АЛУ) Арифметико-логичеcкое устройство главный исполнительный орган ЭВМ. Назначение АЛУ - О Б Р А Б О Т К А ИНФОРМАЦИИ. Обработка информации сводится к выполнению арифметических операций. АЛУ выполняет над числами арифметические(+,-,умножить, делить) и логические( > , < , не равно и др.) операции |
Оперативная память (ОЗУ)
Назначение ОЗУ ОЗУ предназначена для хранения рабочей программы во время ее выполнения, а также данных, которые эта программа должна обработать и результатов обработки |
Вместе с программой в ОЗУ хранятся :
- ИСХОДНЫЕ ДАННЫЕ , которые программа обрабатывает
Пример: Вы рисуете на компьютере с помощью программы PAINT.
Где в этот момент хранится программа Paint и рисунок ? >
В оперативной памяти. Работающая программа и результат ее работы
находится в ОЗУ!
Рабочая программа находится в ОЗУ .
Недостатки ОЗУ ОЗУ современных ЭВМ является ЭНЕРГОЗАВИСИМОЙ. При выключении питания содержимое ОЗУ теряется. |
Главное достоинство ОЗУ ВЫСОКОЕ БЫСТРОДЕЙСТВИЕ . ОЗУ выполнена из электронных элементов, поэтому быстродействие ОЗУ сопоставимо с быстродействием ЦП. Это значит, что время чтения (записи) двоичного числа из (в) ОЗУ примерно равно времени , за которое ЦП выполняет одну операцию над парой чисел. |
Вопрос: <Можно ли в качестве ОЗУ использовать другой вид памяти? >
< Например, магнитную память (винчестер) >
Ответ : В принципе можно, но при этом резко упадет быстродействие ЭВМ (в 10 000 раз). Операции чтения записи с диска выполняются примерно в 10 000 раз медленнее, чем из электронных ячеек. |
Магнитная память обладает низким быстродействием (по сравнению с электронной памятью). Операции чтения записи с диска выполняются примерно в 10 000 раз медленнее, чем из электронных ячеек.
Если бы рабочая программа располагалась на диске, то ЦП большую часть времени пришлось бы простаивать в ожидании, пока будет прочитана очередная команда.
Работа компьютера сводится к чтению и исполнению команд программы. Поэтому быстродействие ЭВМ не может превысить, скорость чтения команд программы.
Чарльз Бэбидж - первый конструктор автоматической вычислительной машины, предполагал хранить программу на картонных картах.
1) До запуска все программы хранятся в .exe файлах на магнитном диске (винчестере). 2)После запуска программа копируются из .exe файла в ОЗУ. Зачем это делается? Для поддержки высокого быстродействия ЭВМ. (Что бы быстродействие ЭВМ было высоким, рабочая программа должна храниться в быстрой памяти, т.е. в ОЗУ) 3)После завершения выполнения очередной программы она удаляется из ОЗУ, тем самым освобождая место для запуска других программ. (программа удаляется только из ОЗУ, но остается в файле на диске) |
<< Как в ОЗУ попадает первая программа? >>
Ведь после выключения питания или перезагрузки ОЗУ очищается и не содержит никакой информации.
Первой в ОЗУ попадает ОПЕРАЦИОННАЯ СИСТЕМА. Она копируется из файлов на магнитном диске в ОЗУ.
Но чтобы выполнить это копирование, нужно запустить программу, специально для этого предназначенную. Ведь на компьютере все делается только с помощью программ.
Таковой программой является начальный загрузчик. ОН хранится в ПЗУ. НАЧАЛЬНЫЙ ЗАГРУЗЧИК стартует первым сразу при включении компьютера и копирует в ОЗУ ОС. Далее ОС включается в работу и управляет компьютером.
Конечно же, достаточный набор свойств источника зависит от способа использования в программах. Например, одно устройство может предоставлять низкое разрешение и высокую длительность считывания, но при этом быть энергонезависимым и очень стабильным, а другое позволять измерять очень короткие промежутки времени, но при этом быстро переполняться, да ещё и не быть синхронизированным ни с чем больше.
Обзор таймеров в архитектуре PC
Источников времени в системе может быть несколько. Прикладные программы редко обращаются к каким-либо из них напрямую. Вместо этого используются всевозможные API, предлагаемые использованным языком программирования (например, C++11 < chrono >), средой исполнения (например, gettimeofday из POSIX или QueryPerformanceCounter на MS Windows), или даже системными вызовами используемой операционной системы.
Самой ОС также необходимо знать время и уметь отмерять его отрезки для планирования работы пользовательских потоков, учёта потреблённых ими ресурсов, профилировки производительности, управления энергопотреблением и т.п. При этом сама ОС работает напрямую с интерфейсами, предоставляемыми аппаратурой. Так как таймеров присутствует много, современные ОС умеют выбирать один «центрально» используемый в начале загрузки, исходя из своих представлений о «качестве» обнаруженных устройств (например, на некоторых системах часть таймеров может быть занесена в «чёрный список» из-за известных проблем в работе) или же настроек пользователя (параметр clocksource у ядра Linux и опции useplatformclock, tscsyncpolicy, disabledynamictick у BCDEDIT в Windows).
Опишу наиболее часто встречаемые устройства, являющиеся часами и таймерами в PC.
Общераспространённые
Часы реального времени (Real Time Clock, RTC) — источник текущей даты и времени для нужд ОС. Типичное разрешение этого таймера — одна секунда. Все системы, удовлетворяющие стандарту ACPI, имеют чип RTC, совместимый с Motorola MC146818, присутствовавшем в оригинальном IBM PC/AT с 1984 года. В современных системах RTC обычно интегрирован в набор системной логики южного моста на материнской плате (что означает довольно большую задержку при чтении). Энергонезависимость этого таймера обеспечивается специальной батарейкой. Принципы программирования RTC вызывают ностальгию по BCD-числам и проблеме Y2K.
Это удивительно, но первые системы IBM PC не имели в себе RTC. При каждом старте компьютера MS-DOS выдавала запрос на установку текущей даты и времени.И даже в наше время не каждая вычислительная система способна хранить время между перезагрузками. Например, оригинальная RaspberryPi не имеет встроенного RTC (это было сделано для уменьшения стоимости), и правильная установка текущей даты/времени при загрузке системы зависит от синхронизации с сетевыми NTP-серверами.
Programmable Interval Timer (PIT) 8253 или 8254 от Intel — стандартный счётчик и таймер, имеющийся в PC с самого начала существования этой платформы (1981 год). Как и RTC, изначально был отдельной микросхемой, а ныне является частью системной логики. Довольно интересное устройство, содержащее три таймера (хотя последние два всегда были зарезервированы под задачи обновления ОЗУ и работу PC-спикера соответственно) и позволяющее запрограммировать их в различные режимы: периодические прерывания, однократное (one-shot) прерывание по таймауту, меандр и т.д.
Первый канал PIT до сих пор может использоваться ОС как источник прерываний для работы вытесняющего планировщика задач. Однако по современным меркам он не очень удобен в работе: низкая частота осциллятора 1193181,8 Гц (странное значение — это историческое наследие от частоты развёртки NTSC), ширина счётчика всего 16 бит (частое переполнение) при ширине регистров статуса и команд всего в восемь бит (т.е. приходится передавать или читать значение по частям), да и доступ к регистрам через медленный и негибкий механизм PIO (команды IN/OUT процессора).
Local APIC (advanced programmable interrupt controller), встроенный во все современные процессоры Intel (начиная с архитектуры P54C) и который в своём составе имеет ещё и таймер. Более того, каждый логический процессор имеет свой собственный LAPIC, что может быть удобно для выполнения работы, локальной для текущего ядра, без необходимости управления ресурсами. Однако, данное устройство не имеет фиксированной известной частоты; последняя скорее привязана к частоте ядра. Поэтому перед использованием программе необходимо её вычислить (калибровать), а для этого нужно дополнительное референсное устройство. Режимы, поддерживаемые LAPIC: однократное прерывание, периодические прерывание, и период, определяемый TSC.
Таймер в составе ACPI, почему-то называемый Performance Monitoring Timer (PMTIMER) — ещё одно устройство, которое поддерживается всеми системами, реализующими стандарт ACPI, с 1996 года. Данный таймер имеет частоту 3.579545 МГц, ширина регистра-счётчика может быть 24 или 32 бита. Сам таймер всегда активен при включенном питании системы и не зависит от режима работы центрального процессора.
High Precision Event Timer (HPET) — устройство, созданное как замена устаревшему PIT. Согласно стандарту, HPET должен содержать осциллятор, работающий с фиксированной частотой по крайней мере в 10 МГц, величину которой можно программно прочитать из его статусного регистра, и монотонно увеличивающий значение счётчик шириной в 64 бита. Также он должен содержать минимум три компаратора шириной в 32 или 64 бита, которые и используются для генерации прерываний по истечении запрограммированных периодов времени. Как и PIT, он способен работать в периодическом режиме или в режиме однократного прерывания. При этом метод его программирования (MMIO вместо PIO) удобнее и быстрее, чем у PIT, что вместе с повышенным разрешением, позволяет задавать интервалы более точно и с меньшей задержкой. Требуемая стабильность генератора равна 0,05% для интервалов длиннее 1 мс и 0,2% для промежутков короче 100 мкс; много это или мало — зависит от приложений.
Несмотря на то, что HPET уже давно присутствует в PC (с 2005 года), операционные системы не торопятся начать его использовать. Частично это вызвано не самым удобным способом задания интервалов с помощью возрастающего счётчика вместо убывающего — из-за немгновенности операций существует риск «не успеть» и задать событие в прошлом. Зачастую ОС используют таймер из APIC или PMTIMER, или же функциональность TSC, использующую такты процессора в качестве источника времени.
Трудная судьба инструкции RDTSC
История TSC достаточно интересна и поучительна, чтобы остановиться на ней подольше.
Сама идея очень прозрачная — использовать в качестве источника времени сам процессор, а точнее его тактовый генератор. Текущий номер такта сохраняется в регистре TSC (timestamp counter).
С помощью TSC можно как узнавать время от начала работы, так и замерять интервалы времени с помощью двух чтений. TSC также работает как будильник в связке с APIC в режиме TSC deadline.
- RDTSC (Read TimeStamp Counter — прочесть метку времени) появилась в Intel® Pentium™. Она записывает в пару регистров EDX:EAX 64-битное число тактов, прошедших с момента последнего включения питания/перезагрузки текущего ядра процессора. В отличие от всех ранее описанных устройств, которые доступны только привилегированному коду, RDTSC по умолчанию может исполняться на любом уровне привилегий (хотя ОС может динамически отключить поддержку RDTSC в пользовательском режиме, и тогда она будет вызывать исключение).
- RDMSR [0x10] — чтение модель-специфичного регистра (MSR) IA32_TIMESTAMP_COUNTER также возвращает текущее TSC. Данная инструкция допускается только в привилегированном режиме, и некоторые ОС активно используют именно её для чтения TSC (хотя лично мне непонятно, почему). Полезное свойство состоит в том, что через MSR значение TSC можно не только читать, но и изменять, используя инструкцию WRMSR.
- RDTSCP — Наличие её можно установить, проверив соответствующий лист CPUID. О двух её отличиях от RDTSC будет сказано чуть ниже.
Что ж, TSC — вполне естественная штука с простой логикой и простым сценарием использования, которая должна обладать многими полезными свойствами: высокое разрешение (один такт ЦПУ), низкая задержка при чтении (десятки тактов), редкие переполнения (64-битного счётчика должно хватать минимум на 10 лет), монотонность чтений (ведь счётчик всегда увеличивает своё значение), равномерность (процессор всегда работает), согласованность с другими таймерами (при старте системы можно выставить нужное значение записью в MSR).
Разве что-то могло пойти не так? На пути к успешному использованию TSC в качестве основного средства измерения времени в PC встала последующая эволюция процессоров. Новые возможности, появившиеся в процессорах после Pentium, «испортили» RDTSC и много лет мешали использовать её как основной таймер в популярных ОС. Так, в 2006 году один из Linux-разработчиков Ingo Molnar писал:
Мы наблюдали, что в течение 10 лет ни одной реализации gettimeofday, основанной на TSC и работающей в общем случае, не было написано (а я написал первую версию для Pentium, так что и я в этом повинен), и что лучше мы обойдёмся без неё.
We just observed that in the past 10 years no generally working TSC-based gettimeofday was written (and i wrote the first version of it for the Pentium, so the blame is on me too), and that we might be better off without it.
Отмечу, что со временем в архитектуру IA-32 вносились коррективы, устранявшие проявившиеся недостатки, и в настоящий момент TSC может (пока опять не сломали) быть использован в том качестве, в котором он задумывался.
- Внеочередное исполнение (Out of Order Execution, OoO). Начиная с Intel® Pentium™ Pro (1995 г.), процессор может исполнять машинные инструкции в порядке, отличном от использованного в программе, или даже параллельно (если они не зависят друг от друга). Это означает, что исполнение RDTSC может быть задержано или, наоборот, выполнено раньше, чем того требует последовательный программный порядок. Из-за этого, например, невозможно понять, сколько каких инструкций исполнилось между двумя вызовами RDTSC — нельзя надёжно измерить длительность участка кода. В результате не гарантируется монотонность показаний.
RDTSC не является инструкцией, сериализующей поток исполнения. Поэтому обычно используется «забор» из сериализующих команд вокруг неё, например, CPUID. Это, конечно, не выглядит очень изящно. В последующих обновлениях архитектуры появилась RDTSCP — инструкция, частично сериализующая поток исполнения, поэтому она не нуждается в дополнительных барьерах. У неё есть ещё одно хорошее свойство, но о нём чуть позже. - Управление энергопотреблением. Значение TSC увеличиваетсся каждый такт процессора. Всегда ли такт имеет один и тот же период, и всегда ли следующий такт следует сразу за предыдущим? Для Intel® Pentium™ это выполнялось. Для современных процессоров ответы на оба вопроса отрицательные. Процессор довольно значительную долю времени может быть приостановлен для экономии энергии (C-состояния). Исполняя инструкции, он может использовать динамическое изменение частоты для экономии энергии (P-состояния) или наоборот, для максимизации производительности (Turbo-состояния). Из этого следует, что просто счётчик тактов не будет обладать ни равномерностью, ни согласованностью.
И для этой проблемы было представлено (начиная с Nehalem) решение в виде т.н. invariant TSC, темп изменения которого не зависит от C- и P-состояний отдельных ядер. - Многопроцессорность и многоядерность. В системе с несколькими потоками, ядрами или процессорами у каждого из логических процессоров будет свой TSC. Это создаёт не одну, а целых две сложности.
Во-первых, значения, возвращаемые RDTSC на различных логических процессорах, могут оказаться сдвинутыми из-за неодновременности моментов инициализации ядер. Более того, из-за неустранимого дрейфа частот отдельных таймеров эта разница могла непредсказуемым образом флуктуировать в процессе работы.
Во-вторых, перестаёт работать возможность надёжно измерять время в пользовательских приложениях. Без дополнительных ухищрений вроде прописывания affinity в любой момент программа может быть вытеснена с одного процессора и затем продолжена на другом. Если процесс, желающий измерить длительность между двумя событиями, в процессе работы был перемещён ОС с одного ядра на другое, два чтения RDTSC, выполненные им, не будут связаны.
Для компенсации первой проблемы в последних поколениях процессоров для TSC заводится единый источник сигнала. Показания TSC со всех ядер при этом должны быть одинаковыми.
Для устранения второго недостатка RDTSCP обладает ещё одним свойством, позволяющим пользовательскому приложению детектировать миграцию в процессе измерения интервала времени. Кроме значения TSC в EDX:EAX она возвращает значение отдельного модель-специфичного регистра IA32_TSC_AUX в ECX. Обе записи происходят атомарно, т.е. TSC и TSC_AUX всегда берутся с одного логического процессора. В начале работы ОС должна выставить уникальные значения TSC_AUX на всех процессорах системы. Совпадение считанных ECX для двух вызовов RDTSCP гарантирует, что они были выполнены на одном процессоре; в противном случае на разницу двух TSC полагаться нельзя, и измерение следует повторить. Вообще этот механизм может иметь и другие применения; например, с помощью него можно оповещать приложение не только о факте миграции, но и просто о вытеснении, также способном исказить результаты измерений времени. Вместо прикладных программ могут выступать и «привилегированные»: гипервизор Xen использует данный механизм для нотификации DomU систем о миграции между машинами.
Прочие устройства
Выше я описал наиболее часто распространённые и используемые устройства по определению времени. Конечно же, конкретные системы могут иметь дополнительные устройства, уникальные для процессора, интегрированной логики или даже в форме специализированных периферийных устройств (например, сверхточные атомные часы). Степень их доступности из программ зависит от того, существует ли драйвер для конкретного устройства в выбранной ОС. Так, пробежавшись по исходникам Linux, я нашёл как минимум ещё два поддерживаемых источника времени для сборок x86: устройство NatSemi SCx200 в системах AMD Geode, и Cyclone для систем IBM x440. К сожалению, в Интернете не очень много документации по ним.
- PowerPC. Спецификации для 32- и 64-битных систем постулируют наличие регистра TB (time base) шириной в 64 бита, доступного на чтение пользовательским приложениям и на чтение/запись из супервизора. Изменения TB должны монотонно не убывать и не обязаны быть равномерными, а их частота зависит от реализации. Также из режима супервизора доступен 32-битный регистр DEC (decrementer), позволяющий программировать прерывание через промежуток времени. Его значение убывает до нуля с той же самой частотой, с которой возрастает TB.
- ARM. В целом наличие средств измерения времени сильно зависит от выбранного семейства. На архитектуре ARM11 регистр CCNT может быть использован для чтения текущего номера такта; однако ширина его всего 32 бита, что означает переполнение примерно каждые 10 секунд на системе с частотой в 400 МГц. На системах Cortex M3 присутствует устройство Systick шириной 24 бита, а скорость его изменения специфицируется значением из регистра TENMS.
- Intel ® IA-64 (Itanium). На данных системах в качестве счётчика тактов используется 64-битный регистр ar.itc (interval time counter). Для программирования периодов времени может использоваться набор регистров cr.itm (interval timer match), cr.itv (interval timer vector). Первый задаёт значение ITC, при котором сгенерируется прерывание, а второй определяет его номер.
- SPARC v9. Архитектура подразумевает наличие 63-битного регистра TICK. Последний 64-й бит этого регистра контролирует, разрешено ли непривилегированному приложению читать время.
Заключение
Я надеюсь, что из этой заметки стало понятно, что работа со временем внутри компьютера на системном уровне на самом деле далека от тривиальной. Требования к устройствам, поставляющим время, зависят от решаемой задачи, и не всегда легко найти полностью подходящий вариант. При этом сами устройства зачастую содержат «архитектурные особенности», способные сломать голову несчастному программисту.
Однако это всё архитектурная присказка к симуляционной сказке. На самом деле мне хотелось рассказать о том, как можно моделировать весь этот зоопарк устройств. В следующей статье я опишу, как проявляется капризная природа времени при создании виртуальных окружений — симуляторов и мониторов виртуальных машин. Спасибо за внимание!
Таймером называется средство микропроцессора, служащее для измерения времени и реализации задержек. Основой таймера служит суммирующий счетчик, который считает количество импульсов генератора тактовой частоты.
Для таймера могут быть указаны:
- разрядость таймера;
- коэффициент предварительного деления;
- диапазон изменения счетного регистра;
- режим работы.
Предварительный делитель – делитель частоты тактового сигнала, работающий как один или несколько последовательно соединенных T-триггеров. Таймер изменяет свое значение на 1 каждые n сигналов тактового импульса. n называют коэффициентом предварительного деления .
Зная частоту тактового генератора fosc и коэффициент предварительного деления Kpre, легко определить частоту таймера по формуле:
Время одного тика таймера соответственно будет
Полное время счета таймера (время перебора всех допустимых значений двоичного счетчика) определится как
tic = 0,125 мкс;
Tcount = 0,125*2 8 = 32 мкс
1с/32мкс = 31250 повторений
Широтно-импульсная модуляция
Широтно-импульсная модуляция (ШИМ) – импульсный сигнал постоянной частоты и переменной скважности.
Скважность есть отношения периода следования импульса к длительности импульса.
С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ.
Обратная величина, то есть отношение длительности импульса к периоду, называется коэффициентом заполнения .
Разрядностью ШИМ называется разрядность таймера, используемого для формирования ШИМ-сигнала.
Существуют два основных режима работы ШИМ:
Быстрый ШИМ
Период ШИМ определяется максимальным значением, до которого считает счетчик. В этот момент ШИМ-сигнал устанавливается в «1». При достижении счетчиком значения, поданного на второй вход цифрового компаратора, осуществляется сброс выходного ШИМ-сигнала.
Фазовый ШИМ
В данном режиме счетчик работает как суммирующий и считает от 0 до максимального значения, а при достижении максимального значения работает как вычитающий, считая до 0.
При совпадении значения счетчика с некоторым установленным значением, происходит переключение выхода ШИМ.
Частотно-импульсная модуляция — сигнал переменной частоты и постоянной скважности, равной 2. При таком виде модуляции изменяется период сигнала, а длительность импульса всегда составляет половину периода.
Протокол UART и ограничения проекта
Перед вами – структура сигнала UART. У него есть начальный бит, обозначаемый переходом с высокого на низкий уровень сигнала, за которым идёт байт данных (LSB first), а потом бит остановки, переводящий сигнал на высокий уровень. Иногда есть ещё и бит чётности, однако он не обязателен, поэтому я его опустил из соображений простоты. Время передачи каждого бита определяется скоростью передачи в бодах (в данном случае – в битах в секунду). К примеру, скорость 9600 бод означает, что бит передаётся за
1/9600 = 104 мкс. Форма сигнала довольно простая, поэтому мы можем реализовать её полностью в железе на логических чипах.
Мне нужно было выбрать кварцевый генератор, дающий мне доступ к стандартным скоростям передачи в бодах, предпочтительно делящихся на степени двойки, чтобы с ним было удобно работать при помощи двоичного счётчика. Подумав, я решил использовать генератор на 2,4576 МГц, поскольку он позволял передавать на 38400 б/с (делением на 64), или 9600 б/с (делением на 256).
Классификация эвм по функциональным возможностям и размерам
По функциональным возможностям и размерам ЭВМ можно разделить (рис. 1.1) на супер-ЭВМ, большие, малые и микро-ЭВМ.
Рис. 1.1. Классификация ЭВМ по функциональным возможностям и размерам
Функциональные возможности ЭВМ обуславливаются основными технико-эксплуатационными характеристиками.
Некоторые сравнительные параметры названных классов современных ЭВМ приведены в таблице 1.2.
Сравнительные параметры различных классов ЭВМ
Исторически первыми появились большие ЭВМ, элементная база которых прошла путь от электронных ламп до интегральных схем со сверхвысокой степенью интеграции.
Супер-ЭВМ- мощные, высокоскоростные вычислительные машины (системы) с производительностью от сотен миллионов до триллионов операций с плавающей точкой в секунду. Супер-ЭВМ выгодно отличаются от больших универсальных ЭВМ по быстродействию числовой обработки, а от специализированных машин, обладающих высоким быстродействием в сугубо ограниченных областях, возможностью решения широкого класса задач с числовыми расчетами.
При производительности порядка нескольких GFLOPS можно еще обойтись одним векторно-конвейерным процессором (однопроцессорные супер-ЭВМ). Создание высокопроизводительной супер-ЭВМ с быстродействием порядка TFLOPS по современной технологии на одном процессоре не представляется возможным. Это связано с ограничением, обусловленным конечным значением скорости распространения электромагнитных волн (300 000 км/сек), так как время распространения сигнала на расстояние нескольких миллиметров (линейный размер стороны микропроцессора) при быстродействии 100 млрд. оп/с становится соизмеримым с временем выполнения одной операции. Поэтому супер-ЭВМ с такой производительностью создаются в виде высокопараллельных многопроцессорных вычислительных систем.
В настоящее время в мире насчитывается несколько тысяч супер-ЭВМ, начиная с простых офисных до мощных: Cyber 205 (фирмы Control Data), VP 2000 (фирмы Fujitsu), VPP500 (фирмы Siemens) и др., производительностью несколько десятков GFLOPS.
Счетчиком называется типовой функциональный узел компьютера, предназначенный для счета входных импульсов. Счетчик представляет собой связанную цепочку Т-триггеров, образующих память с заданным числом устойчивых состояний (Рис. 5.12)
Рисунок 5.12-Логическая структура счетчика
Разрядность счетчика п равна числу Т-триггеров. Каждый входной импульс изменяет состояние счетчика, которое сохраняется до поступления следующего сигнала. Значения выходов триггеров счетчика Qn,Qn-1, … Q1 -отображают результа счета в принятой системе счисления.
Логическая функция счетчика обозначаете буквами СТ (counter).
Список микроопераций счетчика включает:
-предварительную установку в начальное состояние,
-инкремент или декремент хранимого слова,
-выдачу слов параллельным кодом и др.
Счетчик является одним из основных функциональных узлов компьютера, а также различных цифровых управляющих и информационно-измерительных систем.
Основное применение счетчиков:
• образование последовательности адресов команд программы (счетчик команд или программный счетчик);
• подсчет числа циклов при выполнении операций деления, умножения, сдвига (счетчик циклов);
• получение сигналов микроопераций и синхронизации; аналого-цифровые преобразования и построение электронных таймеров (часов реального времени).
Счетчик характеризуется модулем и емкостью счета.
Модуль счета КСч определяет число состояний счетчика.
Модуль двоичного n-разрядного счетчика выражается целой степенью двойки М = 2 n .
После счета числа импульсов NBx = Ксч счетчик возвращается в начальное состояние. Таким образом, модуль счета, который часто называют коэффициентом пересчета, определяет цикл работы счетчика, после которого его состояние повторяется. Поэтому число входных импульсов и состояние счетчика однозначно определены только для первого цикла.
Емкость счета Nmаx определяет максимальное количество входных импульсов, которое может зафиксировать счетчик при одном цикле работы.
Емкость счета NСч=Ксч - 1 при условии, что работа счетчика начинается с нулевого начального состояния.
В счетчиках используются три режима работы: управления, накопления и деления.
В режиме управления считывание информации производится после каждого аходного счетного импульса, например, в счетчике адреса команд.
В режиме накопления главным является подсчет заданного числа импульсов либо счет в течение определенного времени.
В режиме деления (пересчета) основным является уменьшение частоты поступления импульсов в Ксч раз.
Большинство счетчиков может работать во всех режимах, однако в специальных счетчиках-делителях состояния в процессе счета могут изменяться в произвольном порядке, что позволяет упростить схему узла.
Счетчики классифицируют по следующим признакам:
• способу кодирования — позиционные и непозиционные;
• модулю счета — двоичные, десятичные, с произвольным постоянным или переменным (программируемым) модулем;
• направлению счета — простые (суммирующие, вычитающие) и реверсивные;
• способу организации межразрядных связей — с последовательным, сквозным, параллельным и комбинированным переносами (заемом);
• типу используемых триггеров — Т, JK, D в счетном режиме;
• элементному базису - потенциальные, импульсные и потенциально-импульсные.
В счетчиках с позиционным кодированием числовое выражение текущего состояния счетчика определяется формулой:
N = Qi = rn Qn + rn-1 Qn-1 + … + r1 Q1
где ri -вес i-го разряда;
Qi — значение выхода i-го разряда;
п — число разрядов.
Нулевое значение всех разрядов обычно принимается за начальное состояние счетчика. Остальные состояния нумеруют по числу поступивших входных импульсов.
В счетчиках с непозиционным кодированием (например, в кодах Грея) разряды не имеют постоянных весов и каждом набору состояний Qn, Qn-1,…Q1 приписывается определенное количество входных импульсов.
В компьютерах преимущественно используют счетчики с позиционным кодированием.
По виду переходов простые счетчики (Сч) подразделяются на суммирующие (прямого счета) и вычитающие (обратного счета).
В суммирующих счетчиках каждый прибавляемый импульс U + увеличивает состояние на единицу, то есть реализуется микрооперация инкремента Сч : = Сч + 1.
В вычитающих счетчиках каждый вычитаемый импульс U - уменьшает состояние на единицу, то есть реализуется микрооперация декремента Сч : = Сч - 1.
Реверсивные счетчики имеют переходы в прямом и обратном направлениях, что позволяет считать прибавляемые и вычитаемые импульсы.
К временным характеристикам счетчиков относятся:
- время установления (переключения) кода.
Разрешающая способность tpc -определяется минимальным интервалом времени между двумя входными импульсами, при котором еще сохраняется работоспособность счетчика. Параметр tpc задают временем переключения tT первого (младшего) триггера счетчика, то есть tpc = tT, поскольку он переключается под воздействием каждого входного импульса.
Быстродействие счетчика определяется максимальной частотою Fm поступления входных импульсов в режиме деления и вычисляется по формуле: Fm = 1/tT.
Bремя установления кода tуст отсчитывается от начала входного импульса до момента получения нового состояния. Данный параметр позволяет рассчитать быстродействие счетчика в режиме управления из соотношения: FmK = 1/(tуст + tсч), где tсч - время считывания информации.
Межразрядные связи обеспечивают выработку сигналов переноса в старшие разряды при суммировании импульсов и сигналов заема — при вычитании.
От вида реализации межразрядных связей существенно зависят параметры tyct и Fm.k.
В счетчиках с последовательными переносами триггеры переключаются поочередно после каждого входного импульса в направлении от младших разрядов к старшим. Такие счетчики называются последовательными или асинхронными. В счетчиках с параллельными переносами триггеры переключаются одновременно после каждого входного импульса, такие счетчики называются параллельными или синхронными.
Читайте также: