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

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

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

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

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

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

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

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

Примечание.

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

 

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

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

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

Примечание.

Описание связи между однопоточными квартирами и многопоточными квартирами в рамках одного процесса см. в разделе "Однопоточное" и "Многопоточное взаимодействие".

 

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

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

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

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

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

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