Fundamentos y Gestión de Procesos en Sistemas Operativos: Estructura, Estados y Planificación

Características de los Procesos

Un proceso se define como un **programa en ejecución**. Las características que deben tener los procesos son:

  • Para comenzar la ejecución de un proceso, este ha de residir completamente en **memoria** y tener asignados todos los recursos que necesite.
  • Cada proceso está **protegido** del resto de procesos, y ningún otro proceso podrá escribir en las zonas de memoria pertenecientes a los demás.
  • Los procesos pueden corresponder al usuario o ser propios del sistema operativo. Los procesos pertenecientes a los usuarios se ejecutan en el modo denominado **modo usuario** del procesador (con restricciones de acceso a los recursos hardware). Los procesos que pertenecen al sistema se ejecutan en el **modo kernel** o **modo privilegiado** del procesador (podrán acceder a cualquier recurso).
  • Cada proceso tendrá una estructura de datos, llamada **bloque de control de proceso (BCP)**, donde se almacenará información acerca del proceso. Es única para cada proceso, lo identifica respecto de los demás y sirve para controlar su correcta ejecución.
  • Los procesos pueden **comunicarse**, **sincronizarse** y **colaborar** entre ellos.

Composición y Estructura del Bloque de Control de Proceso (BCP)

A la estructura de datos se le denomina **bloque de control de proceso (BCP)**, y contendrá, para cada proceso, la siguiente información:

Información de Identificación

Esta información identifica al usuario y al proceso. Como ejemplo, se incluyen los siguientes datos:

  • Identificador del proceso: Cada proceso tiene un número asignado por el sistema operativo que sirve para identificarlo, lanzarlo a ejecución, detenerlo, cancelarlo, reanudarlo, etc. Este identificador de proceso se conoce con la abreviatura **PID** (*Process ID*).
  • Identificador del proceso padre en caso de existir relaciones padre-hijo (como es el caso de UNIX).
  • Información sobre el usuario (identificador del usuario y grupo).

Estado del Procesador

Contiene los valores iniciales del estado del procesador o su valor en el instante en que fue interrumpido el proceso.

Información de Control del Proceso

En esta sección se incluye diversa información que permite gestionar el proceso. Destacaremos los siguientes datos:

  • Información de planificación y estado:
    • Estado actual del proceso. Un proceso puede estar en **ejecución**, **detenido** o **bloqueado**.
    • Evento por el que espera el proceso cuando está bloqueado.
    • **Prioridad del proceso**. Esta prioridad es asignada de forma automática por el sistema operativo en función de los parámetros con los que se ha diseñado. Puede ser modificada por el administrador del sistema.
  • Ubicación en memoria: Teniendo en cuenta la técnica utilizada para ubicar los programas en memoria, y dependiendo del tipo de programa del que se trate, el SO tendrá que ubicar cada proceso en una zona de memoria.
  • Recursos utilizados: Cada proceso tendrá a su disposición determinados recursos hardware y software para poder ejecutarse. La asignación de estos recursos la realizará el SO.

Operaciones con los Procesos

Los sistemas que administran los procesos deben poder crear, destruir, suspender, retomar, cambiar la prioridad, bloquear y distribuir (*dispatch*) un proceso. Para hacerlo, disponen de ciertas funciones que facilitan la manipulación del sistema operativo mediante llamadas al sistema o desde el intérprete de comandos.

Las operaciones más comunes son las siguientes:

  • Crear un proceso: Los procesos se pueden crear de varias formas:
    • Cuando se arranca el sistema operativo, este ejecuta procesos necesarios para llevar a cabo distintas funciones.
    • Por petición de un usuario del sistema, escribiendo una orden en el intérprete de comandos o pulsando encima de algún icono.
    • Cuando un proceso hace una llamada al sistema para crear un nuevo proceso.
  • Destruir un proceso: Es decir, eliminar un proceso del sistema operativo, o lo que es lo mismo, destruir su **bloque de control de proceso (BCP)**. Un proceso puede ser destruido de varias formas:
    • El proceso acaba de ejecutarse de forma normal.
    • El proceso ha sufrido un error.
    • Por petición de un usuario del sistema, escribiendo una orden en el intérprete de comandos o pulsando encima de algún icono.
    • Cuando un proceso hace una llamada al sistema para acabar con otro proceso.
  • Cambiar la prioridad de un proceso.
  • Suspensión y reanudación de procesos: Un proceso suspendido o bloqueado no puede proseguir su ejecución hasta ser reanudado por otro proceso. Generalmente, es el S.O. el que se encarga de eliminar temporalmente ciertos procesos con el fin de reducir la carga del sistema durante una situación crítica.

