Subprocesos y subprocesamientoThreads and Threading

Los sistemas operativos usan procesos para separar las distintas aplicaciones que ejecutan.Operating systems use processes to separate the different applications that they are executing. Los subprocesos son la unidad básica a la que el sistema operativo asigna tiempo de procesador, y más de un subproceso puede ejecutar código dentro de ese proceso.Threads are the basic unit to which an operating system allocates processor time, and more than one thread can be executing code inside that process. Cada subproceso mantiene controladores de excepciones, una prioridad de programación y un conjunto de estructuras que el sistema usa para guardar el contexto del subproceso hasta que esté programado.Each thread maintains exception handlers, a scheduling priority, and a set of structures the system uses to save the thread context until it is scheduled. El contexto del subproceso incluye toda la información que el subproceso necesita para reanudar sin problemas la ejecución, incluido el conjunto de pila y registros de CPU del subproceso, en el espacio de direcciones del proceso de host del subproceso.The thread context includes all the information the thread needs to seamlessly resume execution, including the thread's set of CPU registers and stack, in the address space of the thread's host process.

.NET Framework subdivide un proceso de sistema operativo en subprocesos administrados ligeros, denominados dominios de aplicación, representados por System.AppDomain.The .NET Framework further subdivides an operating system process into lightweight managed subprocesses, called application domains, represented by System.AppDomain. Uno o varios subprocesos administrados (representados por System.Threading.Thread) pueden ejecutarse en uno o varios de los dominios de aplicación dentro del mismo proceso administrado.One or more managed threads (represented by System.Threading.Thread) can run in one or any number of application domains within the same managed process. Aunque cada dominio de aplicación se inicia con un único subproceso, el código en ese dominio de aplicación puede crear dominios de aplicación adicionales y subprocesos adicionales.Although each application domain is started with a single thread, code in that application domain can create additional application domains and additional threads. El resultado es que un subproceso administrado puede moverse libremente entre dominios de aplicación dentro del mismo proceso administrado; es posible que solo un subproceso se mueva entre varios dominios de aplicación.The result is that a managed thread can move freely between application domains inside the same managed process; you might have only one thread moving among several application domains.

Un sistema operativo que admita multitarea preferente crea el efecto de ejecución simultánea de varios subprocesos desde varios procesos.An operating system that supports preemptive multitasking creates the effect of simultaneous execution of multiple threads from multiple processes. Esto se hace al dividir el tiempo de procesador disponible entre los subprocesos que lo necesitan, asignando un intervalo de tiempo de procesador a cada subproceso uno tras otro.It does this by dividing the available processor time among the threads that need it, allocating a processor time slice to each thread one after another. El subproceso actualmente en ejecución se suspende cuando el período de tiempo transcurre y otro subproceso reanuda su ejecución.The currently executing thread is suspended when its time slice elapses, and another thread resumes running. Cuando el sistema cambia de un subproceso a otro, guarda el contexto del subproceso del subproceso prioritario y vuelve a cargar el contexto del subproceso guardado del siguiente subproceso en la cola de subprocesos.When the system switches from one thread to another, it saves the thread context of the preempted thread and reloads the saved thread context of the next thread in the thread queue.

La duración del período de tiempo depende del sistema operativo y del procesador.The length of the time slice depends on the operating system and the processor. Dado que cada intervalo de tiempo es pequeño, varios subprocesos parecen ejecutarse al mismo tiempo, aunque solo haya un procesador.Because each time slice is small, multiple threads appear to be executing at the same time, even if there is only one processor. Este es realmente el caso en sistemas multiprocesador, donde los subprocesos ejecutables se distribuyen entre los procesadores disponibles.This is actually the case on multiprocessor systems, where the executable threads are distributed among the available processors.

Cuándo utilizar varios subprocesosWhen To Use Multiple Threads

El software que requiere la intervención del usuario debe reaccionar a las actividades del usuario lo más rápidamente posible para proporcionar una experiencia de usuario enriquecida.Software that requires user interaction must react to the user's activities as rapidly as possible to provide a rich user experience. Sin embargo, al mismo tiempo, debe hacer los cálculos necesarios para presentar los datos al usuario lo más rápido posible.At the same time, however, it must do the calculations necessary to present data to the user as fast as possible. Si la aplicación utiliza solo un subproceso de ejecución, puede combinar la programación asincrónica con la comunicación remota de .NET Framework o los servicios web XML creados con ASP .NET para utilizar el tiempo de procesamiento de otros equipos, además de los suyos propios, a fin de aumentar la capacidad de respuesta al usuario y reducir el tiempo de procesamiento de datos de la aplicación.If your application uses only one thread of execution, you can combine asynchronous programming with.NET Framework remoting or XML Web services created using ASP.NET to use the processing time of other computers in addition to that of your own to increase responsiveness to the user and decrease the data processing time of your application. Si está realizando trabajo intensivo de entrada/salida, también puede usar los puertos de terminación de E/S para aumentar la capacidad de respuesta de la aplicación.If you are doing intensive input/output work, you can also use I/O completion ports to increase your application's responsiveness.

