Que es un proceso?

Un proceso es una instancia activa en ejecucion de un programa.

Para que sirven los procesos?

Los procesos son la estructuras que utiliza el kernel para ir gestionando la asignacion de recursos, para organizar la activad que se esta realizando, etc.

El kernel mantiene diferente infomacion sobre los procesos, como la memora asignada a uno, los archivos que tiene abiertos, el ejecutable a partir del cual se inicio el proceso,etc. Toda esta infomacion se guarda en el directorio /proc.

Cada uno de los procesos tiene un Identificador, llamado PID (proccess id), por eso mismo si hacemos un ls sobre proc veremos muchos numeros, esos numeros son los PID de lo que tenemos en ejecucion.

Como podemos saber cual es el PID de una app?

Hacemos uso de pidof nombre_de_la_app

Resumen

Un proceso es la instancia activa de una aplicacion. Cada proceso tiene asignado un PID que lo identifica mientras este en ejecucion. Podemos saber que PID tiene una app con pidof.

Visualizacion estatica de procesos

Como podemos ver los procesos?

Podemos hacer uso del comando ps este nos devuelve un snapshot del momento en que tiramos
el comando. Esto quiere decir que no es en tiempo real.

Por default ps nos devuelve los procesos asociados con la terminal actual.

PID       TTY          TIME         CMD
1085524   pts/13       00:00:00     bash
1100212   pts/13       00:00:00     ps

Podemos ver :

  1. PDI del proceso.
  2. TTY a que terminal esta asociado ese proceso.
  3. TIME tiempo de consumo en el cpu
  4. CMD El comando que genero ese proceso.

Como podemos ver todos los procesos?

Con ps x vemos todos los procesos del sistema.

Este comando tambien nos trae infomacion adicional como la columna stat (estado).

PID   TTY      STAT   TIME     COMMAND
  2504  ?        Ss     2:11     /usr/lib/systemd/systemd --user
  2511  ?        S      0:00     (sd-pam)
  2520  ?        S<sl  12:25     /usr/bin/pipewire

Cada una de esas letras tiene un significado y esta relacionado con el estado en el que se encuentra cada proceso. Para saber que significa cada una de estas letras podemos verlo con man ps .

Las mas comunes:

  1. S : sleep, queda asi hasta que un evento lo active, (click,hover,etc)
  2. < : proceso de alta prioridad.

Si el kernel detecta que dos app solicitan al mismo tiempo mas cpu, el kernel se la asignara primero a este.

  1. l : Procesos multi hilo
  2. R : runing

Comando ps mas utilizado

Es ps aux nos sale mucha mas informacion.

Vizualizacion dinamica de procesos

Tenemos la posibilidad de poder ver estos procesos en tiempo real. El comando mas comun para esto es top, este tiene muchos parametros que podemos ver en man top.

Veremos que este comando se divide en dos partes, la cabecera y el cuerpo.

Cabecera

  1. top: Es el tiempo que nuestra pc esta encendida.
  2. users : La cantidad de usuarios logeados.
  3. load average: : La cantidad de procesos que estan ejecutados(en promedio) y que comparten cpu.

Este vemos que tiene 3 separaciones x,y,z

La primera: muestra los ultimos 60 segundos. La segunda: muestra los ultimos 5 minutos. La tercera: muestra la media de los ultimos 15 minutos

  1. Tasks: La cantidad de procesos en ejecucion.
  2. Running: en base a las Tasks nos dicen cuantos estan corriendo.
  3. Sleep : en base a las Tasks nos dicen cuantos estan dormidos.
  4. stopped :nos dice cuantos estan detenidos.
  5. zombie: nos dice cuantos procesos han terminado su ejecucion pero que su proceso padre no ah podido leer el codigo de salida.

Estos procesos no estan activos ni consumen CPU o memoria, pero ocupan un espacio en la tabla de procesos del sistema.

Esto ocurre porque el proceso padre no ha leído el código de salida del proceso hijo mediante una llamada al sistema wait() o alguna de sus variantes.

Cuando un proceso hijo finaliza, envía una señal al proceso padre para notificarle que ha terminado. Si el proceso padre no maneja esa señal correctamente (no llama a wait()), el proceso hijo queda en un estado zombie.

Si un proceso zombie persiste mucho tiempo, puede indicar un problema con el proceso padre, ya que no está manejando adecuadamente la finalización de sus hijos. La única forma de eliminar un proceso zombie es asegurarse de que su proceso padre lo recoja o terminando el proceso padre, lo que convierte al proceso zombie en un huérfano que el proceso init (PID 1) puede recoger automáticamente.