Clasificación de los Procesos

Según la capacidad de acceso al procesador y otros recursos

  • Apropiativos: Los procesos que tienen asignado un recurso no permiten que otros procesos puedan acceder a este hasta que haya terminado de utilizarlos.
  • No apropiativos: Permiten a otros procesos acceder a los recursos que está utilizando.

Según la permanencia en memoria

  • Residentes: Están en la memoria todo el tiempo que dura la ejecución.
  • Intercambiables: Pueden ser llevados de la memoria principal al disco mientras están bloqueados. Entonces, la memoria liberada puede ser utilizada por otros procesos que en aquellos momentos la necesitan.

Según el nivel de privilegios

  • Privilegiados: Se ejecutan en modo supervisor.
  • No privilegiados: Los que normalmente ejecuta el usuario.

Según el propietario

  • Procesos de usuario: Son los diseñados por los usuarios. Se ejecutan en modo no protegido.
  • Procesos del sistema: Son los que forman parte del SO (de E/S, de planificación de otros procesos, etc.).

Estados y Transiciones de un Proceso

Una de las funciones principales de un sistema operativo es controlar los diferentes estados en los que se puede encontrar un proceso, y analizar las posibles transiciones de un estado a otro.

Todos los recursos (excepto la **UCP**) son gestionados por el proceso. El proceso es el propietario de la memoria que necesita, del hardware, de los ficheros, etc., a excepción de la **UCP**. Los tiempos de la **UCP** son gestionados y asignados al proceso.

El estado de un proceso lo podemos definir como una descripción de su actividad en un momento concreto.

Estados principales de un proceso

Podemos distinguir los siguientes estados de un proceso:

  • En ejecución: El procesador está ejecutando las instrucciones que componen el programa y tiene concedido el tiempo de uso de la **UCP** en un instante concreto.
  • Preparado, en espera o listo: Un proceso está preparado para ser ejecutado; es decir, está esperando turno para poder utilizar su intervalo de tiempo y poner en funcionamiento sus instrucciones accediendo a los recursos del sistema.
  • Bloqueado: El proceso en cuestión está retenido debido a múltiples causas. Una de estas causas puede ser que dos procesos utilicen el mismo fichero de datos, o que dos procesos necesiten utilizar la misma unidad de CD-ROM para cargar determinados datos, etcétera.

Cambio de Contexto y Transiciones

Un **cambio de contexto** es la situación en la que el sistema operativo ejecuta una serie de acciones para cambiar el proceso que tiene la **CPU**. El cambio de contexto es una operación que debe realizarse con la mayor rapidez posible y en ella se debe almacenar la información sobre el estado de la ejecución del proceso, para que cuando vuelva a estar en ejecución, se reinicie desde el mismo punto y con los mismos valores.

Las transiciones que pueden sufrir los procesos entre cada uno de estos tres estados son las siguientes:

  • Transición 1 (Ejecución a Bloqueado): Ocurre cuando el programa que está en ejecución necesita algún elemento, señal, dato, etc., para poder continuar ejecutándose.
  • Transición 2 (Ejecución a Preparado): Cuando un programa o proceso ha utilizado el tiempo asignado por el procesador para su ejecución y tiene que dejar paso al siguiente proceso.
  • Transición 3 (Preparado a Ejecución): Cuando el proceso que está preparado pasa al estado de ejecución, es decir, cuando al proceso le llega una nueva disposición del tiempo del procesador para poder ejecutarse.
  • Transición 4 (Bloqueado a Preparado): Cuando el proceso pasa de estar bloqueado a estar preparado, es decir, cuando el proceso recibe la orden o señal que estaba esperando para pasar al estado de preparado y posteriormente, tras la transición, pasar al estado de ejecución.

