PRÁCTICA
Procesos UNIX
1
Creación de procesos
Los S.O. como el UNIX son sistemas multitareas que
tienen la capacidad de crear varios “procesos”.
Un proceso es un programa en ejecución con su propio
“espacio de direcciones” virtual independiente (sus
propias variables) que es administado por el S.O.
El S.O. decide cuando el proceso se ejecuta (toma el control del
CPU) y cuando deja de hacerlo.
Los procesos pueden comunicarse entre ellos (se verá
más adelante).
2
Creación de procesos
Hay aplicaciones que se diseñan como múltiples
procesos concurrentes, que pueden comunicarse o no
entre sí.
En la Informática Industrial es una forma adecuada de
representar el hecho de que se trata con el “mundo
real” en que las cosas suceden de forma simultánea y
asíncrona.
Los Sistemas de Tiempo Real planifican la ejecución
de los procesos (que lidian con eventos del mundo real)
de modo que se cumplan las restricciones temporales
establecidas.
3
Creación de procesos
Un proceso se crea mediante una llamada al sistema. Cada proceso se
identifica con un número (pid)
El proceso creador se denomina padre, y el creado, hijo. Los hijos
pueden a su vez crear otros procesos, formando un árbol de procesos
Ejecución:
Padre e hijos se ejecutan concurrentemente.
El padre espera a que algunos de los hijos o todos terminen.
Espacio de direcciones:
El proceso hijo es un duplicado del proceso padre.
El proceso padre y el hijo comparten código pero no el contenido de
las variables.
Se carga un programa en el proceso hijo.
4
Creación de procesos en UNIX
La llamada al sistema fork crea un nuevo proceso
El proceso 0 es el único que no se crea con fork. Se
crea al arrancar el sistema y al hacer un fork se
convierte en el proceso intercambiador. El proceso
hijo se llama init y su PID vale 1. Todos los procesos
son hijos de este.
5
Creación de procesos en UNIX
Una secuencia de código típica para manejar la llamada fork:
int pid;
....
pid = fork() ;
if (pid == 0)
/* codigo que va a ejecutar el proceso hijo */
else
/* codigo que va a ejecutar el proceso padre */
6
Creación de procesos en UNIX
Después del fork uno de los dos procesos puede utilizar la
llamada al sistema exec para reemplazar su espacio de
memoria por un nuevo programa. La familia de funciones exec
permite cargar un programa en la zona de memoria del proceso
que ejecuta la llamada. El contexto a nivel de usuario es
sustituido con el nuevo programa. El programa viejo es
sustituido por el nuevo y nunca retornaremos a él para proseguir
su ejecución.
Este es el mecanismo que utiliza el intérprete de comandos
(Shell) para ejecutar los programas que el usuario le indique.
7
Creación de procesos en UNIX:Shell
proceso shell proceso padre proceso shell
fork wait
proceso zombi
proceso hijo
exec
exit
programa
se ejecuta programa
8
Terminación de procesos
Un proceso termina cuando finaliza la ejecución
de su último enunciado y le pide al sistema
operativo que lo elimine invocando una llamada
al sistema específica (ej:exit).
También si se genera una excepción y el S.O.
decide abortarlo
Podría existir una llamada al sistema para
abortar otro proceso
9
Terminación de procesos en UNIX
El proceso padre puede esperar a que termine el hijo antes de
continuar su ejecución (p.e. intérpretes de órdenes).
Para poder sincronizar los procesos padre e hijo se emplean las
llamadas exit y wait.
exit:
descarga el proceso de memoria, cerrando ficheros abiertos
si el padre ha ejecutado wait se le comunica el estado
si el padre no ha ejecutado wait el hijo pasa a zombi (se
descarga de memo y solo ocupa una entrada en la tabla de
proc.)
wait suspende la ejecución del proceso que la invoca hasta que
alguno de los hijos termina.
10
11
Compilar programas con gcc:
[Link] fork.c
Compila el programa: ejecutable por defecto en [Link].
[Link] fork.c –o [Link]
Compila y nombra el ejecutable como [Link].
12
13
14
Modificar programa de manera que entre
el padre y el hijo impriman los
números enteros del 0 al 20:
•El padre imprimirá los pares
•El hijo imprimirá los impares.
15
Comandos de UNIX de interés
ps (lista los procesos)
ps –fe (listas todos los procesos
del sistema)
grep (se utiliza para hacer
búsquedas de determinados patrones en
el texto)
Usando filtros:
ps –fe|grep usuario (lista los procesos
del usuario
dado)
kill pid (manda señales al proceso
pid, es especial la señal
de terminación) 16