Gestión de Procesos en Sistemas Operativos: Creación, Ejecución y Control

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 9,09 KB

Evolución de un Proceso

Cuando un usuario se conecta al sistema, le atiende el intérprete de comandos (shell), que es un proceso con un identificador determinado. Si se solicita ejecutar un comando, se crea un nuevo proceso que soporta la ejecución de dicho comando. Cuando el shell (proceso padre) recibe la cadena, ejecuta la llamada al sistema operativo fork() para crear un proceso hijo que es una copia idéntica a él mismo (shell) en lo que se refiere al ejecutable y a una parte del entorno. El PPID (Parent PID) del proceso hijo es el PID del proceso padre. A continuación, el proceso padre espera con la llamada al sistema operativo wait() hasta que su hijo se ejecute. Mientras tanto, el proceso hijo ejecuta la llamada exec() para cambiar su código ejecutable, sustituyendo el código del intérprete de comandos por el ejecutable binario del comando de usuario. A partir de este momento, el proceso hijo ejecuta el comando de usuario, y no el intérprete como había sucedido hasta ahora. Cuando el proceso hijo concluye su ejecución, ejecuta la llamada exit() que envía una señal signal() al proceso padre, la cual le despierta y permite continuar su ejecución mostrando el símbolo de espera de nuevo comando (normalmente: > o $ en la pantalla del terminal).

Llamadas al Sistema para la Creación y Terminación de Procesos

Las llamadas al sistema que existen en Unix con respecto a procesos son:

  • fork(): Permite crear un nuevo proceso que inicialmente es una copia exacta del proceso que ha realizado la llamada.
  • exec(): Permite ejecutar un bloque de código en el proceso actual, sobrescribiendo todo lo que hubiera en dicho proceso actual.
  • exit(): Señaliza o notifica el fin de la ejecución de un proceso hijo al proceso padre que deberá estar esperando con wait().
  • wait(): Bloquea el proceso llamante hasta que se recibe una señal o notificación generada con exit().

Generación de los Procesos del Sistema

Cuando el ordenador arranca, el sistema operativo ejecuta el fichero ejecutable kernel, cuya misión es cargar el núcleo del sistema operativo en memoria. El núcleo es el primer proceso del sistema, y es padre de sí mismo, puesto que su PID=PPID=0. La misión del núcleo es controlar los recursos del ordenador, por lo que delega el nacimiento de nuevos procesos en uno de sus hijos: init. Para cada uno de los terminales dados de alta en el ordenador y que en ese instante están usándose, init crea un proceso hijo en el que se ejecuta el programa getty que solicita la conexión. Cuando ésta se obtiene, el mismo proceso se transforma en el programa login que solicita el nombre de usuario y la contraseña (si esta fue establecida). Si ambas informaciones son correctas, este proceso se convierte en el intérprete de comandos.

Ejecución de Procesos en Segundo Plano

Cuando se ejecuta una orden en línea de órdenes del tipo $orden1&, se ejecutan dos llamadas al sistema fork(): una para poder ejecutar orden1 y otra para crear una copia exacta del shell para poder introducir otra orden.

Definición de Proceso

Proceso: Instancia de un programa en ejecución. Hay que distinguir entre proceso y orden porque una orden puede dar lugar a la aparición de varios procesos. Un proceso es la suma de tres cosas: Programa + Recursos + Estado. A la suma de estas tres cosas también se le llama Imagen de un Proceso, y está representado por: Código | Zona datos | Pilas | Atributo.

  • Código: Programa en forma no dinámica.
  • Zona de Datos: Zona donde almacena los datos.
  • Pilas: Permite utilizar funciones.
  • Atributos: Describen todo el proceso. Es el Bloque de Control del Proceso (PCB).

En el PCB está toda la información que necesita el Sistema Operativo para tomar decisiones respecto a los dispositivos, memoria, etc. Y siempre está en memoria principal.

Contenido del PCB

