Поделиться через


Процессы, потоки и апартаменты

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

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

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

Планировщик потоков определяет время и частоту выполнения потока в соответствии с сочетанием атрибута класса приоритета процесса и базового приоритета потока. Вы задаете атрибут класса приоритета процесса путем вызова функции SetPriorityClass , и вы задаете базовый приоритет потока с вызовом SetThreadPriority.

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

Квартира и архитектура потоков COM

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

Замечание

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

 

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

Существует два типа квартир: однопоточные квартиры и многопоточные квартиры.

  • Однопоточные квартиры состоят ровно из одного потока, поэтому все COM-объекты, находящиеся в однопоточной квартире, могут получать вызовы методов только из одного потока, принадлежащего этой квартире. Все вызовы метода к COM-объекту в однопоточной квартире синхронизируются с очередью сообщений Windows для потока однопоточной квартиры. Процесс с одним потоком выполнения — это просто особый случай этой модели.
  • Многопоточные квартиры состоят из одного или нескольких потоков, поэтому все объекты COM, живущие в многопоточной квартире, могут получать вызовы методов непосредственно из любого из потоков, принадлежащих многопоточной квартире. Потоки в многопоточной квартире используют модель, называемую свободным потоком. Вызовы COM-объектов в многопоточных апартаментах синхронизируются самими объектами.

Замечание

Описание коммуникации между однопоточными апартаментами и многопоточными апартаментами в рамках одного процесса, подробнее см. в разделе Single-Threaded и многопоточная коммуникация.

 

Процесс может иметь ноль или несколько однопоточных апартаментов и ноль или один многопоточный апартамент.

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

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

Взаимодействие между клиентом и внепроцессным объектом просто, даже если они используют различные модели потоков, так как клиент и объект находятся в разных процессах. COM, взаимодействующий между клиентом и сервером, может предоставить код для взаимодействия моделей многопоточности с использованием стандартного маршалинга и RPC. Например, если однопоточный объект вызывается одновременно несколькими многопоточными клиентами, вызовы будут синхронизированы COM путем помещения соответствующих оконных сообщений в очередь сообщений сервера. Квартира объекта будет получать по одному вызову при каждом получении и отправке сообщений. Однако необходимо принять некоторые меры, чтобы обеспечить правильное взаимодействие серверов в процессе с клиентами. (См. In-Process проблемы многопоточности сервера.)

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

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