Procesos en Linux

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 8

Procesos en Linux

Jairo Díaz, Lourdes Barreto, Jairo Quevedo,Stiven Bustamante

Palabras clave: Procesos, estados, identificador, sistema.

1. Introducción

Un proceso en Linux es el conjunto de un grupo de instrucciones de un programa destinadas a ser


ejecutadas, su estado de ejecución para un momento dado, es decir los valores de los registros de la
CPU para dicho programa, la memoria de trabajo reservada y sus contenidos. De esta manera un proceso
no es más que la instancia de un proceso en ejecución, del mismo modo que las instrucciones de
programa los procesos incluyen contador de programa para indicar la siguiente instrucción a ejecutar
de ese proceso y los registros de la CPU, pilas para contener datos temporales para el caso de parámetros
de subrutina, direcciones de retorno y variables locales. Por último los procesos también tienen una
sección de datos con variables globales y memoria dinámica, todo esto con el fin de gestionar
eficazmente múltiples procesos, siendo cada uno de ellos independientes entre sí.

Linux permite la creación de un proceso a partir de otro, siendo el primero el proceso padre y el segundo
el proceso hijo, los procesos a su vez pueden ser padres e hijos y además múltiples procesos hijos
pueden compartir el mismo padre. Para diferenciar un proceso de otro Linux maneja un identificador
único (PID) y un identificador padre (PPID) para cada proceso, permitiendo así un mayor control sobre
cada uno de ellos, además garantiza que cada proceso tenga un padre, siendo todos directa o
indirectamente hijos del proceso “init” creado al inicio de sistema (PID: 1) imposible de eliminar a
excepción de apagar el sistema.

2. PID

En Linux cada uno de los procesos es la instancia en ejecución de un programa específico, al ser un
sistema multitarea tendremos múltiples procesos ejecutándose simultáneamente haciendo uso de la
CPU para ejecutar cada una de sus instrucciones, de modo que es necesario tener una distinción de cada
uno de ellos, lo cual es posible gracias a la utilización de múltiples identificadores, siendo el más
importante es el PID (Process ID). De esta manera este identificador permite la manipulación de cada
uno de los procesos haciendo posible cambios sobre ellos, como por ejemplo el ajuste de prioridades o
la eliminación de un proceso.

3. Proceso init

En un sistema con múltiples procesos ejecutándose al tiempo hay dos de ellos que tienen especial
distinción el proceso el proceso con PID = 0 y el proceso con PID = 1, siendo el primero parte del kernel
y conocido como swapper encargado de paginación y el segundo el proceso init creado al inicio del
sistema e imposible de eliminar solo al momento de apagar el sistema, siendo así el más importante de
todos ya que es de manera directa o indirecta responsable de todos los demás procesos en ejecución, sin
él no es posible que los demás procesos existan.
4. Fork

Para la creación de procesos Linux provee la función fork() la cual permite crear un nuevo proceso hijo
a partir de un proceso padre. Este nuevo proceso hijo es idéntico al proceso padre teniendo PID y PPID
diferentes, es decir contiene una copia de las variables, misma imagen de memoria, mismo bloque de
control de proceso y los mismos ficheros abiertos, aunque en diferentes espacios de memoria, de esta
manera al ser el proceso hijo una copia exacta pero independiente modificarlo no afecta al proceso
padre.
El llamado de la función fork devuelve distintos valores, en el hilo de ejecución del padre se devuelve
el PID del proceso hijo y en el hilo de ejecución del hijo se devuelve un 0. En caso de ocurrir un error
al momento del llamado de la función se devolverá un -1 en el contexto del padre y no se creará ningún
proceso.

Fig. 1 Muestra la utilización del llamado de la función fork() para el lenguaje C, donde el objetivo es
que el padre imprima por pantalla su PID y su hijo además de imprimir por pantalla su PID también
ejecute un sleep simulando la ejecución de otras funcionalidades, además tanto el proceso padre como
el proceso hijo imprimen por pantalla su valor para la variable a.

Fig. 1 Ejemplo llamado función fork

Fig. 2 Muestra el resultado de la ejecución del programa C

Fig. 2 Resultado ejecucion programa C


5. Proceso Hijo y Proceso Padre

