Уменьшение энергопотребления ноутбуков с помощью Windows Bridge

В нынешнее время, когда уровень использования мобильных устройств растет с каждым днем, вопрос энергопотребления ноутбуков приобретает особую важность. Учитывая, что за прошлый год уровень продаж ноутбуков вырос на 50%, очень важно, чтобы у пользователей была возможность пользоваться мобильными компьютерами в течение всего дня. Но данный вопрос важен не только с точки зрения конечного пользователя – увеличение спроса на ноутбуки привело к снижению расходов на электроэнергию в корпоративной сфере. В компаниях среднего размера около от 7 до 18% общей суммы затрат на электроэнергию приходится на компьютеры. И пока разработчики аппаратного обеспечения работают над увеличением емкости аккумуляторов, важно, чтобы разработчики программного обеспечения не теряли времени и правильно использовали имеющиеся возможности.

На конференции PDC Пэт Стемен (Pat Stemen) представил очень интересный доклад под названием Увеличиваем время работы аккумуляторов с помощью энергоэффективных приложений, в котором рассказал о технологических улучшениях и инструментах, представленных в Windows 7. Об управлении питанием в Windows 7 есть одна весьма интересная статья в блоге разработчиков ОС. А в этой статье мы изучим API управления питанием в Vista и сфокусируемся на управляемой библиотеке Windows Vista Bridge Library.

Разработчики могут предпринять несколько шагов, чтобы уменьшить энергопотребление приложений. Во-первых, нужно следить за тем, чтобы они минимально нагружали центральный процессор, так чтобы процессор чаще мог находиться в состоянии простоя (когда загрузка находится на уровне 2%). В случае перехода в режим простоя процессор снижает рабочую частоту своих ядер, что позволяет существенно увеличить время работы от аккумулятора. Являясь разработчиками, мы можем поддерживать низкую частоту с помощью событий и асинхронных уведомлений вместо беспрерывного опроса. Когда приложение проводит опрос с высокой частотой, оно увеличивает нагрузку на процессор и, как следствие, повышает общее энергопотребление.

Нижеприведенный график показывает, как увеличение интервала таймера увеличивает общее потребление питания. Изменение стандартной частоты опроса Windows с 15,6 до 1 миллисекунды может сократить время работы от одного заряда аккумулятора до 20%, так как частые запросы к процессору не позволят войти ему в режим ожидания. При использовании стандартного интервала опроса потребление процессором питания может находиться на уровне до 0,1 Вт, что, согласитесь, в сотню раз ниже 11 Вт, потребляемых компьютером в обычном режиме. Однако, при увеличении частоты таймера до 1 мс процессор потребляет уже 1,5 Вт, что приводит к увеличению общего энергопотребления примерно на 2 Вт.

clip_image002

Во-вторых, если приложение запускает службу, которая ожидает какого-либо события, как, например, подключения USB-устройства, есть ли смысл запускать ее, пока не произойдет ожидаемое событие? Данные рекомендации легко реализовать с помощью технологии Service Control Manager в Windows 7, о которой Викрам Сингх (Vikram Singh) рассказал во время своего замечательного доклада на PDC под названием Разрабатывая эффективные фоновые службы.

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

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

С этой целью мы можем использовать Windows Vista Bridge Library. В данную библиотеку включен целый раздел, посвященный связи встроенных API и .NET. В нем есть один класс, который особенно важен для приложений, использующих управляемый код, и применяется он для уведомления о типе питания. PowerManager позволяет приложению регистрировать события питания и запрашивать активный тип питания. Этот класс является статическим и программы могут получить к нему доступ в любой момент времени, запросив его свойства. PowerManager поддерживает актуальность информации, запуская фоновый процесс, который прослушивает события питания, происходящие в ОС. Этот поток никак не влияет на энергопотребление приложения.

Вот список некоторых функций и свойств, которые может предоставить PowerManager в зависимости от состояния питания:

· PowerManager.PowerPersonality – определяет активную схему питания

· PowerManager.PowerSource – определяет активный источник питания системы

· PowerManager.IsBatteryPresent – истинно в случае присутствия в системе аккумулятора (если только он предусмотрен в ноутбуке)

· PowerManager.IsUpsPresent – определяет, используется ли источник бесперебойного питания

· PowerManager.IsMonitorOn – определяет включен ли монитор

· PowerManager.MonitorRequired – определяет, должен ли монитор оставаться активным

· PowerManager.IsBatteryShortTerm – определяет, является ли аккумулятор малоемким

· PowerManager.BatteryLifePercent – определяет оставшийся заряд аккумулятора

· PowerManager.GetCurrentBatteryState() – выполняет снимок актуального состояния аккумулятора и обновляет PowerManager.

PowerManager также предоставляет набор событий, которые могут быть зарегистрированы приложением, чтобы получать уведомления при изменении состоянии питания:

· PowerManager. IsMonitorOnChanged – возникает при изменении состояния монитора

· PowerManager.BatteryLifePercentChanged – возникает при изменении процента заряда аккумулятора

· PowerManager.PowerPersonalityChanged – возникает каждый раз при изменении активной схемы питания

· PowerManager. PowerSourceChanged – возникает при изменении источника питания

· PowerManager.SystemBusyChanged – возникает, если в течение ближайшего будущего система не будет переходить в режим простоя. Приложения должны разрабатываться так, чтобы использовать преимущество данного состояния и запускать свои задания во время активной загрузки процессора, а не режима простоя.

Заметьте, что Windows Vista и Windows 7 разработаны таким образом, чтобы при любой возможности переходить в режим простоя. Однако, бывают ситуации, когда система понимает, что в ближайшее время перейти в состояние простоя не удастся из-за активных операций ввода-вывода. Система может проинформировать заинтересованное приложение о том, что она занята и не планирует переход в режим простоя. Это позволит приложению запустить свои задачи, пользуясь уже существующей высокой нагрузкой на процессор.

В Vista Bridge Library представлен пример использования PowerManager. Это простое WPF-приложение, которое с помощью PowerManager отображает активный статус питания и обновляет его при изменении состояния. При переходе ноутбука с питания от сети на аккумулятор, вы увидите, что тема Windows изменяется, и приложение зарегистрировало изменение источника питания:

clip_image004

Ниже представлен фрагмент кода для получения информации об источнике питания: 

 

 private void GetPowerSettings()
{settings.PowerPersonality = PowerManager.PowerPersonality.ToString();settings.PowerSource = PowerManager.PowerSource.ToString();settings.BatteryPresent = PowerManager.IsBatteryPresent;settings.UpsPresent = PowerManager.IsUpsPresent;settings.MonitorOn = PowerManager.IsMonitorOn;settings.MonitorRequired = PowerManager.MonitorRequired;
 if (PowerManager.IsBatteryPresent)
{

settings.BatteryShortTerm = PowerManager.IsBatteryShortTerm;
settings.BatteryLifePercent = PowerManager.BatteryLifePercent;
settings.BatteryState = PowerManager.GetCurrentBatteryState().ToString();

} }

А вот фрагмент кода для регистрации событий:

 

 // Adds event handlers for PowerManager events.

private void CapturePowerManagementEvents()

{
PowerManager.IsMonitorOnChanged += new EventHandler(MonitorOnChanged);
PowerManager.PowerPersonalityChanged += new EventHandler(PowerPersonalityChanged);
PowerManager.PowerSourceChanged += new EventHandler(PowerSourceChanged);

if (PowerManager.IsBatteryPresent) PowerManager.BatteryLifePercentChanged +=
                                   new EventHandler(BatteryLifePercentChanged);

PowerManager.SystemBusyChanged += new EventHandler(SystemBusyChanged);
}

Теперь дело за вами. Загружайте Windows Vista Bridge Sample Library и начинайте использовать Vista Power API – они будут работать точно так, как и в Windows 7.