Algoritmos de Planificación

Para evaluar la eficiencia de un determinado algoritmo de planificación, tendremos que estudiar las siguientes características:

  • Tiempo de respuesta (TR): Es el tiempo que pasa desde que el proceso llega al sistema (se crea el BCP) hasta que es atendido por la **CPU** por primera vez (estado de ejecución).
  • Tiempo de retorno (TRET): Es el tiempo que pasa desde que el proceso llega al sistema (se crea el BCP) hasta que se obtienen los resultados (finaliza el proceso).
  • Tiempo de espera (TE): Es el tiempo que el proceso pasa dentro del sistema en espera de la **CPU** o de algún otro recurso.

Además, también interesa conocer los tiempos medios de respuesta, retorno y espera, para poder saber si para ciertos datos de entrada el algoritmo es más o menos óptimo, en general.

En los sistemas operativos comerciales existen diferentes políticas de planificación. Hay que recordar que no existe una política perfecta. Algunos de los objetivos y criterios utilizados pueden ser contradictorios, por lo que si favorecemos un tipo de proceso, normalmente perjudicamos otros procesos.

En cada algoritmo sabremos para cada proceso:

  • Tiempo de entrada o de llegada al sistema (TI): Es el momento en que el proceso entra en el sistema.
  • Tiempo de ejecución (TX): Es el tiempo que el proceso necesita para su ejecución total.

Algoritmo FIFO (First In First Out) o FCFS (First Come First Served)

Es el más sencillo, pero el más ineficaz. Como su nombre indica, los procesos se ejecutan según el **orden de llegada**; es decir, el primero en llegar es el primero en salir. El resto de procesos deberán esperar su turno para poder ejecutarse. Este algoritmo suele utilizarse para gestionar los trabajos de impresión en las colas o *spool*.

Algoritmo Primero el Proceso más Corto (SPN – Short Process Next) o SJF (Short Job First)

Un modo sencillo de reducir la penalización que sufren los trabajos cortos con FIFO o FCFS es seleccionar el proceso con **menor tiempo esperado de ejecución**. Así pues, este algoritmo selecciona el proceso más corto de los que está esperando para usar la **CPU**. Este algoritmo favorece a los procesos que tarden poco tiempo en ejecutarse. Una dificultad que plantea esta política es la necesidad de conocer o, por lo menos, estimar, el tiempo exigido en cada proceso.

Algoritmo de Menor Tiempo Restante (SRTF – Short Remaining Time First)

Este algoritmo va seleccionando de los procesos que están en espera al que le quede **menor tiempo para terminar**. En caso de empate, se utiliza FIFO o FCFS. Este algoritmo es **expulsivo**, ya que si mientras se está ejecutando un proceso llega otro al que le quede menos tiempo para acabar que el que está utilizando la **CPU** en ese momento, lo desplaza; es decir, se produce un **cambio de contexto**. Favorece a los procesos con menor tiempo de ejecución y mejora los tiempos medios en general. Sin embargo, perjudica a los que necesiten más tiempo.

Algoritmo por Prioridades

Este algoritmo consiste en asociar a cada proceso una **prioridad**. El orden de entrada en la **CPU** será según la prioridad, y en caso de empate se aplica el FIFO o FCFS. Existen variantes de este algoritmo, que puede ser expulsivo o no expulsivo, y también se le puede ir cambiando la prioridad a un proceso, es decir, hacerlo más prioritario a medida que lleve más tiempo esperando la **CPU**, para evitar que procesos poco prioritarios se posterguen indefinidamente si llegan procesos más prioritarios. La prioridad se suele indicar por un número entero, que cuanto más bajo sea, el proceso será más prioritario. Puede haber más de un proceso con la misma prioridad. Este algoritmo no favorece a los procesos que necesiten más tiempo de **CPU** o menos, sino que optimiza el tiempo de respuesta de los más prioritarios.

Algoritmo Rotatorio (Round-Robin, RR)

