Sistemas operativos – Procesos y bloque de control de procesos

Un proceso no es más que un programa en ejecución. Su estructura puede variar según el sistema operativo, pero, en general podemos decir que se trata de código ejecutable, datos y todo lo necesario para identificarlo dentro del sistema. Se puede considerar que un proceso está formado por los siguientes componentes:

  • Código ejecutable.
  • Datos asociados que el proceso requiere: Variables globales, constantes, variables inicializadas y no inicializadas, variables de sólo lectura.
  • Contexto de ejecución del programa.
  • Pila o stack, que registra por bloques las llamadas a procedimientos y los parámetros pasados a estos, variables locales de la rutina invocada, y la dirección de la siguiente instrucción a ejecutar cuando termine la llamada. Esta zona de memoria se asigna por el sistema operativo al cargar el proceso en la memoria principal. En caso de auto llamadas recursivas, la pila podría desbordarse.
  • Montículo o heap, una zona de memoria asignada por el sistema operativo para datos en tiempo de ejecución. Puede aumentar o disminuir en tiempo de ejecución del proceso.

procesos_memoriaSupongamos que el procesador comienza a ejecutar un proceso. En cualquier instante puntual de tiempo, mientras el proceso está en ejecución, éste se puede caracterizar por una serie de elementos, cuyo conjunto se llama contexto de ejecución:

  • Identificación: Un identificador único asociado al proceso para distinguirlo del resto de procesos. Puede también almacenar el identificador del proceso padre que lo creó y el identificador del usuario, dependiendo del sistema.
  • Estado: Si el proceso está actualmente en ejecución o en otro estado, como listo, suspendido, parado o zombie. Los estados varían según el tipo de sistema operativo.
  • Información de planificación: Nivel de prioridad relativo al resto de procesos. Evento por el que espera el proceso mientras está bloqueado.
  • Descripción de los segmentos de memoria asignados al proceso: Espacio de direcciones o límites de memoria asignados al proceso.
  • Punteros a memoria: Incluye los punteros al código del programa y los datos asociados a dicho proceso, además incluye cualquier bloque de memoria compartido con otros procesos, e incluso si el proceso utiliza memoria virtual. También se almacenan los punteros a la pila y al montículo del proceso.
  • Datos de contexto: Estos son datos que están presentes en el registro del procesador cuando el proceso se encuentra en ejecución. Almacena el valor de todos los registros del procesador, banderas de estado, señales, etc. En definitiva, todo lo necesario para poder continuar la ejecución del proceso cuando el sistema operativo lo decida.
  • Información de estado E/S y recursos asignados: Incluye las peticiones de E/S pendientes, dispositivos de E/S asignados a ese proceso, una lista de ficheros en uso, etc.
  • Comunicación entre procesos: Puede haber varios indicadores, señales y mensajes asociados con la comunicación entre dos procesos independientes.
  • Información de auditoría: Puede incluir la cantidad de tiempo de procesador y de tiempo de reloj utilizados, así como los límites de tiempo, registros contables, etc.

La información anterior, de forma general, se almacena en una estructura de datos llamada BCP o Bloque de control de procesos. Lo más importante del BCP es que contiene la información suficiente para poder interrumpir un proceso en ejecución para ser reanudado más tarde como si no hubiera habido interrupción alguna. El BCP es un concepto clave que permite al sistema operativo dar soporte a múltiples procesos y proporcionar multiprogramación. En UNIX, cada proceso tiene asignado un BCP que está almacenado en una lista enlazada llamada tabla de procesos. En otros sistemas, el BCP se encuentra almacenado en el propio proceso junto al resto de datos. Se llama imagen de proceso al conjunto del programa, datos, pila, montículo y BCP. Para ejecutar o reanudar la ejecución de un proceso, basta con cargar la imagen del proceso en memoria principal o en memoria virtual.

Creación de procesos

Hay cuatro eventos principales que provocan la creación de procesos:

  1. El arranque del sistema.
  2. La ejecución, desde un proceso, de una llamada al sistema para creación de procesos.
  3. Una petición de usuario para crear un proceso.
  4. El inicio de un trabajo por lotes.

