Основы уведомления

Когда внешняя информация (такая как конфигурационные файлы, зона текущего времени или время суток, и т.д.) изменяется, в современных вычислениях разработчики часто должны узнавать.

Существует много способов решить эту проблему, которой уведомления всего один. Основные пути:

Несмотря на то, что механизмы уведомления отличаются значительно по подробным данным их реализации, они совместно используют общую цель проекта: разрешение получателя уведомления контролировать данные таким способом, минимизирующим наверху при включении проектов, которые устойчивы, даже если теряется уведомление.

Что такое уведомление?

На высоком уровне уведомление является сообщением, указывающим, что что-то изменилось. Порядки уведомления обычно комбинируют совместно используемое хранилище данных с механизмом передачи сообщений.

  Уведомление рисунка 1-1 с совместно используемым хранилищем данных
Notification with a shared data store

Именно эта комбинация делает порядки уведомления мощными. С передачей сообщений отдельно, Вы обращенным к компромиссу между производительностью и устойчивостью. Сетевой протокол UDP, например, относительно эффективен, но не предоставляет гарантии поставки. В отличие от этого, TCP предоставляет гарантии поставки, но дополнительные издержки, включенные при этом, сокращают производительность.

Точно так же с совместно используемой памятью отдельно, Вы обращенным к компромиссу между скоростью отклика и полной производительностью системы. При проверке совместно используемой памяти часто приложение казалось бы быстро реагирующим к изменениям в общем состоянии, но это было бы также пожиратель ресурсов ресурсы CPU. В отличие от этого, если бы Вы проверяете менее часто, загрузка ЦП была бы уменьшена, но приложение было бы менее быстро реагирующим.

Путем разделения данных от сообщения можно получить устойчивость, скорость отклика и производительность. Поскольку сообщение отправляется в приложение получения, приложение получения не должно постоянно проверять на изменение состояния. Это приводит к скорости отклика без потерь производительности, связанных с опросом.

Точно так же, потому что хранилище данных совместно используется, приложение получения может запросить текущую информацию и действовать на нее в любое время. Таким образом то приложение могло иногда проверять совместно используемое хранилище, чтобы удостовериться, что данные не изменились за его спиной. Также это могло сделать такую проверку прежде, чем выполнить любые особенно критические операции для обеспечения правильности.

Таким образом уведомление может быть по сравнению с доской объявлений. Если Вы - хранитель платы, можно разместить информацию на плате. Можно сказать другим людям, что была размещена новая информация. Другие могут тогда смотреть на плату каждый раз, когда удобно для них сделать так. Однако, если кому-то не удается получить такое сообщение, он или она может все еще смотреть на доску объявлений прежде, чем принять критическое решение. При желании люди могут даже блуждать и смотреть на плату без регистрации для получения уведомлений.

Что объединяет?

Слово объединяет, означает “объединяться”. В контексте уведомлений, если два уведомления имеют идентичное содержание, это означает две вещи:

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

Для максимизации объединения сообщений необходимо минимизировать полезную нагрузку как можно больше. Дарвинские уведомления, например, которые не переносят полезной нагрузки кроме имени уведомления, могут быть объединены очень легко.

Какие типы совместно используемого хранилища могут использоваться?

Совместно используемое хранилище данных, используемое для уведомления, может быть файлом, POSIX или общей памятью System V, записью базы данных или чем-то еще полностью, на усмотрение разработчика, создающего порядок уведомления. Единственное надежное требование для совместно используемого хранилища - то, что это должно быть доступно и для отправки и для приложения получения — т.е. что это должно фактически быть совместно используемое хранилище.

Для уведомлений, сгенерированных компонентами OS X, хранение обычно является файлом на диске или commpage расположении (изменения даты и времени, например). Однако расположение не должно быть единственным физическим расположением вообще. Вместо этого это могло быть приложение, собирающее информацию от всюду по файловой системе или API для получения данных от более низких уровней операционной системы. Например, в ответ на уведомление изменения сети, Ваше приложение могло бы попросить у операционной системы обновленной информации о сетевом интерфейсе через любое число APIs.

Приложения часто реализуют совместно используемое хранилище как часть одного из приложений с помощью общей памяти System V или POSIX. Это имеет преимущество не создания ненужных файлов на диске, но это может сделать восстановление состояния после сбоя приложения невозможным. Это может или может не быть проблемой, в зависимости от приложения и природы совместно используемых данных.

Другая стандартная форма совместно используемой памяти является файлом с отображенной памятью. К карте распределения памяти файл необходимо сначала создать файл (надлежащей длины), затем вызвать mmap(2) на том файле. Когда Вы заканчиваете с файлом, Вы удаляете его, поскольку Вы были бы любой другой временный файл. Отображение памяти имеет преимущество создания восстановления состояния, возможного в случае катастрофического отказа. Однако это имеет недостаток загрязнения буферного кэша. Если Ваше приложение зависит от быстрого диска I/O (такой как аудиоприложение) для правильности, необходимо, вероятно, использовать общую память вместо этого.

Какие механизмы передачи сообщений могут использоваться?

Уведомления могут быть переданы с помощью любого числа механизмов от Событий Apple до UDP (и все промежуточное). Большинство уведомлений, однако, отправляется с Дарвинскими уведомлениями (описанное в Дарвинских Понятиях Уведомления) или технология, созданная поверх Дарвинских уведомлений, таких как Базовые уведомления Основы (описанный в Ссылке CFNotificationCenter) или уведомления Какао (описанный в Ссылке класса NSNotificationCenter).

Как нужно назвать уведомления?

Уведомления нужно назвать с помощью именования обратного стиля DNS. Например, если команда MkLinux выпустила вызванного демона kernel_daemon это обеспечило вызванное уведомление kernel_loaded, то уведомление назвали бы org.mklinux.kernel_daemon.kernel_loaded.

Причина этого соглашения о присвоении имен состоит в том, чтобы избежать коллизий; пространство имен уведомления совместно используется через все приложения в системе, и на Дарвинском уровне уведомления и на более высоких уровнях с Базовыми уведомлениями Основы или Какао.