Llamadas al sistema
Vamos a ver algunos conceptos de programación como son las definiciones de programa, de proceso e hilos. Analizaremos el mecanismo de llamadas al sistema, en sistemas GNU/Linux, que permite aceptar las peticiones, que desde el entorno del usuario, llegan al sistema.
Sumario
- Llamadas al sistema
- Programas, procesos e hilos o «thread»
- Tipos de procesos
- hilo o «thread»
- Listado y gestión de procesos
Llamadas al sistema
Las llamadas al sistema que realizan los programas, utilizan una instrucción de la CPU que provoca que el procesador transfiera el control a un código privilegiado, el núcleo o kernel. Estas llamadas al sistema, en sistemas UNIX, están bajo la norma POSIX, acrónimo de «Portable Operating System Interface», y la «X» de UNIX. Algunas de las llamadas al sistema más utilizadas son: «open», «Read»(system call), «write», «close», «wait», «exec», «fork», «exit» y «kill».
GNU/Linux es un Sistema Operativo multitaréa, en el que tenemos muchos procesos en ejecución. Nos podemos encontrar con que, por un fallo de programación o por un ataque malintencionado, algún proceso ponga en peligro la estabilidad del sistema. Para proteger esta estabilidad, el nucleo o kernel del S.O., corre en un entorno diferente del resto de programas. Es por ello que hablamos de dos modos de ejecución totalmente separados: el modo kernel y el modo usuario. Estos modos disponen de memoria y procedimientos diferentes, impidiendo que un programa de usuario, pueda dañar al núcleo.
Lógicamente debe existir una interrelación entre los dos modos que se ejecutan diferenciadamente. Si no fuese así, no podríamos, por ejemplo, escribir en el disco duro. Esta interacción se realiza mediante las «llamadas o peticiones al sistema» (syscalls).
Por tanto, para que los procesos y aplicaciones de usuario puedan acceden a los servicios del núcleo, tienen que realizar una llamada al sistema (syscalls), que son la interfaz que proporciona el kernel, para realizar las operaciones propias del modo kernel, desde el modo usuario. Por ejemplo acceder al disco y escribir o leer.
En la siguiente imagen vemos, de forma gráfica, cómo funciona la «syscall» read()

En este caso, el proceso usuario, requiere acceder al disco para leer, y para hacerlo necesita ejecutar la «syscall» read(), utilizando la interfaz de llamadas al sistema. El kernel recibe la petición, accede al hardware, y devuelve el resultado al proceso que inició la petición. Imaginemos un almacén de fontanería, donde los clientes piden lo que quieren al dependiente y este, lo busca y saca, sin permitir el acceso a ningún extraño al almacén, garantizando la seguridad.
La ejecución de las aplicaciones de usuario se canalizan, siempre, a través de las peticiones al sistema mediante solicitudes al kernel. Para evitar desestabilizar el sistema deberemos ser cautelosos a la hora de cargar «drivers» o módulos en nuestro núcleo.
Programas, procesos e hilo o «thread»
Normalmente, de forma reduccionista, y para que se entienda, se suele decir que un proceso es un programa que se está ejecutando en un momento dado en el sistema. Pero hay algo más.
Cuando usamos un sistema operativo GNU/Linux, existen una serie de procesos ejecutándose constantemente, de forma transparente para el usuario, que hacen que el sistema sea utilizable.
El primer proceso que se ejecuta es el que se encarga de establecer el nivel de ejecución correspondiente, llamado «init». Puedes encontrar más información en «Proceso de arranque del sistema». A continuación se ejecutan los procesos correspondientes a las terminales (tt/s), los sistemas de «login» (el software pide un usuario y una contraseña) y, finalmente, el intérprete de órdenes (bash, generalmente). Todos esos procesos están funcionando en el sistema cuando tenemos el equipo en marcha.
Los procesos mantienen una estructura jerárquica, todos los procesos tienen un proceso padre que los ha lanzado y son denominados procesos hijos de aquél. En los sistemas GNU/Linux, todos los procesos son hijos del proceso «init».
Cuando matamos un proceso, de forma automática, matamos los procesos hijos que este haya creado y, seguramente, estaremos cerrando un programa.
Tipos de procesos
Existen dos tipos de procesos: los de usuario y los demonios «daemons».
Los procesos de usuario constituyen los programas que tenemos en ejecución y que están asociados a una terminal, es decir, el programa aparece en pantalla y el usuario interactúa con él.
Los «daemons» o demonios, son procesos que no están asociados a una terminal, funcionan sin requerir nuestra intervención. Son procesos que proveen servicios, como servidores de red, web o cualquier otro servicio. Para gestionar estos servicios utilizamos «systemctl».

Los procesos pueden estar vivos, o pueden estar muertos, son lanzados (nacen) o pueden ser matados. También pueden ser zombies, o pueden quedar huérfanos (sin proceso padre). Y, como ya hemos visto, son padres e hijos de otros procesos.
Profundizando un poco más, podemos afirmar que un proceso es una entidad activa que tiene asociada un conjunto de atributos: código, datos, pila, registros e identificador único, y que representa la entidad de ejecución utilizada por el Sistema Operativo. También habrás visto referirse a ellos como tareas «tasks».
Sin embargo, un programa es una entidad pasiva. Solo cuando el programa tiene asignados recursos, tiempo de procesador y memoria, se convierte en proceso, por tanto implica la existencia de un entorno concreto.
Resumiendo, generalmente un proceso:
- Es la unidad de asignación de recursos: el Sistema Operativo va asignando los recursos del sistema a cada proceso.
- Es una unidad de ejecución: un proceso es una entidad activa que puede ser ejecutada.
hilo o «thread»
No obstante, en algunos S.O., y dependiendo del procesador utilizado, estas unidades se separan creando lo que se llaman hilos o «thread». Esta separación no crea un nuevo proceso, sino que genera flujos de ejecución disjuntos dentro del mismo proceso, pero, los hilos, siguen compartiendo los recursos asignados al proceso. También son conocidos como «LWP» proceso ligero (lightweight process).
Puedes ver «CPU Segmentada o pipeline» , para profundizar más en el asunto.

Este sistema consigue que la creación de hilos y el cambio de ejecución entre hilos sea menos costoso, en cuanto a recursos y tiempo, que el cambio de contexto entre procesos, optimizando el rendimiento del sistema.

Los S.O. multiusuario y multitarea, nos hacer creer que, los usuarios, disponemos del sistema al completo, pero solo es una ilusión. Los procesadores actuales tienen una capacidad de realizar múltiples tareas, pero la realizan secuencialmente. Un procesador de 5Ghz, realizará 5.000 millones de operaciones por segundo, lo que nos dará la sensación de que se ejecuta todo a la vez. Por eso los hilos mejoran el rendimiento, no la velocidad de proceso.
Listado y gestión de procesos
Para obtener un listado de procesos en cualquier sistema UNIX, disponemos de un comando «ps». Su sintaxis es sencilla
ps

La información que nos ofrece es la siguiente
- Primera columna: (PID), nos indica el número ID del proceso seleccionado. Todos los procesos están identificados por un número, que tendremos que utilizar cada vez que queramos hacer referencia a ese proceso.
- Segunda columna: indica la terminal en la que se está ejecutando el proceso.
- Tercera columna: ofrece el tiempo que el proceso ha consumido al ser lanzado.
- Cuarta columna: (CMD) señala qué comando se ha utilizado para ejecutar dicho proceso.
Si utilizamos el comando «ps» sin opciones, sólo muestra los procesos de usuario. Aquí no veremos los «daemon». Si queremos ver todos los procesos del sistema, tenemos que añadir las opciones «ax» al comando. Nos dará muchísima más información.
ps ax

Información que nos ofrece
Primera columna: (PID), nos indica el número ID del proceso seleccionado.
Segunda columna: indica la terminal en la que se está ejecutando el proceso.
Tercera columna: muestra el estado del proceso.
Cuarta columna: ofrece el tiempo que el proceso ha consumido al ser lanzado.
Quinta columna: (CMD) señala qué comando se ha utilizado para ejecutar dicho proceso.
En los procesos que encontramos un símbolo «?» en la columna TTY, nos indica que son procesos «daemon», que no están siendo ejecutados en ninguna terminal específica y que se ejecutan en segundo plano.
Otras herramientas
Disponemos de dos herramientas más, muy útiles, para obtener un listado de procesos en tiempo real y administrarlos. Esta utilidad se llama top y está incorporada en casi todas las versiones de UNIX, incluido GNU/Linux. Para ejecutarla, simplemente tendremos que escribir el comando «top».

Con esta herramienta obtenemos mucha más información. En la primera linea de la cabecera nos muestra: hora actual, tiempo que ha estado el sistema encendido, número de usuarios logueados, y carga media en intervalos de 5, 10 y 15 minutos.
En la segunda nos da el total de tareas y procesos y estado de las mismas: Running: procesos ejecutándose actualmente o preparados para ejecutarse, Sleeping: procesos dormidos esperando que ocurra algo para ejecutarse, Stopped: ejecución de proceso detenida, Zombie: el proceso no está siendo ejecutado. Los procesos se quedan en este estado cuando el proceso que los ha iniciado muere (proceso padre).
En la tercera linea nos muestra los porcentajes de uso del procesador por el usuario, kernel, procesos inactivos, en espera, interrupciones hardware e interrupciones software.
Si nos fijamos, en la cuarta nos muestra la memoria física total, utilizada, libre y utilizada por el buffer.
En la quinta nos ofrece la memoria virtual total, usada, libre y memoria cache.
En cuanto a las columnas de información de los procesos encontramos debajo:
- PID: es el identificador de proceso. Cada proceso tiene un identificador único,
- USER (USUARIO): usuario propietario del proceso,
- PR: prioridad del proceso, (si vemos RT es que se está ejecutando en tiempo real),
- NI: asigna la prioridad, (si tiene un valor bajo (hasta -20) quiere decir que tiene más prioridad que otro con valor alto (hasta 19),
- VIRT: cantidad de memoria virtual utilizada por el proceso,
- RES: cantidad de memoria RAM física que utiliza el proceso,
- SHR: memoria compartida,
- S (ESTADO): estado del proceso,
- %CPU: porcentaje de CPU utilizado desde la última actualización,
- %MEM: porcentaje de memoria física utilizada por el proceso desde la última actualización,
- TIME+ (HORA+): tiempo total de CPU que ha usado el proceso desde su inicio y
- COMMAND: comando utilizado para iniciar el proceso.
Puedes consultar el manual integrado ejecutando
man top
o «htop», para una versión más actual, en la terminal. Si no lo tienes instalado, lo instalas con,
sudo apt install htop

Y lo ejecutamos con «htop».

Tenemos una interfaz gráfica que nos permite gestionar los procesos. La información es similar a la que obtenemos con «top».
También podemos verlos con una herramienta gráfica que encontramos en todos los escritorios, «Monitor del sistema».

En las otras dos pestañas nos da información de los recursos y sistemas de ficheros.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto , tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en pie de la página o desde aquí mismo.