Un modo sencillo de reducir la penalización que sufren los trabajos cortos con FIFO es considerar la apropiación dependiente de un reloj. La más simple de estas políticas se denomina planificación por **turno rotatorio (RR)**. Periódicamente, se genera una interrupción de reloj. Cuando se genera la interrupción, el proceso que está en ejecución se sitúa en la cola de Listos y se selecciona el siguiente trabajo, según un FIFO o FCFS. Esta técnica se conoce también como **fracciones de tiempo**, puesto que cada proceso recibe una fracción de tiempo antes de ser expulsado. Con la política del turno rotatorio, la cuestión principal del diseño es la longitud del **quantum de tiempo** o fracción (*q*) que se va a usar.

Procesos Importantes y Gestión en Windows

Procesos Fundamentales del Sistema

  • System (PID 4): Es un proceso de tamaño pequeño (alrededor del centenar de KB) que representa al **kernel del sistema operativo** una vez arrancado, y como tal es padre de algunos procesos muy importantes: *Interrupts* y *SMSS*.
  • Proceso inactivo del sistema (System Idle Process, PID 0): Es un proceso que el planificador de tareas del kernel utiliza cuando no tiene nada que hacer para dejar al procesador inactivo. Por tanto, representa el tiempo que está la **CPU** sin ejecutar operaciones.

Prioridades de Procesos en Windows

Desde el punto de vista interno del kernel, sus procesos tienen asignada prioridad numérica:

  • 16-31 (Tiempo real): Cuanto más alta, más importante. Se les asigna un tiempo fijo en **CPU**. Solo el administrador puede usarlas.
  • 1-15 (Dinámicas): Cuanto más altas, más prioritarias. Se reparte entre ellas el tiempo restante; cuanto mayor número, más tiempo. Cualquier usuario puede asignarlas.
  • 0: Para el *System Idle Process*, que solo se ejecuta si no hay nada más que hacer.

Estas prioridades son asignadas por el kernel en función de dos parámetros:

  • La **clase de prioridad del proceso**, que define una prioridad numérica base (tiempo real / alta / por encima de lo normal / normal / por debajo de lo normal / baja).
  • La **prioridad relativa de cada hilo de ejecución**, que normalmente modifica en hasta +-2 la anterior (superior, por encima de lo normal, normal, por debajo de lo normal, inferior). Cuando hablamos de tiempo real, esta prioridad relativa modifica la prioridad base entre +7 y -8.

Herencia en Procesos Windows

  • En Windows no es obligatorio que un proceso tenga proceso padre. Por ello, no todos descienden del proceso *System*.
  • Cuando hay herencia, sin embargo, no tienen por qué heredar todas las propiedades del proceso padre, sino que puede haber un filtro que determine cuáles hereda y cuáles no.

Concepto de Servicio en Windows

Un **servicio de Windows** es un programa de ordenador que funciona en **segundo plano**. Es similar en concepto a un *demonio Unix*. Un servicio de Windows debe ajustarse a las normas y protocolos de interfaz del *Service Control Manager*, el componente responsable de la gestión de servicios de Microsoft Windows.

Los servicios de Windows se pueden configurar para comenzar cuando se inicia el sistema operativo y ejecutarse en segundo plano mientras se ejecuta el sistema operativo. Alternativamente, se pueden iniciar manualmente o por un evento.

El Administrador de Tareas

Si quieres saber qué procesos se están ejecutando en este momento en tu equipo, basta con visitar al **Administrador de Tareas de Windows**, pulsando la combinación de teclas Ctrl + Alt + Supr y acudiendo a la opción correspondiente.

Procesos y Servicios I: svchost.exe

Hay un proceso del sistema muy conocido por los usuarios de Windows, se trata del famoso **svchost.exe**. Según Microsoft, *svchost.exe* es el nombre genérico de un proceso anfitrión para servicios que se ejecutan a través de librerías enlazadas dinámicamente (*DLL*). Hace tiempo que la compañía migró las funciones de los servicios de Windows a ficheros DLL en lugar de EXE. Pero, como no se puede ejecutar un archivo DLL directamente en Windows, tiene que ser cargado con un ejecutable, y precisamente *svchost.exe* fue ese archivo.