Un proceso en estado zombie se identifica fácilmente en herramientas como top o ps porque su estado se muestra como “Z” (de zombie).

  1. %CPU: Indica el consumo de CPU, este esta dividio en varios valores.

  2. Indica el numero de CPU que se usa por proceso de usuario.

  3. Indica el consumo de CPU que usa el sistema.

  4. Indica los procesos nice que son los procesos que le dan a otros CPU que tengan mas prioridad.

  5. Indica la cantidad de CPU que tenemos libre (id).

  6. MiB: Indica el consumo de memoria ram.Tambien esta dividido.

Cuerpo

Encontramos:

  1. PID.
  2. USER.
  3. PR: Es la prioridad, cuanto mas alta mas chance de que otros procesos le cendan recursos.
  4. NI: nice, cuanto mas bajo el numero mas “bueno” sera con el resto de procesos y les va a ceder sus recursos.
  5. VIRT: consumo de memoria virtual
  6. RES: consumo de memoria RAM en kb (podemos ver el procentaje en %MEM)
  7. SHR: memoria compartida con otrs procesos.
  8. S: el estdo.
  9. %CPU
  10. %MEM
  11. TIME: tiempo de que ese proceso esta en ejecucion.

top muestra por default de los procesos que mas consumen hacia los que menos.

Si al momento de estar parados sobre top, presionamos la h veremos todas las acciones disponibles. Por ejemplo:

  1. La s nos permite cambiar el tiempo de refresco.
  2. La u filtramos procesos por usuarios.
  3. La e nos muestra los valores de kb a mb y a gb
  4. La o nos permite filtrar por culumna : PID=5000 | %CPU > 2

Interrupcion de procesos

Una de las maneras es el cierre de procesos de manera ordenada, la cual es la clasica, clickeando la x en una de las esquinas de la app.

Las otras son las no ordenadas (una interrupcion). La mas basica de las no ordenadas es ctrl+c. Pero esto no sirve para todos los procesos, por eso es que tenemos mas avanzadas.

  1. ctrl+z: Detiene el procesos y lo envia a 2do plano. Si vemos con top veremos que antes de usar este comando la app estara marcada con s de sleep lo cual indica que esta esperando un evento. Cuando hacemos ctrl+z, este estado cambia por t, en caso de que este proceso tenga interfaz grafica veremos que no responde. Cuando detenemos un proceso, este
    deja de consumir recursos.

Para reanudar el proceso hacemos bg %1 ahora no solo la interfaz vuelve a responder sino que nos libero la terminal ya que se reanudo en segundo plano.

Procesos en 2do plano

Los procesos en segundo plano , son inmunes a la entrada de teclado. Por lo que ctrl+c no nos sirve

Como ejecutar un programa en 2do plano?

Con la ayuda de &

nvim &

Ese comando nos devuelve esto :

[1] 40302

El primer numero [1] representa el identificador del job y el segundo es el PID.

Si en la terminal ejecutamos job veremos los procesos en 2do plano de esa terminal.

JobGroupCPUStateCommand
2131760%stoppedtop &
1130860%stoppednvim & a merkdown

Como mencionamos antes, podemos volver a ejecutar en 2do plano con bg %1 , %1 es el ID Del JOB

Podemos volver al primer plano una app que ya esta en 2do?

Si, podemos hacerlo con fg %jobId (foreground)

Como podemos detener un proceso en 2do plano sin tener que treaerlo al primer plano?

Eso lo vemos en la siguiente seccion.

Signals (seniales)

Las seniales son una de las varias formas con las que el sistema operativo se va a poder comunicar con los programas.

Por ejemplo:

  1. ctrl+c envia la senial int (interrupt).
  2. ctrl+z envia la senial tstp (terminal stop)
  • Cómo se envía: Normalmente, se envía automáticamente al presionar Ctrl+Z en una terminal. Esto suspende el proceso actual y lo deja en estado de “stopped”, permitiendo que más tarde pueda reanudarse con los comandos fg o bg.

Los programas a su vez “escuchan” los tipos de seniales que pueden recibir de la terminal y ejecutan una accion. En el caso de los Signals anteriores, un cierre ordenado.

En resumen las seniales son un mecanismo de comunicacion entre en sistema operativo y las apps que estan en ejecucion.

Como le enviamos seniales a un proceso?

Haciendo uso del comando kill - (man kill)

Seniales principales con kill

TSTP/20

Para enviar un ctrl+z seria:

kill -20 31421
  1. 20 es la representacion numerica de TSTP (ctrl+z).
  2. 31421 es el PID

Ahora el proceso 31421 esta detenido.

Otra menera de haber relizado esa accion es con las siglas:

kill -TSTP 31421

CONT/18

Para reanudar el proceso detenido :

kill -CONT 31421
kill -18 31421

STOP/19

kill -STOP 31421

Que diferencia hay entre STOP Y TSTP

TSTP, envia la senial al programa, quien es el que decide como detenerse o ignorar el signal. STOP, el kernel detiene la app , permitiendo que haga un cierre pero evitando que lo ignore.