Consta de varios elementos:

  • Mapa de Estado de Direcciones: Especifica qué bloque de memoria está utilizando un determinado proceso.
  • Recursos: Especifica el conjunto de recursos que tiene asignado un proceso.
  • Prioridad del Proceso: Prioridad de ejecución de un proceso. Todos los procesos tienen una prioridad asignada por defecto para efectos de planificación, pero se puede cambiar.
  • Estado del Proceso: Valor del estado en el que se encuentra el proceso en cada instante.
  • PID (Identificador del Proceso): Es un identificador único para cada proceso de un sistema. Es un valor numérico. Además del PID del proceso se registra el PPID (Parent PID) que es el PID del proceso padre. En Unix todo proceso tiene un padre siempre. Esta relación de parentesco no es vinculante: si le pasa algo al proceso padre no le afecta a los procesos hijos.
  • UID: Identificador de usuario propietario. En Unix todos los procesos los ejecuta un usuario, que no tiene por qué ser una persona. Hay usuarios especiales del sistema como adm o sys.
  • GID: Grupo principal del usuario.

Control de Procesos en Unix: Comandos Básicos

UNIX es un sistema operativo multitarea, por lo que en todo momento es normal que encontremos más de un proceso ejecutándose y, por lo tanto, residente en memoria principal. El comando que averigua cuáles son los procesos que se están ejecutando en un instante determinado es: ps (Process Status).

Sintaxis: ps [parámetros]

El comando ps genera una lista con información sobre el estado de los procesos. Por defecto (sin opciones) la lista se limita a los procesos creados en el shell actual. La opción -a presenta los procesos de todos los usuarios. La opción -x lista los procesos en background que están corriendo pero que fueron creados en sesiones anteriores. La opción -r restringe la salida a los procesos que están corriendo. La opción -u informa extensamente acerca de todos los procesos que hemos seleccionado con el resto de las opciones. La información presentada es la siguiente:

  • USER: Dueño del proceso.
  • PID: Identificativo del proceso.
  • %CPU: Porcentaje de CPU que el proceso ha consumido en el último minuto.
  • %MEM: Porcentaje de memoria RAM que el proceso ha consumido en el último minuto.
  • SZ: Tamaño en KB de la pila y de los datos del proceso.
  • RSS: Tamaño en KB de memoria RAM que el proceso tiene asignada.
  • TT o TTY: Terminal de control del proceso.
  • STAT: Estado del proceso.
  • START: Momento en el que el proceso fue creado.
  • TIME: Cantidad de CPU consumida en segundos.
  • COMMAND: Nombre del comando que ha creado el proceso.

Dónde el campo STAT toma los siguientes valores en función de si el proceso está: R (corriendo), T (suspendido), P (esperando para paginar), D (en espera ocupada no interrumpible), S (durmiendo menos de 20 segundos), I (durmiendo más de 20 segundos), Z (zombie).

En caso de que STAT tenga una de las letras anteriores seguida de la letra N significa que la prioridad actual del proceso ha sido modificada con el comando nice. Si sigue una W, significa que el proceso está "swapped out". Esto quiere decir que el proceso se está ejecutando, pero sus páginas de código se han escrito en el disco para dejar espacio en la memoria de la computadora para que otro proceso se pueda ejecutar.

Existen procesos que no se pueden matar con kill porque cambian su PID dinámicamente.

Comando time

Sintaxis: time orden [argumentos]

time ejecuta la orden especificada y muestra por la salida de errores estándar:

  1. Tiempo transcurrido en el sistema mientras se ejecutaba la orden.
  2. Tiempo consumido en la ejecución de la orden.
  3. Tiempo empleado por el sistema para la ejecución de la orden (llamadas al sistema, ...).

Comando sleep

Sintaxis: sleep segundos

Suspende la ejecución durante los segundos especificados como parámetro. Se usa para ejecutar una orden después de un cierto tiempo.

Entradas relacionadas: