Power management API: мощность плюс интеллект

04 Мар 2016

Power management API: мощность плюс интеллект

Нетрудно заметить, что архитектура современной вычислительной системы, от планшета до многопроцессорного сервера, реализуется по принципу «компьютера в компьютере». Автономные микроконтрол­леры применяются в клавиатуре, дисковых накопителях, модемах и других устройствах. Графический процессор видео адаптера, по ряду характеристик превосходит центральный процессор. Подсистема электропитания не является исключением. Исследуем ее особенности в процессе написания небольшой утилиты, рассчитанной на запуск в 64-битной среде Microsoft Windows. Применение единых и универсальных программных интерфейсов для управления источником бесперебой­ного питания и аккумулятором ноутбука, расширит применимость результатов эксперимента: в сфере интересов десктопы, серверы, ноутбуки и виртуальные машины.

Опыт 1. Десктопная платформа, снабженная UPS

Итак, запускаем утилиту PowerInfo. Параметры в таблице Power status отражающие общее состояние электропитания, читаются посредством Windows API функции GetSystemPowerStatus. Параметры Battery details содержат подробности о батарее, доступные посредством интерфейса IOCTL (Input-Output Control). «Лишние» фрагменты строк после серийного номер и уникального идентификатора, оказались в области отображения в результате попытки увидеть чуть больше информации, чем доступно, предпринятой в инженерном релизе программы. А за причисление UPS к устройствам человеко-машинного интерфейса, видимо, ответственны архитекторы Microsoft (см. строку Battery Enumeration Path, содержащую идентификатор hid, что означает Human Interface Device). Эту странную особенность, известную практикующим разработчикам, следует смиренно принять, также как, например, квадратный корень из отрицательного числа.

Информация получена на десктопной платформе, снабженной источником бесперебойного питания; параметры в таблице Power Status названы аналогично выходным параметрам функции GetSystemPowerStatus, описанным в базе знаний MSDN, с этим связан пропуск пробелов в некоторых строках
Рис 1Информация получена на десктопной платформе, снабженной источником бесперебойного питания; параметры в таблице Power Status названы аналогично выходным параметрам функции GetSystemPowerStatus, описанным в базе знаний MSDN, с этим связан пропуск пробелов в некоторых строках

Примечательно, что в качестве даты выпуска батареи (в данном случае, аккумулятора), визуализируется дата выпуска UPS. Если вы заменяли элементы в источнике бесперебойного питания, то возможно обратили внимание, что батарея подключается двумя силовыми проводами, какой-либо интерфейс, позволяющий обмениваться данными, отсутствует. Поэтому, программно определить дату выпуска батареи UPS нельзя. Не исключено, что в будущем, ситуация изменится.

Опыт 2. Сервер, снабженный UPS

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

Информация получена на сервере, снабженном источником бесперебойного питания
Рис 2. Информация получена на сервере, снабженном источником бесперебойного питания

Кроме того, серверная операционная система по-своему скрывает возраст батареи: возвращаемая дата выпуска содержит текущую дату.

Опыт 3. Ноутбук и виртуальная машина Oracle

В этом опыте объект исследования — батарея ноутбука, причем информацию будем получать и сравнивать на физической и виртуальной системе. Поскольку подсистема электропитания мобильной платформы, в отличие от UPS, состоит из объектов, архитектура которых предопределена для заданного ноутбука и заранее известна разработчикам Firmware, не удивительно, что нумерация осуществляется посредством интерфейса ACPI, см. строку Battery Enumeration Path. Обратим внимание и на то, что строка, описывающая электрохимию батареи (Battery Chemistry) на физической и виртуальной платформе различается, гипервизор Oracle Virtual Box подменяет этот параметр и возвращает строку «VBOX».

Информация о батарее получена на ноутбуке ASUS N750JK: слева результаты для физической платформы, справа — для виртуальной машины Oracle Virtual Box; ноутбук работает от электросети, строка ACLineStatus = Online
Рис 3. Информация о батарее получена на ноутбуке ASUS N750JK: слева результаты для физической платформы, справа — для виртуальной машины Oracle Virtual Box; ноутбук работает от электросети, строка ACLineStatus = Online

Тот же опыт, но с отключением от электросети: ноутбук работает от батареи; строка ACLineStatus = Offline
Рис 4. Тот же опыт, но с отключением от электросети: ноутбук работает от батареи; строка ACLineStatus = Offline

Параметр BatteryLifeTime, отражающий ожидаемое время работы устройства от батареи, становится доступным только при отключении электросети. Предположительно это связано с принципами работы подсистемы мониторинга. Параметр BatteryFullLifeTime, или время работы от полностью заряженной батареи, исследуемая платформа скрывает. Кроме того, на виртуальной машине доступно существенно меньше информации, а строка имени вендора заменена на «innotek».

Вместо послесловия

Все ли так регулярно и унифицировано? Обратим внимание на строку System Status Flag, значение которой на исследуемой платформе Battery Saver is OFF. Насколько можно судить из описания MSDN, этот битовый флаг в общем случае, дает возможность подсистеме электропитания сообщить об использовании политики, сокращающей потребление энергии, как правило за счет снижения производительности. Какие именно действия предпринимает при этом контроллер электропитания, зависит от схемотехники конкретного устройства и особенностей написания его драйвера, поэтому тонкий смысл этой переменной, отчасти является Vendor Specific.

Загрузить PowerInfo

Скачать утилиту PowerInfo v0.03, предназначенную для информирования пользователя о подсистеме электропитания в 64-битной среде Microsoft Windows можно прямо с нашего сайта. Замечания и предложения о ее работы приветствуются.