1) Cuando se arranca el sistema operativo, se crean varios procesos. Algunos de ellos son procesos en primer plano, es decir, procesos que interactúan con el usuario y realizan trabajo para él. Otros son procesos en segundo plano asignados a una función específica.

2) Además de los procesos que se crean al arranque, posteriormente se pueden crear otros. A menudo, un proceso en ejecución emitirá llamadas al sistema para crear uno o más procesos para que le ayuden a realizar su trabajo. Es útil crear procesos cuando el trabajo que se desea realizar se puede plantear en términos de varios procesos interactivos entre ellos, pero independientes en los demás aspectos. Si el sistema es multiprocesador, al permitir que cada CPU ejecute un proceso de forma, se puede realizar el trabajo con mayor rapidez.

3) En los sistemas interactivos, el usuario puede ejecutar un comando o hacer doble clic sobre un programa, en cualquier de los dos casos, se inicia un proceso que ejecutará el programa seleccionado.

4) La última situación en la que se ejecutan procesos se aplica sólo a los sistemas de procesamiento por lotes. Los usuarios pueden enviar (incluso de forma remota) trabajos al sistema. Cuando el sistema operativo decide que tiene los recursos para ejecutar un trabajo que se encuentra en cola, crea un proceso y ejecuta el siguiente trabajo de la cola de entrada.

En todos estos casos, para crear un proceso hay que hacer que un proceso existente ejecute una llamada de al sistema. Ese proceso puede ser un proceso de usuario, un proceso de sistema invocado mediante teclado o ratón, o un proceso del administrador. Por ejemplo, en UNIX, esta llamada es fork(). Esta llamada crea un clon exacto del proceso que realizó la llamada. Después de ejecutar fork(), los dos procesos (padre e hijo) tienen la misma imagen de memoria, las mismas cadenas de entorno, las mismas variables, los mismos archivos abiertos, etc.

En definitiva, una vez que el sistema operativo decide por cualquier razón, crear un proceso, se procederá de la siguiente forma:

  1. Asignar un identificador de proceso único: En este instante, se añade una nueva entrada a la tabla de procesos, que contiene una entrada por proceso.
  2. Reservar espacio para el proceso: Esto incluye todos los elementos de la imagen de proceso. El sistema operativo debe conocer cuánta memoria se requiere para el espacio de direcciones privado (programas y datos) y para la pila (y montículo) de usuario. Estos valores pueden ser asignados por defecto basándonos en el tipo de proceso. Si un proceso es creado por otro proceso, el proceso padre puede pasar los parámetros requeridos por el sistema operativo como parte de la solicitud de creación de proceso. En caso de que exista una parte del espacio de direcciones compartido con otro proceso, se fijan los enlaces apropiados. Por último, se reserva el espacio para el BCP, que dependiendo del sistema, puede estar en la propia tabla de procesos o en en el mismo espacio reservado para el proceso.
  3. Inicialización del bloque de control de proceso (BCP): La parte de identificación de proceso del BCP contiene el identificador del proceso así como otros posibles identificadores, como por ejemplo, el identificador del proceso padre. La información de estado de proceso del BCP se suele iniciar a 0 en todas las entradas, excepto el contador de programa (que se fija en el punto de entrada a éste) y los punteros de pila de sistema (fijados para definir los límites de pila del proceso). La información de control de procesos se inicializa en base a los valores por omisión, teniendo en cuenta también los atributos que han sido solicitados para este proceso.
  4. Establecer los enlaces apropiados: Si el sistema operativo mantiene cada cola del planificador como una lista enlazada, el nuevo proceso debe situarse en la cola de Listos o en la cola de Listos/Suspendidos.
  5. Creación o expansión de otras estructuras de datos: El sistema operativo puede mantener un registro de auditoría por cada proceso que se puede utilizar posteriormente a efectos de análisis de rendimiento del sistema.

Terminación de procesos