Normalmente hay varias instancias de *svchost* corriendo simultáneamente. No es adecuado ejecutar todos los servicios desde una única instancia, ya que un fallo en la misma haría que todos los servicios asociados se colgasen. De ahí que sea conveniente utilizar un proceso *svchost.exe* para cada servicio.

Procesos y Servicios II: Otros Ejecutables Clave

Entre estos procesos mencionados anteriormente, también te puedes encontrar con otros que a simple vista tal vez no te suenen, pero que son igualmente importantes. Algunos ejemplos:

  • dwm.exe: Este proceso corresponde a uno de los componentes de Windows más importantes a nivel visual, el llamado *Desktop Window Manager*.
  • ctfmon.exe: Este proceso controla la entrada de usuario alternativa y la barra de idiomas de Office.
  • rundll32.exe o rundll.exe: Como no hay una forma directa de ejecutar ficheros DLL, este proceso se encarga de ejecutar las funcionalidades que se almacenan en archivos DLL compartidos.
  • wuauclt.exe: Es el actualizador de Windows y funciona en segundo plano.
  • Wmpnscfg.exe: Windows Media Player puede compartir contenidos multimedia entre ordenadores de la misma red y también con la XBOX 360.

Procesos y Servicios III: Componentes de Núcleo y Utilidades

  • csrss.exe: Conocido como «*Client/Server Runtime Subsystem*» es un componente que proporciona el modo usuario del subsistema de Windows y que se complementa con *win32.sys*, que se encarga de la parte que se ejecuta en modo núcleo.
  • mdm.exe: Forma parte de *Visual Studio .Net* (Entorno de desarrollo para crear aplicaciones, sitios y aplicaciones web, así como servicios web en cualquier entorno que soporte la plataforma .NET).
  • services.exe: Es el proceso que controla y gestiona los servicios de Windows.
  • justched.exe: ¿Usas Java? Porque este proceso es el **planificador de actualizaciones de Java**, que malgasta memoria continuamente para comprobar si tienes Java actualizado a la última versión.

Gestión de Procesos: Introducción

  • Cada programa que se ejecuta es un **proceso** con recursos asignados y gestionado por el **kernel**.
  • La gestión de procesos comprende la monitorización, detención y cambio de prioridad de los procesos.
  • Generalmente, los procesos son gestionados automáticamente por el kernel del S.O. (son creados, ejecutados y detenidos sin la intervención del usuario).
  • Algunas veces los procesos se detendrán por razones desconocidas y será necesario reiniciar el proceso.
  • Otras veces algún proceso se ejecutará descontroladamente malgastando los recursos del sistema, entonces será necesaria una intervención manual del administrador para detener el proceso.

Parámetros de un Proceso

PROCESS ID (PID)

Cada proceso tiene un número asociado que se le asigna cuando es creado. Los **PIDs** son números enteros únicos para todos los procesos del sistema.

USER ID & GROUP ID

Cada proceso tiene que tener asociados unos **privilegios** que limiten el acceso al sistema de ficheros. Estos privilegios quedan determinados por el *user ID* y *group ID* del usuario que creó el proceso.

PARENT PROCESS

Todo proceso es creado por otro proceso, el **proceso padre** (*parent process*). El primer proceso iniciado por el kernel cuando el sistema arranca es el programa *init*. Este proceso tiene el **PID 1** y es el padre de todos los procesos del sistema.

PARENT PROCESS ID

El **PID** del proceso que inició el proceso hijo.

ENVIRONMENT

Cada proceso mantiene una lista de variables y sus correspondientes valores. El conjunto de estas variables recibe el nombre de *process environment*. Normalmente el entorno de un proceso hijo se hereda del proceso padre a menos de que se indique de otra forma.

CURRENT WORKING DIRECTORY

Cada proceso tiene asociado un **directorio por defecto**, donde el proceso leerá/escribirá archivos, a menos que se le especifique explícitamente lo contrario.

NICE NUMBER

Permite al usuario modificar la **prioridad de ejecución** de un proceso.

