Uploaded by jhonnyzpedison

linux 2

advertisement
INSTITUTO TECNOLÓGICO SUPERIOR JUAN BAUTISTA AGUIRRE
ESTUDIANTE:
EDISON JOHNNY ZORRILLA PINCAY
CARRERA:
ENSAMBLAJE Y MANTENIMIENTO EN COMPUTO
CURSO:
SEGUNDO"A"
MATERIA:
SISTEMAS OPERATIVO LINUX
DOCENTE:
MARIA CLEMENCIA BALSECA
PERIODO:
2023-2024
1. Creación de procesos mediante fork
En Unix, un proceso es creado mediante la llamada al sistema fork(). El proceso que
realiza la llamada se denomina proceso padre (parent process) y el proceso creado a
partir de la llamada se denomina proceso hijo (child process). La sintaxis de la llamada,
efectuada desde el proceso padre, es: valor = fork()
La llamada fork() devuelve un valor distinto para los procesos padre e hijo: al proceso
padre se le devuelve el PID del proceso hijo, mientras que al proceso hijo se le devuelve
“0”. Las acciones que implican ejecutar un fork() son llevadas a cabo por el núcleo
(kernel) del sistema operativo Unix. Dichas acciones son las siguientes:
1. Asignación de un hueco en la tabla de procesos para el nuevo proceso (hijo).
2. . Asignación de un identificador único (PID) al proceso hijo.
3. . Copia de la imagen del proceso padre al proceso hijo (con excepción de la
memoria compartida).
4. Asignación al proceso hijo del estado “preparado para ejecución”.
5. Devolución de los dos valores de retorno de la función: al proceso padre se le
entrega el PID del proceso hijo, y al proceso hijo se le entrega “0”.
El siguiente código, ubicado en el fichero “forkprog1.c”, muestra el uso de la
llamada a sistema fork():
Compila el programa anterior usando “gcc”.
$ gcc -Wall -o forkprog1 forkprog1.c
Ejecuta el programa “forkprog1” en segundo plano (o background). Para ello debes
añadir al nombre del programa el carácter “&” (ampersand).
$ ./forkprog1 &
Verifica que se está ejecutando a través del comando “ps” (tal y cómo se explicó en
la práctica anterior). Dicha orden ha de ser ejecutada antes de que finalice la
ejecución del proceso.
$ ps –l
EXEC
Nuevos procesos, exec() sustituye la imagen en memoria del proceso por otra nueva
(es decir, que sustituye todos los elementos del proceso: código del programa,
datos, pila y heap). El PID del proceso es el mismo que antes de realizar la llamada
exec(), pero ahora ejecuta otro programa. El proceso pasa a ejecutar el nuevo
programa desde el inicio y la imagen en memoria del antiguo programa se pierde al
verse sobrescrita. La imagen en memoria del antiguo programa se pierde para
siempre, es decir, todo el código que escribamos posteriormente a la ejecución con
éxito de la llamada exec() será inalcanzable. La combinación de las llamadas fork()
y exec() es el mecanismo que ofrece Unix para la creación de un nuevo proceso
(fork()) que ejecute un programa determinado (exec()). De las seis posibles
llamadas tipo exec() usaremos para este apartado de la práctica la llamada
“execv()”, cuya sintaxis es:
int execv(const char *filename, char *const argv[ ]);
Podemos seguir la ejecución del proceso gracias a la orden “ps”, usándola justo
antes y justo después de la llamada “execv()”, comprobando así cómo se efectúa la
sustitución de la imagen de memoria. El nuevo programa activado mantiene el
mismo PID, así como otras propiedades asociadas al proceso. Sin embargo, el
tamaño en memoria de la imagen del proceso cambia, dado que el programa en
ejecución es diferente. En este apartado se va a practicar con dos programas
(“execprog1” y “execprog2”), cuyos ficheros fuente (“execprog1.c” y
“execprog2.c”) se muestran a continuación.
execprog1.c
execprog2.c:
Compila los programas “execprog1.c” y “execprog2.c” usando “gcc”.
$ gcc -Wall -o execprog1 execprog1.c
$ gcc -Wall -o execprog2 execprog2.c
Ejecuta en background (añadiendo “&”) el programa “execprog1”, para poder verificar
su ejecución usando la orden “ps”. La forma de invocar el programa “execprog1” es la
siguiente:
$ ./execprog1 arg1 arg2 ... argN &
$ ps –l
Para observar cuánta memoria ocupa cada programa, realiza un “ps -l” una vez el
proceso haya escrito por pantalla el mensaje correspondiente (hay 10 segundos de plazo
antes de realizar el “execv()” en “execprog1” y otros 10 antes de que “execprog2”
termine).
Download