Cuando se crea un proceso, empieza a ejecutarse y realiza el trabajo al que está destinado. Sin embargo, el proceso terminará su ejecución tarde o temprano, por lo general debido a los siguientes motivos:

  1. Salida normal (voluntaria).
  2. Salida por error (voluntaria).
  3. Error fatal (involuntaria).
  4. Eliminado por otro proceso (involuntaria).

1) La mayoría de los procesos terminan porque han concluido su trabajo de forma satisfactoria. El proceso realiza una llamada al sistema para indicarle que el trabajo se ha realizado. En sistemas UNIX, esta llamada es exit();

2) Un proceso puede finalizar su ejecución al detectar un error. Este error es predecible, ya que el programador incorporó el mecanismo adecuado en el código fuente del programa, para que en el caso de que se produjese la situación de error, el proceso finalizase de forma voluntaria.

3) Es probable que el programa ejecutado tenga un error en su código. En ese caso, el proceso producirá un error durante su ejecución y el sistema operativo mandará una señal para que el proceso cese su ejecución de forma forzosa. Este error se puede producir, por ejemplo, cuando el proceso intente acceder a una zona de memoria no existente, una división entre cero, etc.

4) Un proceso puede ser eliminado desde otro proceso mediante una llamada al sistema. En sistemas UNIX, esta llamada es kill().

Jerarquía de procesos UNIX

Un proceso UNIX es un programa que se está ejecutando en un determinado momento en el sistema. Existen dos tipos de procesos:

  • Procesos de usuario: Son aquellos procesos que el usuario utiliza, programas de aplicación o llamadas al sistema mediante shell.
  • Demonios: En un sistema operativo UNIX siempre hay una serie de procesos ejecutándose en segundo plano, de forma transparente para el usuario, y hacen que el sistema sea utilizable. No interactúan con el usuario, y se usan para programas que funcionan constantemente, como servidores de red, mensajería instantánea, sistemas de impresión, control de hardware, etc.

Cuando el kernel del sistema se inicia y se carga en memoria, inicializa todos los controladores de dispositivos y establece las estructuras de datos necesarias, finaliza sus tareas dentro del proceso de arranque del sistema e inicia la ejecución de init. Init es el proceso responsable de la inicialización de nuevos procesos a nivel de usuario. Es decir, todos los procesos de usuario en el sistema, excepto el proceso swapper (las imágenes de los procesos que no han de mantenerse en memoria física) descienden del proceso init. Init se ejecuta como demonio y tiene el PID 1 (identificador de proceso).

procesos_arranqueEn el momento en el que init comienza su ejecución, finaliza el proceso de arranque del sistema realizando una serie de tareas administrativas. La lista exacta de tareas que realiza puede variar en distintos sistemas GNU/Linux. Normalmente realiza el chequeo de los sistemas de archivos, borra el contenido de /tmp e inicia la ejecución de varios servicios. También se encarga de adoptar procesos huérfanos. Cuando un proceso inicia un proceso hijo y éste muere antes que el hijo, el proceso hijo para inmediatamente a ser hijo de init. Al cerrar el sistema, es init quien se encarga de matar todos los procesos restantes, desmontar los sistemas de archivos y de cualquier otra cosa para la que haya sido configurado.

Anuncios
Publicado en Sistemas operativos, Varios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Sobre mi…

Soy Técnico en Explotación de Sistemas Informáticos y Técnico Superior en Administración de Sistemas Informáticos en Red. Actualmente estudiando el Grado de Ingeniería Informática en la Universidad de Córdoba (España).

Enamorado de la ciencia en general y de la computación en particular.

Música: Heavy, Rock, Celta, New Age, Electrónica, etc...
Libros:Isaac Asimov, Richard Dawkins, Stephen Hawking, Carl Sagan...

Estoy interesado en la programación de videojuegos. Políticamente de izquierdas, escéptico y ateo. En definitiva, mala gente.

Sígueme en Twitter

Introduce tu dirección de correo electrónico para seguir este Blog y recibir las notificaciones de las nuevas publicaciones en tu buzón de correo electrónico.

Únete a otros 24 seguidores

Usa Linux Mint
The Bit Developer Box
A %d blogueros les gusta esto: