Procesos en sistemas Windows y Linux
Documento escrito por: Fernando Lucendo García
Puedes ver todos los documentos de este autor aquí.
¿Qué es un proceso?
Es la abstracción de un programa en ejecución, la unidad de trabajo del sistema.
Definición sencilla: es un programa en ejecución.
SO: Sistema operativo.
Para ejecutar un programa, el SO debe lanzar un proceso o procesos ejecutados por el microprocesador.
¿Cuándo se crea un proceso?
- Durante el arranque del SO.
- Un proceso hace una llamada al SO.
- Petición del usuario al SO.
- Inicio de un trabajo por lotes.
¿Qué funciones tendrá el SO en cuanto a procesos?
- Crear y eliminar procesos de usuario y sistema.
- Suspender y reanudar ejecución de procesos.
- Dar una sincronización, comunicación y planificación de procesos
SCB – System Control Block
Bloque de Control del Sistema
Para que nuestro SO gestione debidamente los procesos tiene que guardar información sobre estos procesos:
- Lista de descriptores de procesos
- Puntero al descriptor de proceso que usa la CPU
- Puntero a cola de procesos que está en distintos estados.
- Identificadores de rutinas para interrupciones HW o SW y errores.
El SCB gestiona una tabla de procesos y cada proceso tiene un PCB
PCB – Process Control Block
Bloque de Control de Procesos
Es creado por el SO cada vez que hay un nuevo proceso. Los procesos conocidos para el SO son elegibles para competir por los recursos cuando hay un PCB activo asociado a ellos. Cuando termina el programa, el PCB se elimina dejando espacio libre en registro para otros PCB.
El PCB se le denomina Task Struct en Linux.
Información del PCB:
Identificación:
- ID del proceso
- ID del proceso padre
- ID del usuario y grupo propietario
Planificación:
- Estado del proceso
- Si el estado es bloqueado, el evento por el que espera el proceso
- Prioridad del proceso
- Otra información usada como contadores, colas, etc…
Punteros a segmentos de memoria asignados:
- Segmento de datos, código y de pila.
Recursos asignados:
- Archivos abiertos: Tabla de manejadores de archivos o de descriptores
- Puertos de comunicación asignados
Punteros para organizar los procesos en colas
Información para comunicación entre procesos con señales y mensajes
Estados de un proceso
Un proceso puede pasar por diferentes estados, que se resumen en:
- Nuevo: Está siendo creado.
- En ejecución: Está haciendo uso del microprocesador.
- Bloqueado: No puede ejecutarse hasta que termine un evento externo.
- Preparado: Está listo para ser ejecutado.
- Terminado: Ha finalizado su ejecución.
Cuando un proceso finaliza su ejecución puede ser por:
- Ha finalizado normalmente.
- Ha finalizado con error.
- Ha finalizado por error fatal.
- Ha finalizado por otro proceso.
Transiciones de un estado
- Paso a ejecución: se toma el primero de la cola de preparados cuando el reloj interrumpa el que estaba ejecutándose
- Paso a preparado: (3 motivos)
- Creación: se carga el programa en memoria
- Desde ejecución: la CPU ejecutará otro proceso (cambio de contexto)
- Desde bloqueado: acabó una operación de E/S por la que esperaba.
- Paso a bloqueado:
- Desde ejecución: Se interrumpe para solicitar E/S
Cambio de contexto: Es la ejecución de una rutina del núcleo del SO multitarea de un PC, cuyo propósito es parar la ejecución de un hilo o proceso para ejecutar otro distinto.
La función del SO que realiza los cambios de contexto es el PLANIFICADOR, que se encarga de:
- Salvar el contexto del proceso que deja la CPU en su PCB.
- Quita el PCB del proceso que sale de la cola de ejecución. La cola de destino dependerá del motivo del cambio de contexto.
- Elige un nuevo proceso para entrar a ejecución. Esto lo hace el scheduler.
- Se mueve el PCB del proceso seleccionado a la cola de ejecución.
- Se restaura el contexto del proceso seleccionado para ejecutarse y se le da control.
Interrupciones
Permiten al SO controlar la CPU. Se produce cuando:
- Hay algún tipo de error.
- Hay un evento externo.
- Se ha agotado el límite de tiempo.
Cuando hay una interrupción el proceso que se ejecuta pasará a bloqueado.
Prioridades
Los SO cuentan con un planificador que decide qué proceso tiene prioridad. Tomar esta decisión y el tiempo de ejecución lo dará un algoritmo de planificación.
La planificación de procesos tiene como objetivos:
- Equidad: Todos los procesos deben atenderse.
- Eficacia: El procesador debe estar siempre ocupado.
- Tiempo de respuesta: Este tiempo debe ser el menor posible.
- Tiempo de retorno: Reducir el tiempo que tarda el proceso al mínimo.
- Rendimiento: Maximizar el número de tareas procesadas.
Algoritmos de planificación
FCFS = FIFO
Primero en llegar primero en servirse (First Come First Served).
Usa un orden de llegada. Si llega un proceso se pone en la cola detrás del que llegó antes que él y está listo para ejecutarse. Cuando comienza la ejecución no se interrumpe hasta terminar.
SJF
Primero el más corto (Shortest Job First).
Puede ser apropiativo o no apropiativo. Cada proceso tiene un tiempo que usará cuando vuelva a ejecutarse, y se irá ejecutando el que tenga menor tiempo. Si dos procesos tienen el mismo tiempo, se emplea FCFS.
Round Robin
Cada proceso tiene un tiempo determinado para ejecutarse. Si un proceso no termina continuará ejecutándose después de que todos los procesos cumplan su tiempo de ejecución.
Apropiativo
Es apropiativo cuando el proceso que se está ejecutando se adueña de la CPU y ningún proceso se la puede quitar tenga mayor o menor prioridad.
No apropiativo
Es no apropiativo cuando el proceso que entra puede obtener el dominio de la CPU si tiene una prioridad mayor.
Planificación por prioridad
Este tipo de planificación asigna una prioridad a cada proceso según un criterio y se atenderá cada proceso en función de su prioridad.
Planificación garantizada
En esta planificación el sistema cuenta el número de usuarios que deben atenderse. Se asignará un tiempo de ejecución 1/n a cada usuario. Siendo "n" el número de usuarios.
MQS
Multilevel Queue Scheduling o Planificación de Colas Múltiples
En este algoritmo la cola de procesos que se encuentran en estado de listos se divide en subcolas más pequeñas. Se clasifican los procesos para determinar la cola donde se irá. Cada cola puede manejar un algoritmo distinto a las demás.
Tiempos
En la planificación de procesos se tiene en cuenta los diferentes tiempos que pueden ser calculados, como son:
Tiempo de espera
Tiempo total que pasa un proceso en la cola de preparados
Tiempo de espera medio
Promedio de tiempos donde los procesos están listos
- En FCFS este tiempo suele ser largo.
- En SJF, para procesos largos tienen este tiempo muy grande, ya que se ejecutarán continuamente procesos más cortos y los largos esperarán.
- En Planificación por prioridad los procesos de prioridad baja podrían no ejecutarse. El programa soluciona esto elevando su prioridad.
Tiempo de retorno
Tiempo que transcurre desde la creación de un proceso hasta que termina su ejecución.
Tiempo de retorno normalizado
Tiempo Retorno Normalizado = Tiempo Retorno / Tiempo Servicio
Tiempo de retorno medio
Suma de los tiempos de retorno de cada proceso dividido entre el número total de procesos.
Tiempo de servicio
Tiempo que consumiría si fuese el único proceso existente. Es el tiempo de retorno menos el tiempo de espera. Tiempo de servicio = Tiempo Retorno - Tiempo Espera
Comunicación de procesos
Cuando un proceso se ejecuta de forma concurrente puede ser:
- Independientes: no puede verse alterado por otro proceso.
- Cooperativos: el proceso es afectado y afecta a los demás procesos.
Cuando los procesos son cooperativos debe haber mecanismos para compartir datos entre los procesos, el llamado IPC (InterProcess Communication). Razones para proporcionar entornos que permitan cooperación de procesos:
- Compartir información.
- Acelerar cálculos.
- Permitir modularidad.
Mecanismos de IPC
- Memoria compartida:
- Permite compartir un segmento de memoria a dos o más procesos y por consiguiente sus datos.
- La gestión del acceso se realiza por semáforos, usando las operaciones "wait" y "signal".
- Colas de mensajes:
- Cada proceso tiene su propia cola de mensajes.
- Si un proceso quiere mandar un mensaje lo manda a su cola de mensajes y queda almacenado ahí.
- Si un proceso extrae un mensaje de la cola, extrae el primer mensaje que se introdujo y se borra de la cola.
Otros mecanismos
Además del IPC existen otros más rudimentarios para comunicar procesos:
A través de variables de entorno: Solo es posible de padres a hijos.
Mediante señales: Indica que algo ha ocurrido y lleva como información de un número de señal.
Mediante redirección de la entrada salida (tuberías):
La forma más corriente a nivel de shell.
Es una forma práctica de redireccionar la salida estándar de un programa hacia la entrada estándar de otro.
Para ello se usa el símbolo | (pipe o tubería).
Ejemplo:
ps -a | sort
Hilos de ejecución
Podemos definir un hilo, hebra o subproceso (en inglés "thread") como la unidad de procesamiento más pequeña planificada por el sistema operativo.
- Permite a la aplicación realizar varias tareas a la vez.
- Los sistemas con varias CPUs permiten aumentar mucho el rendimiento del proceso.
- Comparten recursos como: Espacio de memoria, archivos abiertos...
- Algunos lenguajes permiten lidiar con los hilos de forma transparente (Java), pero en otros se necesita crearlos (C y C++).
Diferencia entre hilos y núcleos
Es fácil confundirlos por culpa de los fabricantes de microprocesadores.
- Diferencia: Los hilos se distinguen de los procesos en que los procesos son independientes.
- Ventajas:
- Se tarda menos en crear un hilo nuevo en un proceso existente.
- Un hilo termina antes que un proceso. Un proceso acabado tiene que eliminar su PCB, mientras que un hilo elimina su contexto y pila.
- Se tarda menos en cambiar entre dos hilos de un mismo proceso.
- Los hilos aumentan la eficiencia entre los programas.
Estado de un proceso con hilos
El estado del proceso dependerá del estado de sus hilos:
- Hilo en ejecución - Proceso en ejecución.
- No hay hilo en ejecución, pero sí preparado - Proceso preparado.
- Hilos bloqueados - Proceso bloqueado.
Gestión de procesos en sistemas Windows
PID: Identificador del proceso.
PPID: Identificador del proceso padre.
Usando el modo comando, en el CMD podemos utilizar los siguientes:
TASKLIST
: Lista todos los procesos
Ejemplos:
Ver la información detallada de las aplicaciones ejecutandose en el equipo.
TASKLIST /V /FI "STATUS eq running"
Muestra todas las tareas que usan el módulo ntdll.dll.
TASKLIST /M ntdll.dll
Muestra los procesos con un PID mayor que 1000
TASKLIST /V /FI "PID gt 1000"
TASKKILL
: Detiene tareas o procesos usando el PID.
Ejemplos:
Finaliza el proceso Bloc de notas de Windows
TASKKILL /F /IM notepad.exe
Cierra el proceso con el número de identidad 1250
TASKKILL /PID 1250
Cierra la consola de CMD y todos los procesos secundarios iniciados por ella.
TASKKILL /F /IM cmd.exe /T
Gestión de procesos en sistemas Linux
NICE Number: prioridad asignada al ejecutarlo.
tty: terminal en el que se está ejecutando.
RUID: identificador del usuario real, el que lo ejecutó.
EUID: identificador del usuario efectivo.
RGID: identificador del grupo real, grupo del usuario que lo ejecutó.
EGID: identificador del grupo efectivo.
Usando el modo comando, en la terminal podemos utilizar los siguientes:
Comando | Descripción |
---|---|
psgrep | Muestra el ID de un proceso |
ps | Muestra la lista de procesos de un usuario |
ps aux | Muestra la lista de procesos de la máquina |
pstree | Muestra los procesos en forma de árbol |
kill | Mata un proceso por su ID de proceso |
killall | Mata todas las instancias de un proceso |
pkill | Mata un proceso por su nombre |
top | Muestra los procesos que se ejecutan y permite matarlos |
htop | Una mejora de HTOP respecto a TOP es la navegación entre procesos |
nice | Permite cambiar prioridad de un proceso al iniciar su ejecución de nuevo |
renice | Permite cambiar prioridad de un proceso en tiempo real |
time | Mide el tiempo que tarda en ejecutarse un proceso |
fg | Mueve el proceso a primer plano |
bg | Mueve el proceso a segundo plano |
& | Colocado al final de la línea de un comando, lo ejecuta en 2º plano |
Todo lo que se está ejecutando en el sistema es un proceso, incluyendo el shell, la interfaz gráfica...
Demonios: es el nombre que reciben los procesos del sistema, funcionan solos y no interactúan con el usuario.
Procesos en primer o segundo plano
- Un proceso que corre en primer plano ("fg" de foreground), es introducido por teclado y muestra una ventana de terminal.
- Puede ser cancelado con la combinación
CTRL+C
. - Para cancelar un proceso en segundo plano necesitamos el comando
kill
.
man
antes de ejecutar algún comando podemos comprobar cuales son todas sus opciones y atributos así como su sintaxis en el propio sistema operativo. Por ejemplo para obtener el manual completo de uso del comando ps
escribiremos en una terminal el comando man ps
Procesos batch
No necesitan interacción con el usuario, corren en segundo plano ("bg" de background).
Control y gestión de la actividad de la CPU
Algunos comandos más:
uptime
Devuelve la hora actual, el tiempo que lleva en marcha, usuarios conectados y carga media del sistema en los últimos 1, 5 y 15 minutos.
ps -e
Muestra todos los procesos tanto los del sistema como los de los usuarios.
top
Esta orden permite realizar una serie de tareas sobre los procesos, como por ejemplo:
- Cambiar la prioridad de alguno utilizando la opción
r
. - Matar o enviar una señal con la opción
k
. - Ordenarlos por diferentes criterios: PID con
N
, uso de CPU conP
, tiempo conA
. - Con
n
se cambia el número de procesos que se muestra. - Para salir se usa la letra
q
.
- Cambiar la prioridad de alguno utilizando la opción
nohup
y&
Utilizado para ejecutar procesos en background (segundo plano). La diferencia entre ambos es que
&
depende del terminal donde se ejecuta, si se cierra termina su ejecución. Si queremos que aún cerrando la terminal se mantenga el proceso debemos usar los dos,nohup &
.jobs
Este comando lista los procesos actuales en ejecución. Agregando un número de trabajo junto a cada proceso, un símbolo (+) o (-), que indicará cual de estos procesos estará al frente con el + y cuál de ellos estará en segundo plano, y además de esto tendrá un estado que indicará cómo se encuentra ese proceso (Running, Stopped...).
mpstat
Muestra estadísticas del procesador y la media global de todos los datos.
Sintaxis:
mpstat intervalo número
- Intervalo: cada cuántos segundos se muestran los datos.
- Número: cuántos muestreos se solicita.Para instalar la herramienta debes ejecutar
apt-get install sysstat
.
vmstat
Información sobre la memoria virtual.
w
Quién está conectado y qué está haciendo.
Número NICE y prioridad de procesos
Al lanzar un proceso se le asigna un valor de prioridad estática, el llamado número nice. La prioridad dinámica del proceso se calcula con el número nice junto a su consumo de CPU.
NICE NUMBER un número positivo aquí significa menor prioridad, un número negativo indica mayor prioridad. Siendo -20 la prioridad mayor y 20 la prioridad menor. Mejorar la prioridad de un proceso sólo puede hacerlo un root.
Ejemplo de sintaxis
nice -5 konqueror
- Bajar en 5 la prioridad.
nice --10 konqueror
- Mejorar en 10 la prioridad.
renice 14 2579
- Asignarle una prioridad 14 al proceso con PID 2579.
Señales
A veces necesitamos enviar señales a los procesos para pararlos, eliminarlos, hacerlos continuar, etc.
kill [-señal] pid
- Enviar una señal, siendo pid el identificador de proceso.
kill pid
- Terminar el proceso del pid indicado de forma "correcta". Puede ser capturado y envía la señal SIGTERM (15).
killall [-señal] programa
- Envía una señal a todos los procesos indicados por el nombre del programa. Ejemplo: killall -15 bash
.
pkill ó skill
- Envía una señal usando nombre u otros atributos (UID, GID...).
kill -l
Lista todas las posibles señales que se pueden enviar a un proceso.
Ejemplo de sintaxis de señales
kill -9 3452
- Termina o mata un proceso completamente (-9 = SIGKILL).
kill -SIGKILL 3452
- Hace lo mismo que la anterior señal.
Las señales más usadas son:
SIGHUP
(1) para obligar al proceso a releer sus archivos durante la ejecución.SIGKILL
(9) para terminar un proceso.SIGCONT
(18) para continuar un proceso o programa.SIGSTOP
(19) detiene momentaneamente la ejecución de un proceso o programa.SIGTSTP
(20) Igual que la anterior.
Ejercicios para practicar
WINDOWS
Crear en el escritorio una lista detallada de los procesos en ejecución en un archivo CSV que se puede abrir con Excel.
Crear en el escritorio una lista sencilla de los procesos en ejecución con los servicios hospedados en cada proceso, en un archivo de texto TXT que se abre con el Bloc de notas.
Ver información detallada de las aplicaciones ejecutándose en el equipo.
Cierra la consola de CMD y todos los procesos secundarios iniciados por ella
Permite cerrar el explorador de Windows ante un bloqueo y a continuación volverlo a iniciar.
LINUX
Ejecute el comando sleep 1111 en segundo plano. ¿Qué significa lo que retorna a la pantalla?
Ejecute en primer plano el comando sleep 4444. Después intente recuperar el control de su shell actual
Pare el proceso sleep 1111 utilizando su número de trabajo
Visualizar mediante el editor vi el archivo que contiene la información de los usuarios del sistema. Ejecutar el programa vi con la máxima prioridad posible.
Mediante la orden top establecer una prioridad normal al editor vi y después terminar el proceso del editor.
Elimina un proceso que lleve más de n minutos ejecutándose.
Soluciones de los ejercicios
TASKLIST /FO CSV > procesos.csv
TASKLIST /FI “STATUS eq running” /SVC /FO LIST > ejercicio2.txt
TASKLIST /V /FI "STATUS eq running"
TASKKILL /F /IM cmd.exe /T
TASKKILL /IM explorer.exe /FI "STATUS eq NOT RESPONDING" & start explorer.exe
sleep 1111 &
La pantalla devuelve un número, que indica el ID del proceso asociado.sleep 4444
Para recuperar el control del shell pulsaremosCTRL+C
kill -19 %2
Siendo el número 2 el número de trabajo.sudo vi /etc/passwd
Ejecutará el editor vi.nice -20 vi /etc/passwd
Cambiará vi a la máxima prioridad.sudo top
Abrirá top, donde buscaremos el proceso vi, a continuación pulsamos la letrar
y escribimos su PID. Después introducimos el número NICE que queremos agregar, por ejemplo 1. Para terminar el proceso vi: En una nueva terminal pondremossudo top
y abrirá top, donde buscaremos el PID del proceso vi y luego pulsamos la letrak
y escribiremos su PID. Esto enviará una señal SIGTERM y matará el proceso del PID indicado, en este caso, vi.killall -o 20m sleep
Siendo 20m el tiempo (20 minutos, por ejemplo) y sleep el proceso