Ventajas de varios subprocesosAdvantages of Multiple Threads

Sin embargo, utilizar más de un subproceso es la técnica más eficaz disponible para aumentar la capacidad de respuesta al usuario y procesar los datos necesarios para realizar el trabajo prácticamente al mismo tiempo.Using more than one thread, however, is the most powerful technique available to increase responsiveness to the user and process the data necessary to get the job done at almost the same time. En un equipo con un procesador, varios subprocesos pueden crear este efecto, aprovechando los breves períodos de tiempo entre eventos de usuario para procesar los datos en segundo plano.On a computer with one processor, multiple threads can create this effect, taking advantage of the small periods of time in between user events to process the data in the background. Por ejemplo, un usuario puede editar una hoja de cálculo mientras otro subproceso vuelve a calcular otras partes de la hoja de cálculo dentro de la misma aplicación.For example, a user can edit a spreadsheet while another thread is recalculating other parts of the spreadsheet within the same application.

Sin modificación, la misma aplicación aumentaría drásticamente la satisfacción del usuario cuando se ejecuta en un equipo con más de un procesador.Without modification, the same application would dramatically increase user satisfaction when run on a computer with more than one processor. El único dominio de aplicación podría utilizar varios subprocesos para realizar las tareas siguientes:Your single application domain could use multiple threads to accomplish the following tasks:

  • Comunicarse a través de una red con un servidor web y una base de datos.Communicate over a network, to a Web server, and to a database.

  • Realizar operaciones que requieren una gran cantidad de tiempo.Perform operations that take a large amount of time.

  • Distinguir tareas de diversas prioridades.Distinguish tasks of varying priority. Por ejemplo, un subproceso de prioridad alta administra tareas críticas en el tiempo, y un subproceso de prioridad baja realiza otras tareas.For example, a high-priority thread manages time-critical tasks, and a low-priority thread performs other tasks.

  • Permitir que la interfaz de usuario siga respondiendo, mientras se asigna tiempo a tareas en segundo plano.Allow the user interface to remain responsive, while allocating time to background tasks.

Desventajas de varios subprocesosDisadvantages of Multiple Threads

Se recomienda que utilice el menor número de subprocesos posibles, lo que minimiza el uso de recursos del sistema operativo y mejora el rendimiento.It is recommended that you use as few threads as possible, thereby minimizing the use of operating-system resources and improving performance. Los subprocesos también tienen requisitos de recursos y plantean conflictos potenciales que deben tenerse en cuenta al diseñar la aplicación.Threading also has resource requirements and potential conflicts to be considered when designing your application. Los requisitos de recursos son los siguientes:The resource requirements are as follows:

  • El sistema utiliza memoria para la información de contexto requerida por procesos, objetos AppDomain y subprocesos.The system consumes memory for the context information required by processes, AppDomain objects, and threads. Por lo tanto, el número de procesos, objetos AppDomain y subprocesos que se pueden crear está limitado por la memoria disponible.Therefore, the number of processes, AppDomain objects, and threads that can be created is limited by available memory.

  • Realizar un seguimiento de un número elevado de subprocesos consume un tiempo de procesador significativo.Keeping track of a large number of threads consumes significant processor time. Si hay demasiados subprocesos, la mayoría de ellos no progresará significativamente.If there are too many threads, most of them will not make significant progress. Si la mayoría de los subprocesos actuales se encuentran en un proceso, los subprocesos de otros procesos se programan con menos frecuencia.If most of the current threads are in one process, threads in other processes are scheduled less frequently.

  • Controlar la ejecución de código con muchos subprocesos es complicado y puede ser el origen de muchos errores.Controlling code execution with many threads is complex, and can be a source of many bugs.

  • Destruir subprocesos requiere saber lo que podría suceder y controlar dichos problemas.Destroying threads requires knowing what could happen and handling those issues.

