Un proceso es un programa en ejecución y una parte integral de cualquier sistema operativo (SO) moderno . El SO debe asignar recursos a los procesos , permitir que los procesos compartan e intercambien información, proteger los recursos de cada proceso de otros procesos y permitir la sincronización entre procesos. Para cumplir con estos requisitos, el SO debe mantener una estructura de datos para cada proceso, que describa el estado y la propiedad de los recursos de ese proceso, y que permita al sistema operativo ejercer control sobre cada proceso.
Multiprogramación
En cualquier sistema operativo moderno, puede haber más de una instancia de un programa cargado en la memoria al mismo tiempo. Por ejemplo, más de un usuario puede estar ejecutando el mismo programa, y cada usuario puede tener copias separadas del programa cargadas en la memoria. Con algunos programas, es posible tener una copia cargada en la memoria, mientras que varios usuarios tienen acceso compartido a ella para que cada uno pueda ejecutar el mismo código de programa. Un programa de este tipo se llama reentrante . [ ¿relevante? ] En un instante dado, el procesador solo puede estar ejecutando una instrucción de un programa, pero varios procesos pueden mantenerse durante un período de tiempo asignando cada proceso al procesador a intervalos mientras el resto se vuelve temporalmente inactivo. La ejecución de múltiples procesos durante un período de tiempo, en lugar de simultáneamente, se conoce como ejecución concurrente.
Un sistema operativo multiprogramación o multitarea es un sistema que puede ejecutar muchos procesos simultáneamente. La multiprogramación requiere que el procesador se asigne a cada proceso durante un período de tiempo y se desasigne o se libere en el momento adecuado. Si se desasigna el procesador durante la ejecución de un proceso, debe hacerse de manera que el proceso pueda reiniciarse más tarde de la manera más eficiente posible.
Hay dos formas en las que un sistema operativo puede recuperar el control del procesador durante la ejecución de un programa para que el sistema operativo pueda realizar la asignación o desasignación:
- El proceso emite una llamada al sistema (a veces llamada interrupción de software ); por ejemplo, se produce una solicitud de E/S que solicita acceso a un archivo en un disco duro.
- Se produce una interrupción de hardware ; por ejemplo, se presiona una tecla en el teclado o se agota un temporizador (se utiliza en multitarea preventiva ).
La detención de un proceso y el inicio (o reinicio) de otro proceso se denomina cambio de contexto. En muchos sistemas operativos modernos, los procesos pueden constar de muchos subprocesos. Esto introduce el concepto de hilo . Un hilo puede considerarse un subproceso ; es decir, una secuencia de ejecución separada e independiente dentro del código de un proceso. Los hilos están adquiriendo cada vez más importancia en el diseño de sistemas distribuidos y cliente-servidor y en el software que se ejecuta en sistemas multiprocesador .
Cómo la multiprogramación aumenta la eficiencia
Un rasgo común observado entre los procesos asociados con la mayoría de los programas informáticos es que alternan entre ciclos de CPU y ciclos de E/S . Durante la parte del tiempo requerida para los ciclos de CPU, el proceso se está ejecutando y está ocupando la CPU. Durante el tiempo requerido para los ciclos de E/S, el proceso no está utilizando el procesador. En cambio, está esperando para realizar la entrada/salida, o está realmente realizando la entrada/salida. Un ejemplo de esto es leer o escribir en un archivo en el disco. Antes de la llegada de la multiprogramación , las computadoras operaban como sistemas de un solo usuario. Los usuarios de tales sistemas rápidamente se dieron cuenta de que durante gran parte del tiempo que una computadora estaba asignada a un solo usuario (por ejemplo, cuando un usuario estaba ingresando información o depurando programas), el procesador estaba inactivo. Los científicos informáticos observaron que el rendimiento general de la máquina podría mejorarse permitiendo que un proceso diferente use el procesador siempre que un proceso estuviera esperando entrada/salida. En un sistema de uniprogramación , si N usuarios tuvieran que ejecutar programas con tiempos de ejecución individuales de t 1 , t 2 , ..., t N , entonces el tiempo total, t uni , para atender los N procesos (consecutivamente) de todos los N usuarios sería:
- tuni = t1 + t2 + ... + tN .
Sin embargo, como cada proceso consume tanto ciclos de CPU como ciclos de E/S, el tiempo que cada proceso realmente utiliza la CPU es una fracción muy pequeña del tiempo total de ejecución del proceso. Por lo tanto, para el proceso i :
- t i (procesador) ≪ t i (ejecución)
dónde
t i (procesador) es el tiempo que el proceso i pasa utilizando la CPU, y t i (ejecución) es el tiempo total de ejecución del proceso; es decir, el tiempo que tardan los ciclos de CPU más los ciclos de E/S en realizarse (ejecutarse) hasta completar el proceso.
De hecho, normalmente la suma de todo el tiempo de procesador utilizado por N procesos rara vez excede una pequeña fracción del tiempo necesario para ejecutar cualquiera de los procesos;
Por lo tanto, en los sistemas de uniprogramación, el procesador permanece inactivo durante una parte considerable del tiempo. Para superar esta ineficiencia, ahora se implementa la multiprogramación en los sistemas operativos modernos, como Linux , UNIX y Microsoft Windows . Esto permite que el procesador cambie de un proceso, X, a otro, Y, siempre que X esté involucrado en la fase de E/S de su ejecución. Dado que el tiempo de procesamiento es mucho menor que el tiempo de ejecución de un solo trabajo, el tiempo total para dar servicio a todos los N usuarios con un sistema de multiprogramación se puede reducir aproximadamente a:
- t multi = máx( t 1 , t 2 , ..., t N )
Errays Abdullah
Los sistemas operativos necesitan algunas formas de crear procesos. En un sistema muy simple diseñado para ejecutar una sola aplicación (por ejemplo, el controlador de un horno microondas), es posible que todos los procesos que se necesitarán estén presentes cuando se inicie el sistema. Sin embargo, en sistemas de propósito general, se necesita alguna forma de crear y finalizar procesos según sea necesario durante la operación.
Hay cuatro eventos principales que hacen que se cree un proceso:
- Inicialización del sistema.
- Ejecución de una llamada al sistema de creación de procesos por un proceso en ejecución.
- Una solicitud de usuario para crear un nuevo proceso.
- Iniciación de un trabajo por lotes.
Cuando se inicia un sistema operativo, se inician varios procesos esenciales para preparar el sistema para su funcionamiento. Algunos de ellos son procesos en primer plano, que interactúan con un usuario (humano) y realizan tareas para él. Otros son procesos en segundo plano , que no están asociados a usuarios particulares, sino que tienen alguna función específica. Por ejemplo, un proceso en segundo plano puede estar diseñado para aceptar correos electrónicos entrantes, permanecer inactivo la mayor parte del día, pero de repente volver a la vida cuando llega un correo electrónico entrante. Se podría diseñar un proceso en segundo plano alternativo para aceptar solicitudes entrantes de páginas web alojadas en la máquina, y activarse solo cuando llega una solicitud para atenderlo.
La creación de procesos en UNIX y Linux se realiza mediante llamadas al sistema fork() o clone(). Hay varios pasos involucrados en la creación de un proceso. El primer paso es la validación de si el proceso padre tiene suficiente autorización para crear un proceso. Tras una validación exitosa, el proceso padre se copia casi en su totalidad, con cambios solo en el identificador único del proceso, el proceso padre y el espacio de usuario. Cada nuevo proceso obtiene su propio espacio de usuario. [1]
La creación de procesos en Windows se realiza a través de la llamada al sistema CreateProcessA(). Un nuevo proceso se ejecuta en el contexto de seguridad del proceso que lo llama, pero por lo demás se ejecuta independientemente del proceso que lo llama. Existen métodos para modificar el contexto de seguridad en el que se ejecuta un nuevo proceso. A los nuevos procesos se les asignan identificadores mediante los cuales se puede acceder a ellos. Se proporcionan funciones para sincronizar los subprocesos que llaman con los procesos recién creados. [2] [3]
Terminación del proceso
Existen muchas razones para la terminación de un proceso:
- Problemas con trabajos por lotes que detienen la instrucción
- El usuario cierra la sesión
- El proceso ejecuta una solicitud de servicio para finalizar
- Condiciones de error y falla
- Finalización normal
- Límite de tiempo excedido
- Memoria no disponible
- Violación de límites; por ejemplo: intento de acceso al undécimo elemento (inexistente) de una matriz de 10 elementos
- Error de protección; por ejemplo: se intentó escribir en un archivo de solo lectura
- Error aritmético ; por ejemplo: intento de división por cero
- Exceso de tiempo; por ejemplo: el proceso esperó más tiempo que un máximo especificado para un evento
- Fallo de E/S
- Instrucción no válida; por ejemplo: cuando un proceso intenta ejecutar datos (texto)
- Instrucción privilegiada
- Uso indebido de datos
- Intervención del sistema operativo ; por ejemplo: para resolver un bloqueo
- El padre finaliza, por lo que los procesos secundarios finalizan (terminación en cascada)
- Solicitud de los padres
Modelo de gestión de procesos de dos estados
La principal responsabilidad del sistema operativo es controlar la ejecución de los procesos . Esto incluye determinar el patrón de intercalación para la ejecución y la asignación de recursos a los procesos. Una parte del diseño de un sistema operativo es describir el comportamiento que nos gustaría que exhibiera cada proceso. El modelo más simple se basa en el hecho de que un proceso está siendo ejecutado por un procesador o no. Por lo tanto, se puede considerar que un proceso está en uno de dos estados, EN EJECUCIÓN o NO EN EJECUCIÓN . Cuando el sistema operativo crea un nuevo proceso, ese proceso se etiqueta inicialmente como NO EN EJECUCIÓN y se coloca en una cola en el sistema en el estado NO EN EJECUCIÓN . El proceso (o una parte de él) existe entonces en la memoria principal y espera en la cola una oportunidad para ser ejecutado. Después de un período de tiempo, el proceso que se está EJECUTANDO actualmente se interrumpirá y se moverá del estado EN EJECUCIÓN al estado NO EN EJECUCIÓN , lo que hará que el procesador esté disponible para un proceso diferente. La parte de despacho del sistema operativo seleccionará entonces, de la cola de procesos NO EN EJECUCIÓN , uno de los procesos en espera para transferirlo al procesador. El proceso elegido se vuelve a etiquetar de un estado NO EN EJECUCIÓN a un estado EN EJECUCIÓN y su ejecución se inicia si es un proceso nuevo o se reanuda si es un proceso que se interrumpió anteriormente.
A partir de este modelo, podemos identificar algunos elementos de diseño del sistema operativo:
- La necesidad de representar y realizar un seguimiento de cada proceso
- El estado de un proceso
- La puesta en cola de procesos NO EN EJECUCIÓN
Modelo de gestión de procesos de tres estados
Aunque el modelo de gestión de procesos de dos estados es un diseño perfectamente válido para un sistema operativo, la ausencia de un estado BLOQUEADO significa que el procesador permanece inactivo cuando el proceso activo cambia de ciclos de CPU a ciclos de E/S . Este diseño no hace un uso eficiente del procesador. El modelo de gestión de procesos de tres estados está diseñado para superar este problema, introduciendo un nuevo estado llamado estado BLOQUEADO . Este estado describe cualquier proceso que esté esperando que se produzca un evento de E/S. En este caso, un evento de E/S puede significar el uso de algún dispositivo o una señal de otro proceso. Los tres estados de este modelo son:
- EN EJECUCIÓN: El proceso que se está ejecutando actualmente.
- LISTO: Un proceso que está en cola y preparado para ejecutarse cuando se le da la oportunidad.
- BLOQUEADO: Un proceso que no puede ejecutarse hasta que ocurra algún evento, como la finalización de una operación de E/S.
En cualquier instante, un proceso se encuentra en uno y sólo uno de los tres estados. En un ordenador con un solo procesador, sólo un proceso puede estar en el estado EN EJECUCIÓN en cualquier instante. Puede haber muchos procesos en los estados LISTO y BLOQUEADO , y cada uno de estos estados tendrá una cola asociada para procesos.
Los procesos que ingresan al sistema deben pasar inicialmente al estado LISTO , y solo pueden ingresar al estado EN EJECUCIÓN a través del estado LISTO . Normalmente, los procesos abandonan el sistema desde el estado EN EJECUCIÓN . En cada uno de los tres estados, el proceso ocupa espacio en la memoria principal. Si bien el motivo de la mayoría de las transiciones de un estado a otro puede ser obvio, es posible que algunas no lo sean tanto.
- EN EJECUCIÓN → LISTO: La razón más común para esta transición es que el proceso en ejecución ha alcanzado el tiempo máximo permitido para una ejecución ininterrumpida; es decir, se agota el tiempo de espera. Otras razones pueden ser la imposición de niveles de prioridad determinados por lapolítica de programación utilizada para el Programador de bajo nivel y la llegada de un proceso de mayor prioridad al estado LISTO.
- EN EJECUCIÓN → BLOQUEADO: Un proceso se pone en estado BLOQUEADO si solicita algo por lo que debe esperar. Una solicitud al SO suele tener la forma de una llamada al sistema (es decir, una llamada del proceso en ejecución a una función que forma parte del código del SO). Por ejemplo, un proceso puede quedar BLOQUEADO si solicita un archivo del disco o guarda una sección de código o datos de la memoria en un archivo del disco.
Descripción y control del proceso
Cada proceso del sistema está representado por una estructura de datos llamada Bloque de Control de Proceso (PCB), o Descriptor de Proceso en Linux .
Identificación del proceso : cada proceso se identifica de forma única mediante la identificación del usuario y un puntero que lo conecta a su descriptor.
Estado del proceso : Esto indica el estado actual del proceso; LISTO , EN EJECUCIÓN , BLOQUEADO , LISTO SUSPENDER , BLOQUEADO SUSPENDER .
Estado del proceso : contiene toda la información necesaria para indicar el estado actual del trabajo.
Contabilidad : Contiene información que se utiliza principalmente para fines de facturación y medición del rendimiento. Indica qué tipo de recursos ha utilizado el proceso y durante cuánto tiempo.
Modos de procesador
Los procesadores contemporáneos incorporan un bit de modo para definir la capacidad de ejecución de un programa en el procesador. Este bit puede configurarse en modo kernel o modo usuario . El modo kernel también se conoce comúnmente como modo supervisor , modo monitor o anillo 0 .
En el modo kernel, el procesador puede ejecutar todas las instrucciones de su repertorio de hardware, mientras que en el modo de usuario, solo puede ejecutar un subconjunto de las instrucciones. Las instrucciones que solo se pueden ejecutar en el modo kernel se denominan instrucciones de kernel, privilegiadas o protegidas para distinguirlas de las instrucciones del modo de usuario. Por ejemplo, las instrucciones de E/S son privilegiadas. Por lo tanto, si un programa de aplicación se ejecuta en el modo de usuario, no puede realizar su propia E/S . En cambio, debe solicitar al sistema operativo que realice la E/S en su nombre.
El concepto del sistema Kernel
Las partes críticas del SO se ejecutan en modo kernel , mientras que otros programas (como utilidades del sistema y programas de aplicación) se ejecutan en modo usuario . Esto sirve como la distinción fundamental entre el SO y otro software del sistema . La parte del sistema que se ejecuta en modo kernel se llama kernel o núcleo del SO. El kernel está diseñado como software confiable, lo que significa que implementa mecanismos de protección que no pueden ser modificados de forma encubierta por software no confiable que se ejecuta en modo usuario. Las extensiones del SO funcionan en modo usuario , por lo que la funcionalidad principal del SO no depende de estas extensiones para su correcto funcionamiento.
Una decisión clave de diseño para cualquier función del sistema operativo es determinar si se debe implementar en el núcleo. Si se implementa en el núcleo, funciona en modo núcleo, obteniendo acceso a otras partes del núcleo y siendo confiable para ellas. Por el contrario, si la función se ejecuta en modo usuario , carece de acceso a las estructuras de datos del núcleo, pero requiere un esfuerzo mínimo para invocarla. Aunque las funciones implementadas en el núcleo pueden ser sencillas, el mecanismo de trampa y el proceso de autenticación necesarios durante la llamada pueden consumir relativamente muchos recursos. Si bien el código del núcleo en sí se ejecuta de manera eficiente, la sobrecarga asociada con la llamada puede ser significativa. Esta es una distinción sutil pero importante.
Solicitar servicios del sistema
Hay dos técnicas mediante las cuales un programa que se ejecuta en modo usuario puede solicitar los servicios del núcleo :
Los sistemas operativos están diseñados con una u otra de estas dos funciones, pero no con ambas. En primer lugar, supongamos que un proceso de usuario desea invocar una función de sistema de destino particular. Para el enfoque de llamada de sistema , el proceso de usuario utiliza la instrucción trap. La idea es que la llamada de sistema parezca una llamada de procedimiento normal al programa de aplicación; el SO proporciona una biblioteca de funciones de usuario con nombres correspondientes a cada llamada de sistema real. Cada una de estas funciones stub contiene una trampa para la función del SO. Cuando el programa de aplicación llama al stub, ejecuta la instrucción trap, que cambia la CPU al modo kernel y luego se bifurca (indirectamente a través de una tabla del SO [ jerga ] ), al punto de entrada de la función que se va a invocar. Cuando la función se completa, cambia el procesador al modo de usuario y luego devuelve el control al proceso de usuario, simulando así un retorno de procedimiento normal. [ cita requerida ]
En el método de paso de mensajes , el proceso del usuario construye un mensaje que describe el servicio deseado. Luego, utiliza una función de envío confiable para pasar el mensaje a un proceso confiable del sistema operativo . La función de envío cumple la misma función que la trampa; es decir, verifica cuidadosamente el mensaje, cambia el procesador al modo kernel y luego entrega el mensaje a un proceso que implementa las funciones de destino. Mientras tanto, el proceso del usuario espera el resultado de la solicitud de servicio con una operación de recepción de mensajes. Cuando el proceso del sistema operativo completa la operación, envía un mensaje de vuelta al proceso del usuario.
La distinción entre los dos enfoques tiene consecuencias importantes en relación con la independencia del comportamiento del SO respecto del comportamiento del proceso de aplicación y el rendimiento resultante. Como regla general, los sistemas operativos basados en una interfaz de llamada al sistema pueden ser más eficientes que aquellos que requieren que se intercambien mensajes entre procesos distintos. Esto es así a pesar de que la llamada al sistema debe implementarse con una instrucción trap; es decir, a pesar de que la trampa es relativamente costosa de realizar, es más eficiente que el enfoque de paso de mensajes, donde generalmente hay costos más altos asociados con la multiplexación de procesos , la formación de mensajes y la copia de mensajes. El enfoque de llamada al sistema tiene la propiedad interesante de que no necesariamente hay ningún proceso del SO. En cambio, un proceso que se ejecuta en modo de usuario cambia al modo kernel cuando está ejecutando código kernel y vuelve al modo usuario cuando regresa de la llamada al SO. Si, por otro lado, el SO está diseñado como un conjunto de procesos separados, generalmente es más fácil diseñarlo de modo que obtenga el control de la máquina en situaciones especiales, que si el kernel es simplemente una colección de funciones ejecutadas por procesos de usuario en modo kernel. Los sistemas operativos basados en procedimientos suelen incluir al menos unos pocos procesos del sistema (llamados daemons en UNIX ) para manejar situaciones en las que la máquina está inactiva, como la programación y el manejo de la red. [ cita requerida ]
Véase también
Referencias
- ^ "Un adelanto del kernel de Linux - Capítulo 2: Creación de procesos"
- ^ "Función CreateProcessA (Processthreadsapi.h) - Aplicaciones Win32". 9 de febrero de 2023.
- ^ "Creación de procesos - Aplicaciones Win32". 9 de febrero de 2023. Archivado desde el original el 29 de marzo de 2023.
Fuentes
- Sistema operativo que incorpora Windows y UNIX, Colin Ritchie. ISBN 0-8264-6416-5
- Sistemas operativos, William Stallings, Prentice Hall, (4.ª edición, 2000)
- Multiprogramación, descripción y control de procesos
- Sistemas operativos: una perspectiva moderna, Gary Nutt, Addison Wesley, (2.a edición, 2001).
- Modelos de gestión de procesos, programación, UNIX System V versión 4:
- Sistemas operativos modernos, Andrew Tanenbaum, Prentice Hall, (2ª edición, 2001).
- Conceptos de sistemas operativos, Silberschatz y Galvin y Gagne (http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/), John Wiley & Sons, (sexta edición, 2003)