Reanudando STOP

AL igual que con TSTP

kill -CONT 31421
kill -18 31421

INT/2

kill -INT 31421
kill -2 31421

KIll/9

kill -KILL 31421

Que diferencia hay entre INT Y KILL

INT, envia la senial al programa, quien es el que decide como cerrarce o ignorar el signal. KILL, el kernel cierra la app , permitiendo que haga un cierre pero evitando que lo ignore.

TERM/15

Este es usado por detras por -KILL son lo mismo

Ver todas las seniales

kill -l

killall

Manda senial con kill a varios procesos por su nombre

killall nvim

Init, demonios y servicios

Init, es el proceso mas ancenstral de nuestro SO. Cuando iniciamos el SO , Init es lo primero que se ejecuta y da pie y sustento a todos lo que se ejecute despues. Esto quiere decir que los deomonios y los servicios son inicializados por init (etc/init.d).

Demonio, se donomina a cualquier proceso o programa que se esta ejecutando el 2do plano que no recibe interaccion por parte del usuario.

Servicio, es lo mismo que un daemon con la diferencia de que puede recibir infomacion de otros procesos a travez de la red. Tambien prodria no serlo , puede ejecutarse en primer plano e interactuar con el mientras recibe infomacion de otros procesos.

Los servicios y demonios estan definidos por los scripts que estan en: /etc/init.d

Los scripts de este directorio se dividen en dos tipo:

  1. Los k (kill scripts)
  2. Los s (start scripts)

Los scripts k siempre se ejecutan antes que los s (el proceso init lo hace asi)

Como podemos saber cuales son los k?

Vamos a /etc/init/whoopsie.conf alli se encontraran.

Como podemos saber cuales son los s?

Vamos a /etc/default alli se encontraran.

Todos los que veamos ahi estaran en /etc/init.d

Gestion de servicios: init.d,systemctl,service

Estos servicios y demonios pueden recibir argumentos adicionales para conocer su estado, detenerlos o recargarlos.

Para ver esos argumentos podemos hacerles un cat por ejempo cat apparmor estando en la ruta etc/init.d

Tenemos varias maneras.

  1. Ir a /etc/init.d y ejecutarlos a mano: ./el-servicio argumento se la siguiente manera: ./apparmor status, Si intententamos detener o iniciar un servicio tenemos que ser root.
  • Para detener ./apparmor stop
  • Para inicar ./apparmor start
  1. Con systemd es un gestor de servicios, nos permite abstraer a mas alto nivel la manipulacion de estos servicios en sistemas operativos linux. a. systectl: systemctl stop apparmor b. systectl: systemctl start apparmor c. systectl: systemctl status apparmor.service

Como vemos en el punto c opcionalmente podemos poner .service

Comando service

Este comando es aun mas alto nivel en la abstraccion, envuelve el comportamiento de systemctl e init.d.

Cuando hacemos uso de el, lo primero que intenta buscar es upstat que ya no esta presente en ubuntu y si no lo encuentra buscara a systemctl y si no lo encuentra va a los scripts de init.d.

El modo de uso seria :

service apparmor status

Listar todos los servicios en ejecucion

systemctl list-units --type=serice

¿Alguna vez te has preguntado que es lo ocurre desde que pulsas el botón de encendido de tu ordenador hasta que se carga el sistema operativo?

Las siguientes son las 6 etapas de alto nivel de un típico proceso de arranque de Linux.

boot linux

1. BIOS

BIOS significa Sistema Básico de Entrada/Salida.

  • Realiza algunas comprobaciones de integridad del sistema.
  • Busca, carga y ejecuta el programa cargador de arranque.
  • Busca el gestor de arranque en el disquete, cd-rom o disco duro. Puedes pulsar una tecla (normalmente F12 o F2, pero depende de tu sistema) durante el arranque de la BIOS para cambiar la secuencia de arranque.
  • Una vez que el programa de arranque es detectado y cargado en la memoria, la BIOS le da el control.

En términos simples, BIOS carga y ejecuta el cargador de arranque MBR.

2. MBR

MBR significa Master Boot Record.

  • Se encuentra en el primer sector del disco de arranque. Normalmente es /dev/hda, o /dev/sda.
  • El MBR tiene un tamaño inferior a 512 bytes. Tiene tres componentes:
    1. Información del cargador de arranque primario en los primeros 446 bytes.
    2. Información de la tabla de particiones en los siguientes 64 bytes.
    3. Comprobación de validación del MBR en los últimos 2 bytes.
  • Contiene información sobre GRUB (o LILO en sistemas antiguos).

En términos simples, MBR carga y ejecuta el cargador de arranque GRUB.

3. GRUB