Proporcionar acceso compartido a los recursos puede generar conflictos.Providing shared access to resources can create conflicts. Para evitar conflictos, debe sincronizar los recursos compartidos o controlar el acceso a ellos.To avoid conflicts, you must synchronize, or control the access to, shared resources. Si no se sincroniza el acceso correctamente (en los mismos dominios de aplicación o en dominios de aplicación diferentes), se pueden producir problemas como interbloqueos (en los que los dos subprocesos dejan de responder mientras cada uno espera a que el otro se complete) y condiciones de carrera (cuando se genera un resultado anómalo por una dependencia crítica inesperada de los intervalos de los dos eventos).Failure to synchronize access properly (in the same or different application domains) can lead to problems such as deadlocks (in which two threads stop responding while each waits for the other to complete) and race conditions (when an anomalous result occurs due to an unexpected critical dependence on the timing of two events). El sistema proporciona objetos de sincronización que pueden utilizarse para coordinar recursos compartidos entre varios subprocesos.The system provides synchronization objects that can be used to coordinate resource sharing among multiple threads. Reducir el número de subprocesos resulta más fácil para sincronizar recursos.Reducing the number of threads makes it easier to synchronize resources.

Los recursos que requieren sincronización incluyen:Resources that require synchronization include:

  • Recursos del sistema (por ejemplo, los puertos de comunicaciones).System resources (such as communications ports).

  • Recursos compartidos por varios procesos (por ejemplo, identificadores de archivo).Resources shared by multiple processes (such as file handles).

  • Los recursos de un único dominio de aplicación (como campos globales, estáticos y de instancia) a los que acceden varios subprocesos.The resources of a single application domain (such as global, static, and instance fields) accessed by multiple threads.

Subprocesos y diseño de la aplicaciónThreading and Application Design

En general, usar la clase ThreadPool es la manera más fácil de controlar varios subprocesos para tareas relativamente cortas que no bloquearán otros subprocesos y cuando no se espera ninguna programación particular de las tareas.In general, using the ThreadPool class is the easiest way to handle multiple threads for relatively short tasks that will not block other threads and when you do not expect any particular scheduling of the tasks. Sin embargo, hay una serie de motivos para crear sus propios subprocesos:However, there are a number of reasons to create your own threads:

  • Si necesita que una tarea tenga una prioridad determinada.If you need a task to have a particular priority.

  • Si tiene una tarea que podría ejecutarse durante mucho tiempo y, en consecuencia, bloquea otras tareas.If you have a task that might run a long time (and therefore block other tasks).

  • Si debe colocar los subprocesos en un contenedor uniproceso (todos los subprocesos ThreadPool están en el contenedor multiproceso).If you need to place threads into a single-threaded apartment (all ThreadPool threads are in the multithreaded apartment).

  • Si necesita una identidad estable asociada al subproceso.If you need a stable identity associated with the thread. Por ejemplo, debe usar un subproceso dedicado para abortar dicho subproceso, suspenderlo o detectarlo por su nombre.For example, you should use a dedicated thread to abort that thread, suspend it, or discover it by name.

  • Si necesita ejecutar subprocesos en segundo plano que interactúan con la interfaz de usuario, .NET Framework 2.0 proporciona un componente BackgroundWorker que se comunica mediante eventos, con serialización entre subprocesos, al subproceso de interfaz de usuario.If you need to run background threads that interact with the user interface, the .NET Framework version 2.0 provides a BackgroundWorker component that communicates using events, with cross-thread marshaling to the user-interface thread.

Subprocesos y excepcionesThreading and Exceptions

Controle las excepciones de los subprocesos.Do handle exceptions in threads. Las excepciones no controladas de los subprocesos, incluso los subprocesos en segundo plano, generalmente finalizan el proceso.Unhandled exceptions in threads, even background threads, generally terminate the process. Hay tres excepciones de esta regla:There are three exceptions to this rule:

Para más información, consulte Excepciones en subprocesos administrados.For more information, see Exceptions in Managed Threads.

Nota

En las versiones 1.0 y 1.1 de .NET Framework, Common Language Runtime intercepta silenciosamente algunas excepciones, por ejemplo, en los subprocesos del grupo de subprocesos.In the .NET Framework versions 1.0 and 1.1, the common language runtime silently traps some exceptions, for example in thread pool threads. Esto puede dañar el estado de la aplicación y puede acabar haciendo que las aplicaciones no respondan, lo cual puede ser muy difícil de depurar.This may corrupt application state and eventually cause applications to hang, which might be very difficult to debug.

Vea tambiénSee Also

ThreadPool
BackgroundWorker
Sincronizar datos para subprocesamiento múltipleSynchronizing Data for Multithreading
The Managed Thread Pool (Clase ThreadPool administrada)The Managed Thread Pool