Comandos de Monitorización de Procesos: PS, PSTREE y TOP

Comando ps

Sintaxis: ps [options]

Muestra la lista de procesos del sistema y algunas de sus características: hora de inicio, uso de memoria, estado de ejecución, propietario y otros detalles. Sin opciones, lista los procesos creados por el usuario actual y asociados al terminal de usuario.

Opciones de ps:

  • -a: Muestra los procesos creados por cualquier usuario y asociados a un terminal.
  • -l: Formato largo. Muestra la prioridad, el PID del proceso padre, entre otras informaciones.
  • -u: Formato de usuario. Incluye el usuario propietario del proceso y la hora de inicio.
  • -U usr: Lista los procesos creados por el usuario “usr”.
  • -x: Muestra los procesos que no están asociados a ningún terminal del usuario. Útil para ver los “demonios” (programas residentes) no iniciados desde el terminal.

La orden ps proporciona una información muy interesante sobre los procesos que tenemos en ejecución. Podemos saber el **PID** del proceso, qué programa lo originó, cuánta memoria ocupa, cuánta **CPU** consume, cuánto tiempo de ejecución lleva, etc.

Comando pstree

Sintaxis: pstree [options] [PID | user]

Este comando muestra la **jerarquía de los procesos** mediante una estructura de árbol. Si se especifica el **PID** de un proceso, el árbol empezará desde ese proceso; de lo contrario, el árbol empezará por el proceso *init* (**PID=1**) y mostrará todos los procesos del sistema. Si se especifica un usuario válido, se mostrará la jerarquía de todos los procesos de ese usuario.

Opciones de pstree:

  • -a: Incluye en el árbol de procesos la línea de comandos que se usó para iniciar el proceso.
  • -c: Deshabilita la unión de procesos hijos con el mismo nombre (réplicas de un mismo proceso).
  • -G: Usa los caracteres de línea para dibujar el árbol. La representación del árbol es más clara, pero no funciona al redireccionar la salida.
  • -h: Remarca la jerarquía del proceso actual (normalmente el terminal). No funciona al redireccionar la salida.
  • -n: Por defecto, los procesos con mismo padre se ordenan por el nombre. Esta opción fuerza a ordenar los procesos por su **PID**.
  • -p: Incluye el **PID** de los procesos en el árbol.

Comando top

Sintaxis: top [options]

El comando top ofrece una lista de los procesos similar al comando ps, pero la salida se **actualiza continuamente**. Es especialmente útil cuando es necesario observar el estado de uno o más procesos o comprobar los recursos que consumen.

Opciones de top:

  • -i: Ignora los procesos inactivos, listando únicamente los que utilizan recursos del sistema.
  • -d: Especifica el ritmo de actualización de la pantalla en segundos. Es posible especificar decimales.

Órdenes interactivas de top:

  • h: Muestra una pantalla de ayuda.
  • q: Sale del programa.
  • k: *Kill*. Permite detener un proceso.
  • r: *Renice*. Permite alterar la prioridad de un proceso.

Ejecución en Primer y Segundo Plano

Primer Plano (Foreground)

  • Un proceso ejecutado en **primer plano** se ejecuta bloqueando el terminal desde el que se lanzó.
  • Un proceso se lanza en primer plano simplemente introduciendo su nombre en el terminal y pulsando intro. Ejemplo: $ firefox

Segundo Plano (Background)

  • Un proceso ejecutado en **segundo plano** se ejecuta sin bloquear el terminal desde el que se lanzó.
  • Los programas se pueden iniciar en segundo plano añadiendo el carácter & al final del comando.
  • Cuando un proceso se inicia en segundo plano, se crea un **trabajo** (*job*), al cual se le asigna un número entero, empezando por 1 y numerando secuencialmente.
  • Cuando un proceso se ejecuta en segundo plano, la única manera de comunicarse con el proceso es mediante el envío de **mensajes** (*signals*).
  • Se puede mover un programa ejecutado en primer plano al segundo plano, deteniéndolo escribiendo Ctrl+Z y después reiniciando el proceso en segundo plano, mediante la orden bg.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.