Como se mencionó anteriormente todos los procesos en Linux tienen un identificador único
wait(NUL(PID) y un identificador padre (PPID), sin embargo el proceso init (PID = 1) al ser el padre
de todos los procesos ya sea de manera directa o indirecta posee PPID = 0 correspondiente al proceso
swapper, de esta manera un proceso puede ser poseedor de uno o más procesos hijos, además de esto
todo proceso posee un propietario el cual es el usuario que lo ha puesto en ejecución.

Los procesos padres pueden generar en cualquier momento de su ejecución múltiples procesos hijos
con el llamado a la función fork (véase inciso 1), siendo así responsable de la ejecución de cada uno de
ellos para su correcta finalización, adicionalmente el proceso padre hace un llamado a la función wait()
produciendo un bloqueo en este a la espera de la finalización de sus procesos hijos. Sin embargo en el
caso en que el que el proceso hijo finalice antes de que el proceso padre reciba esta llamada, el proceso
hijo se convierte en un proceso en estado zombie, es decir un proceso finalizado a la espera del wait en
su padre. Para evitar la acumulacion de estos procesos Linux posee un máximo de procesos zombies y
a los procesos que se destruyen después que su proceso padre al quedar en un estado “huérfano” será el
proceso init quien se encargará de recoger su estado de finalización.

Fig. 3 Muestra un fragmento de procesos actuales en un sistema linux ejecutando el programa de la


figura 1 y el comando ps -ef donde ./fork hace referencia al programa mencionado

Fig. 3 Fragmento de procesos actuales

Fig. 4 Muestra una modificación código Figura 1, donde se agrega un sleep al proceso padre
retrasando así el llamado a la función wait y ejecutando el comando ps -ef permite la visualización del
proceso en estado zombie(defunct).
Fig. 4 Modificación de código Figura 1 y visualización de procesos

6. Árbol de Procesos, comandos ps y pstree

Al inicio del sistema al ser el proceso init quien toma el control los demás procesos que necesitan ser
creados lo hacen a partir de este, formando así una dependencia a partir de init y a su vez un árbol de
procesos. Para visualizar esta dependencia en Linux podemos usar los comandos ps y pstree, donde con
el primero podemos visualizar los procesos activos en forma de lista y con el segundo podemos
visualizarlos en forma de árbol jerárquico. Es importante saber que estos comandos cuentan con una
serie de argumentos que al ser utilizado muestran más detalladamente información sobre los procesos.

Fig. 5 Muestra los comandos pstree y ps más la utilización de argumentos -aux.


Fig.5 comando ps y árbol de procesos con pstree

7. Naturaleza multitarea Kernel de Linux

La naturaleza multitarea del kernel de Linux es un concepto adoptado a partir de UNIX, refiriéndose
específicamente a multitarea preventivo donde el sistema operativo es el encargado de administrar los
procesos y el término preventivo enfatiza en la idea en la cual la computadora es muy capaz de ejecutar
múltiples tareas al tiempo. La principal ventaja de un sistema operativo con multitarea preventivo es la
capacidad de ejecutar múltiples tareas del sistema y un gran número de tareas del usuario sin notar una
ralentización en estas, siendo esto posible gracias al kernel donde al asignarle un tiempo de
procesamiento a los procesos y reemplazandolos cuando es debido a una frecuencia muy alta simulando
multitarea real.

7. Estado de procesos y grafos de transición

Los procesos en Linux cuentan con su propio ciclo de vida dividido por una serie de estados, donde
cada uno de ellos posee sus propias características, de esta manera permanece en constante cambio
durante toda su ejecución, llevando así a la construcción de un grafo de transición que representa cada
uno de los posibles estados que puede alcanzar un proceso, siendo estos los siguientes:

a) Ejecución(R): La ejecución del proceso se lleva a cabo por el procesador.


b) Listo: Se puede ejecutar el proceso, pero la ejecución de otro proceso está en curso.
c) Interrumpible(S): Estado de bloqueo donde el proceso espera por un evento.
d) No interrumpible(D): Estado de bloqueo donde el proceso espera una condición de hardware
e) Parado(T): El proceso se detuvo por una intervención externa, su reanudación se llevará a
cabo por una acción positiva de otro proceso.
f) Zombie(Z): El proceso ha terminado pero su estructura task aún se mantiene en la tabla de
proceso.

Fig.6 Grafo de transición para los estados de un proceso


8. Prioridad de Procesos

Cuando múltiples procesos se encuentran en ejecución cada uno de ellos está compitiendo por utilizar
los recursos del sistema, sin embargo existe la posibilidad de que alguno de ellos deba utilizar más
tiempo el procesador, de esta manera es necesario tener un control sobre el orden de ejecución de cada
uno de ellos. Linux realiza este control asignándole a cada proceso una prioridad (nice value), siendo
este un valor entre -20 a +19 donde entre menor sea su valor mayor será su prioridad y en el caso en el
que el usuario no le asigna una prioridad al proceso se le asignará a ésta el valor de 0.

