Procesos, subprocesos y apartamentos
Un proceso es una colección de espacio de memoria virtual, código, datos y recursos del sistema. Un subproceso es código que se va a ejecutar en serie dentro de un proceso. Un procesador ejecuta subprocesos, no procesos, por lo que cada aplicación tiene al menos un proceso y un proceso siempre tiene al menos un subproceso de ejecución, conocido como subproceso principal. Un proceso puede tener varios subprocesos además del subproceso principal.
Los procesos se comunican entre sí a través de mensajes, mediante la tecnología de llamada a procedimiento remoto (RPC) de Microsoft para pasar información entre sí. No hay ninguna diferencia en el autor de la llamada entre una llamada procedente de un proceso en un equipo remoto y una llamada procedente de otro proceso en el mismo equipo.
Cuando un subproceso comienza a ejecutarse, continúa hasta que se elimina o hasta que se interrumpe por un subproceso con mayor prioridad (mediante una acción del usuario o el programador de subprocesos del kernel). Cada subproceso puede ejecutar secciones de código independientes o varios subprocesos pueden ejecutar la misma sección de código. Los subprocesos que ejecutan el mismo bloque de código mantienen pilas independientes. Cada subproceso de un proceso comparte las variables globales y los recursos del proceso.
El programador de subprocesos determina cuándo y con qué frecuencia ejecutar un subproceso, según una combinación del atributo de clase de prioridad del proceso y la prioridad base del subproceso. Para establecer el atributo de clase de prioridad de un proceso, llame a la función SetPriorityClass y establezca la prioridad base de un subproceso con una llamada a SetThreadPriority.
Las aplicaciones multiproceso deben evitar dos problemas de subproceso: interbloqueos y carreras. Un interbloqueo se produce cuando cada subproceso está esperando a que el otro haga algo. El control de llamadas COM ayuda a evitar interbloqueos en llamadas entre objetos. Una condición de carrera se produce cuando un subproceso finaliza antes de otro en el que depende, lo que hace que el primero use un valor no inicializado porque este último aún no ha proporcionado uno válido. COM proporciona algunas funciones diseñadas específicamente para ayudar a evitar condiciones de carrera en servidores fuera de proceso. (Consulte asistentes de implementación fuera del proceso del servidor).
El apartamento y la arquitectura de subprocesos COM
Aunque COM admite el modelo de un solo subproceso por proceso frecuente antes de la introducción de varios subprocesos de ejecución, puede escribir código para aprovechar varios subprocesos, lo que resulta en aplicaciones más eficaces, permitiendo que se ejecute un subproceso mientras otro subproceso espera a que se complete una operación que consume mucho tiempo.
Nota
El uso de varios subprocesos no es una garantía de un mejor rendimiento. De hecho, dado que la factorización de subprocesos es un problema difícil, el uso de varios subprocesos suele provocar problemas de rendimiento. La clave es usar varios subprocesos solo si está muy seguro de lo que está haciendo.
En general, la manera más sencilla de ver la arquitectura de subprocesos COM es pensar en todos los objetos COM del proceso como divididos en grupos denominados apartamentos. Un objeto COM reside exactamente en un apartamento, en el sentido de que sus métodos pueden llamarse legalmente solo por un subproceso que pertenece a ese apartamento. Cualquier otro subproceso que quiera llamar al objeto debe pasar por un proxy.
Hay dos tipos de apartamentos: apartamentos uniprocesos y apartamentos multiproceso.
- Los apartamentos de un solo subproceso constan exactamente de un subproceso, por lo que todos los objetos COM que residen en un apartamento de un solo subproceso pueden recibir llamadas de método solo desde el subproceso que pertenece a ese apartamento. Todas las llamadas de método a un objeto COM en un apartamento de un solo subproceso se sincronizan con la cola de mensajes de Windows para el subproceso del apartamento de un solo subproceso. Un proceso con un único subproceso de ejecución es simplemente un caso especial de este modelo.
- Los apartamentos multiproceso constan de uno o varios subprocesos, por lo que todos los objetos COM que residen en un apartamento multiproceso pueden recibir llamadas de método directamente desde cualquiera de los subprocesos que pertenecen al apartamento multiproceso. Los subprocesos de un apartamento multiproceso usan un modelo denominado subproceso libre. Las llamadas a objetos COM de un apartamento multiproceso se sincronizan mediante los propios objetos.
Nota
Para obtener una descripción de la comunicación entre apartamentos de un solo subproceso y apartamentos multiproceso dentro del mismo proceso, consulte Comunicación multiproceso y multiproceso.
Un proceso puede tener cero o más apartamentos uniprocesos y cero o un apartamento multiproceso.
En un proceso, el apartamento principal es el primero que se va a inicializar. En un proceso de un solo subproceso, este es el único apartamento. Los parámetros de llamada se serializa entre apartamentos y COM controla la sincronización a través de la mensajería. Si designa varios subprocesos en un proceso para que sean subprocesos libres, todos los subprocesos libres residen en un solo apartamento, los parámetros se pasan directamente a cualquier subproceso del apartamento y debe controlar toda la sincronización. En un proceso con subprocesos libres y subprocesos de apartamento, todos los subprocesos libres residen en un solo apartamento y todos los demás apartamentos son apartamentos de un solo subproceso. Un proceso que realiza trabajo COM es una colección de apartamentos con, como máximo, un apartamento multiproceso pero cualquier número de apartamentos de un solo subproceso.
Los modelos de subprocesos en COM proporcionan el mecanismo para que los clientes y servidores que usen diferentes arquitecturas de subprocesos funcionen conjuntamente. Las llamadas entre objetos con diferentes modelos de subprocesos en distintos procesos se admiten de forma natural. Desde la perspectiva del objeto que realiza la llamada, todas las llamadas a objetos fuera de un proceso se comportan de forma idéntica, independientemente de cómo se subprocese el objeto al que se llama. Del mismo modo, desde la perspectiva del objeto al que se llama, las llamadas que llegan se comportan de forma idéntica, independientemente del modelo de subprocesamiento del autor de la llamada.
La interacción entre un cliente y un objeto fuera de proceso es sencilla, incluso cuando usan modelos de subprocesos diferentes porque el cliente y el objeto están en procesos diferentes. COM, interpuesto entre el cliente y el servidor, puede proporcionar el código para que los modelos de subprocesos interoperan, mediante serialización estándar y RPC. Por ejemplo, si varios clientes de subprocesos libres llaman simultáneamente a un objeto de un solo subproceso, COM sincronizará las llamadas colocando los mensajes de ventana correspondientes en la cola de mensajes del servidor. El apartamento del objeto recibirá una llamada cada vez que recupera y envía mensajes. Sin embargo, se debe tener cuidado para asegurarse de que los servidores en proceso interactúan correctamente con sus clientes. (Consulte Problemas de subprocesos del servidor en proceso).
El problema más importante en la programación con un modelo multiproceso es hacer que el subproceso de código sea seguro para que los mensajes destinados a un subproceso determinado solo vayan a ese subproceso y el acceso a los subprocesos esté protegido.
Para obtener más información, vea los temas siguientes:
- Elección del modelo de subprocesos
- Apartamentos uniprocesos
- Apartamentos multiproceso
- Comunicación multiproceso y multiproceso
- Problemas de subprocesos del servidor en proceso
- Acceso a interfaces entre apartamentos