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).