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

Автор: Topol Четверг, Май 3rd, 2012 Нет комментариев

Рубрика: Операционные системы

В нынешнее время, когда уровень использования мобильных устройств растет с каждым днем, вопрос энергопотребления ноутбуков приобретает особую важность. Учитывая, что за прошлый год уровень продаж ноутбуков вырос на 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 Вт.

Во-вторых, если приложение запускает службу, которая ожидает какого-либо события, как, например, подключения 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 изменяется, и приложение зарегистрировало изменение источника питания:

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

Код:
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;

(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.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты