En informática , un proceso es la instancia de un programa informático que se ejecuta mediante uno o varios subprocesos . Existen muchos modelos de procesos diferentes, algunos de los cuales son ligeros, pero casi todos los procesos (incluso las máquinas virtuales completas ) tienen su raíz en un proceso del sistema operativo (OS) que comprende el código del programa, los recursos del sistema asignados, los permisos de acceso físicos y lógicos y las estructuras de datos para iniciar, controlar y coordinar la actividad de ejecución. Dependiendo del SO, un proceso puede estar formado por varios subprocesos de ejecución que ejecutan instrucciones simultáneamente . [1] [2]
Mientras que un programa informático es una colección pasiva de instrucciones que normalmente se almacenan en un archivo en el disco, un proceso es la ejecución de esas instrucciones después de ser cargadas desde el disco a la memoria. Varios procesos pueden estar asociados con el mismo programa; por ejemplo, abrir varias instancias del mismo programa a menudo da como resultado la ejecución de más de un proceso.
La multitarea es un método que permite que varios procesos compartan procesadores (CPU) y otros recursos del sistema. Cada CPU (núcleo) ejecuta un solo proceso a la vez. Sin embargo, la multitarea permite que cada procesador alterne entre tareas que se están ejecutando sin tener que esperar a que finalice cada tarea ( preempción ). Dependiendo de la implementación del sistema operativo, los cambios se pueden realizar cuando las tareas se inician y esperan la finalización de las operaciones de entrada/salida , cuando una tarea cede voluntariamente la CPU, en interrupciones de hardware y cuando el programador del sistema operativo decide que un proceso ha expirado su parte justa de tiempo de CPU (por ejemplo, por el Programador completamente justo del kernel de Linux ).
Una forma común de multitarea es proporcionada por el tiempo compartido de la CPU , que es un método para intercalar la ejecución de los procesos y subprocesos de los usuarios, e incluso de tareas independientes del núcleo, aunque esta última característica solo es posible en núcleos preemptivos como Linux . La preempción tiene un efecto secundario importante para los procesos interactivos a los que se les da mayor prioridad con respecto a los procesos limitados por la CPU, por lo tanto, a los usuarios se les asignan inmediatamente recursos informáticos con solo presionar una tecla o mover un mouse. Además, a las aplicaciones como la reproducción de video y música se les da algún tipo de prioridad en tiempo real, preempting cualquier otro proceso de menor prioridad. En los sistemas de tiempo compartido, los cambios de contexto se realizan rápidamente, lo que hace que parezca que se están ejecutando múltiples procesos simultáneamente en el mismo procesador. Esta ejecución aparentemente simultánea de múltiples procesos se llama concurrencia .
Por razones de seguridad y confiabilidad, la mayoría de los sistemas operativos modernos evitan la comunicación directa entre procesos independientes y proporcionan una comunicación entre procesos estrictamente mediada y controlada.
En general, un proceso de un sistema informático consta de (o se dice que posee ) los siguientes recursos:
El sistema operativo guarda la mayor parte de esta información sobre los procesos activos en estructuras de datos llamadas bloques de control de procesos . Cualquier subconjunto de los recursos, normalmente al menos el estado del procesador, puede estar asociado con cada uno de los subprocesos del proceso en sistemas operativos que admiten subprocesos o procesos secundarios .
El sistema operativo mantiene sus procesos separados y les asigna los recursos que necesitan, de modo que es menos probable que interfieran entre sí y provoquen fallas del sistema (por ejemplo, bloqueos o bloqueos ). El sistema operativo también puede proporcionar mecanismos para la comunicación entre procesos a fin de permitir que estos interactúen de manera segura y predecible.
Un sistema operativo multitarea puede simplemente cambiar entre procesos para dar la apariencia de muchos procesos ejecutándose simultáneamente (es decir, en paralelo ), aunque en realidad solo un proceso puede estar ejecutándose a la vez en una sola CPU (a menos que la CPU tenga múltiples núcleos, en cuyo caso se puede usar multihilo u otras tecnologías similares). [a]
Es habitual asociar un único proceso con un programa principal y los procesos secundarios con cualquier proceso paralelo derivado, que se comportan como subrutinas asincrónicas . Se dice que un proceso posee recursos, de los cuales una imagen de su programa (en memoria) es uno de esos recursos. Sin embargo, en sistemas multiprocesamiento muchos procesos pueden ejecutarse a partir del mismo programa reentrante o compartirlo en la misma ubicación de la memoria, pero se dice que cada proceso posee su propia imagen del programa.
En los sistemas operativos integrados, los procesos suelen denominarse "tareas" . El sentido de "proceso" (o tarea) es "algo que ocupa tiempo", en contraposición a "memoria", que es "algo que ocupa espacio". [b]
La descripción anterior se aplica tanto a los procesos administrados por un sistema operativo como a los procesos definidos por los cálculos de procesos .
Si un proceso solicita algo por lo que debe esperar, se bloqueará. Cuando el proceso está en estado bloqueado , es elegible para intercambiarse con el disco, pero esto es transparente en un sistema de memoria virtual , donde las regiones de la memoria de un proceso pueden estar realmente en el disco y no en la memoria principal en cualquier momento. Incluso partes de procesos/tareas activos (programas en ejecución) son elegibles para intercambiarse con el disco, si las partes no se han utilizado recientemente. No todas las partes de un programa en ejecución y sus datos tienen que estar en la memoria física para que el proceso asociado esté activo.
Un núcleo de sistema operativo que permite la multitarea necesita que los procesos tengan determinados estados . Los nombres de estos estados no están estandarizados, pero tienen una funcionalidad similar. [1]
Cuando los procesos necesitan comunicarse entre sí, deben compartir partes de sus espacios de direcciones o utilizar otras formas de comunicación entre procesos (IPC). Por ejemplo, en una tubería de shell , la salida del primer proceso debe pasar al segundo, y así sucesivamente. Otro ejemplo es una tarea que se ha descompuesto en procesos cooperativos pero parcialmente independientes que pueden ejecutarse simultáneamente (es decir, utilizando concurrencia o paralelismo verdadero; este último modelo es un caso particular de ejecución concurrente y es factible siempre que haya múltiples núcleos de CPU disponibles para los procesos que están listos para ejecutarse).
Incluso es posible que dos o más procesos se ejecuten en diferentes máquinas que pueden ejecutar diferentes sistemas operativos (OS), por lo tanto, se necesitan algunos mecanismos de comunicación y sincronización (llamados protocolos de comunicaciones para computación distribuida) (por ejemplo, la Interfaz de Paso de Mensajes {MPI}).
A principios de la década de 1960, el software de control de computadoras había evolucionado desde el software de control de monitores, por ejemplo IBSYS , hasta el software de control ejecutivo. Con el tiempo, las computadoras se volvieron más rápidas mientras que el tiempo de las computadoras todavía no era barato ni se utilizaba por completo; un entorno de este tipo hizo posible y necesaria la multiprogramación . La multiprogramación significa que varios programas se ejecutan simultáneamente . Al principio, más de un programa se ejecutaba en un solo procesador, como resultado de la arquitectura subyacente de la computadora monoprocesador , y compartían recursos de hardware escasos y limitados; en consecuencia, la concurrencia era de naturaleza serial . En sistemas posteriores con múltiples procesadores , varios programas pueden ejecutarse simultáneamente en paralelo .
Los programas consisten en secuencias de instrucciones para los procesadores. Un solo procesador puede ejecutar sólo una instrucción a la vez: es imposible ejecutar más programas al mismo tiempo. Un programa puede necesitar algún recurso , como un dispositivo de entrada, que tiene un gran retraso, o un programa puede iniciar alguna operación lenta, como enviar la salida a una impresora. Esto haría que el procesador estuviera "inactivo" (sin uso). Para mantener el procesador ocupado en todo momento, la ejecución de dicho programa se detiene y el sistema operativo cambia el procesador para ejecutar otro programa. Para el usuario, parecerá que los programas se ejecutan al mismo tiempo (de ahí el término "paralelo").
Poco después, la noción de "programa" se amplió a la noción de "programa en ejecución y su contexto". Nació el concepto de proceso, que también se hizo necesario con la invención del código reentrante . Los subprocesos llegaron algo más tarde. Sin embargo, con la llegada de conceptos como el tiempo compartido , las redes informáticas y los ordenadores con memoria compartida con múltiples CPU , la antigua "multiprogramación" dio paso a la verdadera multitarea , el multiprocesamiento y, más tarde, el multihilo .