Управление временем существования объектов с помощью подсчета ссылок

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

В развивающейся, децентрализованной построенной системе, состоящей из повторно используемых компонентов, больше не верно, что любой клиент, или даже любой программист, всегда "знает", как справиться со временем существования компонента. Для клиента с правильными привилегиями безопасности все еще относительно легко создавать объекты с помощью простого запроса, но удаление объектов является еще одним вопросом полностью. Не обязательно ясно, когда объект больше не нужен и должен быть удален. (Читатели, знакомые с средами программирования, собранными мусором, например Java, могут не согласиться; однако объекты Java не охватывают компьютеры или даже границы процесса, поэтому сборка мусора ограничена объектами, живущими в пределах одного процесса. Кроме того, Java принудительно использует один язык программирования.) Даже если исходный клиент выполняется с объектом, он не может просто завершить работу объекта, так как некоторые другие клиенты или клиенты по-прежнему могут иметь ссылку на него.

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

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

Так же, как приложение должно освободить память, выделенную после того, как память больше не используется, клиент объекта несет ответственность за освобождение ссылок на объект, когда этот объект больше не нужен. В объектно-ориентированной системе клиент может сделать это только путем предоставления объекту инструкции для освобождения себя.

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

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

Дополнительные сведения см. в следующих разделах:

Использование и реализация IUnknown