9. Modificación de prioridades (nice y renice)

Para modificar al antojo las prioridades de los procesos es necesario ser usuario root, en caso contrario
solo se podrá modificar aquellos que se encuentren en el rango de prioridad 0 a 19. Lo mencionado
anteriormente es llevado a cabo mediante el uso de los comandos nice y renice, donde el primero es
usado para establecer la prioridad por el mismo usuario y el segundo es utilizado para modificar la
prioridad de un proceso que ya se encuentra en ejecución actualmente, siendo ambos muy útiles en
situaciones donde se deba ejecutar un proceso que hace operaciones aritméticas complejas y deba tener
mayor uso del sistema o en caso en que debamos ejecutar otro proceso con urgencia y la operación
aritmética no sea de mayor urgencia.

Fig.7 Muestra el uso del proceso nice para el programa .c de la Figura. 1 donde se le establece prioridad
más baja (19) y se visualiza esta con el comando ps -efl

Fig. 7 Uso de comando nice y visualización de procesos comando ps

Fig. 8 Muestra el proceso .c de la Figura. 1 donde se le inicia con prioridad baja (19), se le cambia
esta prioridad 15 y se visualiza con el comando ps -efl

Fig. 8 Uso de comando renice para un proceso en ejecución con PID = 10647
10. Control de recursos de un proceso: ulimit

La naturaleza multitarea de Linux en la cual un usuario puede ejecutar múltiples procesos existe la
posibilidad en que este agote todos los recursos del sistema dejándolo inutilizable para los demás cómo
podría ser el caso malintencionado de la replicación de un proceso hasta provocar un desbordamiento,
o bien es el caso en el cual procesos del sistema producen fallos al ejecutarse contra límites puestos a
usuarios comunes. Para manejar este problema es conveniente usar el comando ulimit, el cual permite
asignar correctamente los recursos del sistema permitiendo una correcta ejecución de los procesos.

Fig.7 Visualización de recursos limite para el usuario actual

11. Conclusión

Linux es un sistema operativo robusto multitarea que brinda total control sobre la ejecución de procesos,
permitiendo así llevar a cabo un seguimiento de cada uno de ellos para el correcto funcionamiento del
sistema gracias a la definición de procesos padres y procesos hijos lo cual hace uso de una variable
global encargada de la asignación de un un identificador único para cada uno de ellos y un identificador
para conocer de quienes dependen. De esta forma al tener múltiples procesos tratando de ejecutarse
entran en una competición para acceder a los recursos del sistema siendo necesaria la asignación de
prioridades permitiendo que procesos más indispensables sean ejecutados con mayor anterioridad,
además de mantener el control de los recursos del sistema evitando problemas de bloqueo. Todo esto
gracias a la utilización de los diferentes comandos proporcionados por el sistema operativo.

Referencias

1. Serrano Castaño, F. and Guim Bernat, F. (2019). [online] Openaccess.uoc.edu. Available at:
http://openaccess.uoc.edu/webapps/o2/bitstream/10609/8179/1/fserranocaTFC0611.pdf
[Accessed 11 Apr. 2019].
2. Henry-Stocker, S. (2012). Using the ulimit command on Linux systems. [online] Network
World. Available at: https://www.networkworld.com/article/2693414/setting-limits-with-
ulimit.html [Accessed 12 Apr. 2019].
3. Losteatinos.es. (2019). Gestión de procesos en Linux. [online] Available at:
https://losteatinos.es/files/ISO/Introduccion_a_la_gestion_de_procesos_en_Linux.pdf
[Accessed 10 Apr. 2019].
4. W3.ual.es. (2019). Tema 2. Gestión de procesos. [online] Available at:
https://w3.ual.es/~acorral/DSO/Tema_2.pdf [Accessed 12 Apr. 2019].
5. Ibiblio.org. (2019). The Digital Research Initiative. [online] Available at:
http://www.ibiblio.org/team/intro/unix/special.html [Accessed 10 Apr. 2019].
6. Marini, E. (2013). Gestión de Procesos en GNU/Linux. [online] Linuxito.com. Available at:
https://www.linuxito.com/docs/procesos-linuxito.pdf [Accessed 10 Apr. 2019].
7. Ibm.com. (2019). IBM Knowledge Center Error. [online] Available at:
https://www.ibm.com/support/knowledgecenter/es/SSYKE2_7.0.0/com.ibm.java.lnx.70.doc/u
ser/ulimits.html [Accessed 9 Apr. 2019].

También podría gustarte