0% encontró este documento útil (0 votos)
191 vistas4 páginas

Concurrencia y Fork en Linux

Este documento describe la concurrencia entre procesos mediante la función fork en sistemas operativos Linux. Explica cómo fork crea un nuevo proceso hijo idéntico al proceso padre y cómo ambos continúan su ejecución de forma independiente. Incluye ejemplos de cómo un padre crea varios hijos y cómo crear una estructura lineal de procesos usando fork, wait y exit. Finalmente, propone dos ejercicios sobre la creación de árboles de procesos binarios y de procesos impares.

Cargado por

rdelgado28
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Temas abordados

  • ejecución de procesos,
  • programación concurrente,
  • comunicación entre procesos,
  • número impar,
  • procesos,
  • código de error,
  • pid_t,
  • proceso hijo,
  • fork,
  • estructura jerárquica
0% encontró este documento útil (0 votos)
191 vistas4 páginas

Concurrencia y Fork en Linux

Este documento describe la concurrencia entre procesos mediante la función fork en sistemas operativos Linux. Explica cómo fork crea un nuevo proceso hijo idéntico al proceso padre y cómo ambos continúan su ejecución de forma independiente. Incluye ejemplos de cómo un padre crea varios hijos y cómo crear una estructura lineal de procesos usando fork, wait y exit. Finalmente, propone dos ejercicios sobre la creación de árboles de procesos binarios y de procesos impares.

Cargado por

rdelgado28
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Temas abordados

  • ejecución de procesos,
  • programación concurrente,
  • comunicación entre procesos,
  • número impar,
  • procesos,
  • código de error,
  • pid_t,
  • proceso hijo,
  • fork,
  • estructura jerárquica

Sistemas Operativos Practica 1: concurrencia entre procesos.

Objetivos:
Comprender el concepto de concurrencia. Aplicar el concepto de concurrencia haciendo uso de la funcin fork.

Introduccin
Un programa ordinario consiste en declaraciones de datos e instrucciones en un determinado lenguaje de programacin, y las instrucciones son ejecutadas de manera secuencial en una computadora. Un programa concurrente es un conjunto de programas secuenciales los cuales son ejecutados en paralelismo real o bien abstracto (por ejemplo en un sistema multiproceso con un slo procesador).En esta prctica estudiaremos el concepto de concurrencia haciendo uso de la funcin fork. Primero veremos como trabaja dicha funcin, posteriormente mostraremos algunos ejemplos usando fork y finalmente terminamos con un par de ejercicios.

Creacin de procesos con fork


Los procesos de un sistema Linux (y en general en un sistema basado en Unix), tienen una estructura jerrquica, de manera que un proceso (proceso padre) puede crear un nuevo proceso (proceso hijo) y as sucesivamente. Para el desarrollo de aplicaciones con varios procesos, el sistema operativo Linux proporciona la funcin fork. Llamar a la funcin fork requiere del archivo de cabecera unistd.h, el cual tiene la declarado la funcin como sigue: int fork(void). La funcin fork crea un nuevo proceso exactamente igual al proceso que invoca la funcin. Ambos procesos continan su ejecucin tras la llamada a fork. En caso de error, la funcin devuelve el valor 1 y no se crea el proceso hijo; si no hubo ningn error, el proceso que realizo la llamada (proceso padre), obtiene el pid (process ID, identificador de proceso) del proceso hijo que acaba de nacer, y el proceso hijo recibe el valor 0. Tanto el proceso padre como el proceso hijo continan su ejecucin en la lnea siguiente despus del llamado fork, ver siguiente programa de ejemplo:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main () { int iId; iId = fork (); /*A partir de la siguiente lnea, padre e hijo inician su ejecucin*/ switch (iId) { case 0: printf ("Soy el hijo.\n"); break; case -1: printf ("Hay un error.\n"); break;

default: printf ("Soy el padre.\n"); break; } return (0); }

Como se menciono, tanto padre como hijo son exactamente iguales, tienen el mismo contenido en las variables, pero no las comparten; es decir, una vez creados, siguen su ejecucin de manera independiente, lo que los hace diferentes es su identificador. Debido al parentesco que adquieren el par de procesos cuando uno crea al otro, estos se pueden comunicarse solo una vez haciendo uso de las funciones wait y exit, que se incluyen en el archivo de cabecera stdlib.h, y que estn definidas como: void exit(int status); pid_t wait(int *status);

exit termina al proceso que la manda a invocar. El valor de estado se le regresa al proceso padre para que este pueda conocer como termino su proceso hijo. wait obtiene el estado con el que termina uno de sus procesos hijo. Cuando un proceso ejecuta wait y ninguno de sus procesos hijos ha terminado, este se queda bloqueado. El valor que regresa esta funcin es el pid del proceso hijo que termino. La funcin wait almacena la informacin de estado con el que termino un proceso hijo en la memoria apuntada por status. Esta informacin puede ser evaluada usando las siguientes macros: WIFEXITED (status) es distinto de cero si el hijo termino normalmente. WEXITSTATUS (status) evala los ocho bits menos significativos del cdigo de retorno del hijo que termino, que podran estar activados como el argumento de una llamada a exit o como el argumento de un return en el programa principal.

Ejemplos con fork


Un padre crea varios hijos:
/*Creacin de varios hijos por parte de un padre*/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #define N 4 int main() { int i; pid_t pid; for(i=0;i<N;i++) { switch(pid=fork()) { case 0: printf("Soy el proceso hijo: %d y mi padre es %d \n", getpid(), getppid()); break;

case -1: printf("Error en la creacin del proceso \n"); exit(0); default: printf("Soy el proceso padre: %d \n",getpid()); } if(pid==0) break; } sleep(10); return (0); } /*El hijo no hace nada*/

Una estructura lineal de procesos:


/*Estructura lineal de procesos*/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #define N 4 int main() { int i,status=0; pid_t pid,pid_raiz; pid_raiz=getpid(); for(i=0;i<N;i++) { if((pid=fork())==0) { printf("Soy el proceso hijo: %d y mi padre \n",getpid(),getppid()); } else { if(pid==-1) { printf("Error en la creacin del proceso \n"); exit(1); } else { printf("Soy el proceso padre: %d \n",getpid()); wait(&status); if(pid_raiz==getpid()) { printf("El numero de procesos que somos \n",WEXITSTATUS(status)+1); exit(0); } else exit(WEXITSTATUS(status)+1); } } } sleep(3); exit(1); }

es

%d

es:

%d

Ejercicios
Crear un rbol binario de procesos. El primero proceso, al que llamaremos nodo raz, deber pedir al usuario la profundidad del rbol y crear un rbol de procesos con dicha profundidad; una vez creado el rbol, cada uno de los procesos, salvo las hojas, debern retornar a su respectivo padre el nmero de hijos que posee, al final el proceso raz deber imprimir el nmero de procesos que se crearon en dicho rbol. Crear un rbol de procesos impares. En nodo raz deber pedir al usuario un nmero impar mayor o igual a 3, y a partir de ese nmero, crear una estructura como la que se muestra en la siguiente figura. Al final, el proceso raz deber imprimir el nmero de procesos creados en el rbol.

Figura 1. Note que el primer proceso crea del lado izquierdo el nmero de procesos que le indico el usuario (sea 2K-1 ese nmero), y del lado derecho un proceso extra que deber crear ahora 2K-1-2 del lado izquierdo, y un proceso ms del lado derecho que ahora deber crear 2K-1-4 y as sucesivamente.

También podría gustarte