GRUB significa Grand Unified Bootloader.

  • Si tienes varias imágenes del kernel instaladas en tu sistema, puedes elegir cuál se ejecutará.
  • GRUB muestra una pantalla de bienvenida, espera unos segundos y, si no introduces nada, carga la imagen del kernel por defecto como se especifica en el archivo de configuración de GRUB.
  • GRUB entiende los sistemas de archivos (el antiguo cargador LILO no los entendía).

El archivo de configuración de GRUB es /boot/grub/grub.conf (en algunos sistemas, /etc/grub.conf es un enlace a esto).

En términos simples, GRUB sólo carga y ejecuta las imágenes del Kernel y del initrd.

4. Kernel

  • Monta el sistema de archivos raíz como se especifica en el “root=” en grub.conf.
  • El Kernel ejecuta el programa /sbin/init.
  • Como init fue el primer programa ejecutado por el Kernel de Linux, tiene el ID de proceso (PID) 1.
  • initrd significa Disco RAM Inicial.

El initrd es utilizado por el Kernel como sistema de archivos raíz temporal hasta que el sistema de archivos raíz real es montado. También contiene los controladores necesarios compilados en su interior, que le ayudan a acceder a las particiones del disco duro y a otro hardware.

5. Init

  • Lee el archivo /etc/inittab para decidir el nivel de ejecución de Linux.

  • Los niveles de ejecución disponibles son los siguientes:

    • 0: halt
    • 1: Modo de usuario único
    • 2: Multiusuario, sin NFS
    • 3: Modo multiusuario completo
    • 4: Sin uso
    • 5: X11
    • 6: Reinicio

Init identifica el nivel por defecto en sus archivos de configuración y lo utiliza para cargar el resto de los programas.

Ejecuta el comando runlevel en tu sistema para identificar el nivel de ejecución por defecto. Típicamente, el nivel de ejecución por defecto se establece en 3 o 5.

6. Programas de nivel de ejecución

Cuando el sistema Linux está arrancando, se inician varios servicios. Estos son los programas de nivel de ejecución, ejecutados desde el directorio de nivel de ejecución definido por el nivel de ejecución.

Dependiendo de la configuración de nivel de init por defecto, el sistema ejecutará los programas desde uno de los siguientes directorios:

  • Nivel de ejecución 0: /etc/rc.d/rc0.d/
  • Nivel de ejecución 1: /etc/rc.d/rc1.d/
  • Nivel de ejecución 2: /etc/rc.d/rc2.d/
  • Nivel de ejecución 3: /etc/rc.d/rc3.d/
  • Nivel de ejecución 4: /etc/rc.d/rc4.d/
  • Nivel de ejecución 5: /etc/rc.d/rc5.d/
  • Nivel de ejecución 6: /etc/rc.d/rc6.d/

También hay enlaces simbólicos disponibles para estos directorios bajo /etc directamente. Por ejemplo, /etc/rc0.d está vinculado a /etc/rc.d/rc0.d.

Dentro de los directorios /etc/rc.d/rc*.d/, verás programas que comienzan con S y K.

  • Los programas que comienzan por S se utilizan durante el arranque (S para start).
  • Los programas que comienzan con K se utilizan durante el apagado (K para kill).

Los números junto a las letras S y K en los nombres de los programas indican la secuencia en la que deben ser iniciados o eliminados.

Por ejemplo:

  • S12syslog es para iniciar el demonio de syslog, que tiene el número de secuencia 12.
  • S80sendmail es para iniciar el demonio sendmail, que tiene el número de secuencia 80.

Así, el programa syslog se iniciará antes que sendmail.

Apagado del sistema: halt, poweroff, reboot, shutdown

  1. halt,poweroff, apagan la maquina.
  2. reboot Reinicia la maquina.
  3. shutdown Permite pasarla parametros
  4. shutdown -r now reinicia sin delay
  5. shutdown -h now apaga sin delay

Cambio de prioridad: nice, renice

Ejecutamos con :

nice -n 10 ./programa.sh

De esta manera, esta ejecucion permitira que el kernel le de mas recusos a sus programs hermanos dentro del hijo del procesador

Para decir explicitamente en que hilo queremos que se ejecute un programa lo hacemos asi :

taskset --cpu-list [nro del hilo] ./programa.sh
taskset --cpu-list 1 ./programa.sh
taskset --cpu-list 1 nice -n 10 ./programa.sh

Cuando miramos la prioridad con top veremos que el valor de PR es NI + PR(20 por default). Esto quiere decir que veremos NI = 30

Como cambiamos la prioridad de un proceso que ya esta en ejecucion.

Lo hacemos con renice

renice value -p PID
renice -10 -p 15444

Si lo ue hacemos es aumentar el nice para que sea mas “bueno” no nos pide ser root Pero si intententamos darle mas prioridad con -15 no podremos al menos que seamos root

Recordemos que mientras mas PR menos prioridad, por lo que si le damos al NI -15 PR sera 5, y esto es muy alto.