Procesos & colas de mensajes

Solo disponible en BuenasTareas
  • Páginas : 10 (2334 palabras )
  • Descarga(s) : 0
  • Publicado : 31 de octubre de 2011
Leer documento completo
Vista previa del texto
Titulo: Procesos Concurrentes & Colas de Mensajes Asignatura: Sistema de Operaciones Preparador: Tecnólogo Jacobo Alonso

Procesos concurrentes: llamadas fork y wait
Para crear nuevos procesos, el UNIX dispone únicamente de una llamada al sistema, fork, sin ningún tipo de parámetros. Su prototipo es int fork(); Al llamar a esta función se crea un nuevo proceso (proceso hijo), idéntico encódigo y datos al proceso que ha realizado la llamada (proceso padre). Los espacios de memoria del padre y el hijo son disjuntos, por lo que el proceso hijo es una copia idéntica del padre que a partir de ese momento sigue su vida separada, sin afectar a la memoria del padre; y viceversa. Siendo más concretos, las variables del proceso padre son inicialmente las mismas que las del hijo. Pero sicualquiera de los dos procesos altera una variable, el cambio sólo repercute en su copia local. Padre e hijo no comparten memoria. El punto del programa donde el proceso hijo comienza su ejecución es justo en el retorno de la función fork, al igual que ocurre con el padre. Si el proceso hijo fuera un mero clon del padre, ambos ejecutarían las mismas instrucciones, lo que en la mayoría de los casos notiene mucha utilidad. El UNIX permite distinguir si se es el proceso padre o el hijo por medio del valor de retorno de fork. Esta función devuelve un cero al proceso hijo, y el identificador de proceso (PID) del hijo al proceso padre. Como se garantiza que el PID siempre es no nulo, basta aplicar un if para determinar quién es el padre y quién el hijo para así ejecutar distinto código.

Titulo:Procesos Concurrentes & Colas de Mensajes Asignatura: Sistema de Operaciones Preparador: Tecnólogo Jacobo Alonso

Con un pequeño ejemplo: main() { int x=1; if ( fork()==0 ) { printf ("Soy el hijo, x=%d\n",x); } else { x=33; printf ("Soy el padre, x=%d\n",x); } }

Este programa mostrará por la salida estándar las cadenas "Soy el hijo, x=1" y "Soy el padre, x=33", en un orden que dependerá delcompilador y del planificador de procesos de la máquina donde se ejecute. Como aplicación de fork a la ejecución de programas, véase este otro pequeño ejemplo, que además nos introducirá en nuevas herramientas:

Titulo: Procesos Concurrentes & Colas de Mensajes Asignatura: Sistema de Operaciones Preparador: Tecnólogo Jacobo Alonso

1 2 3 4 4b 5 6 7 8 9 10 11

if ( fork()==0 ) { execlp("ls","ls","-l","/usr/include",0); printf ("Si ves esto, no se pudo ejecutar el \ programa\n"); exit(1); } else { int tonta; wait(&tonta); }

Este fragmento de código lanza a ejecución la orden ls -l /usr/include, y espera por su terminación. En la línea 1 se verifica si se es padre o hijo. Generalmente es el hijo el que toma la iniciativa de lanzar un fichero a ejecución, y en las líneas 2 a la 6 seinvoca a un programa con execlp. La línea 4 sólo se ejecutará si la llamada execlp no se ha podido cumplir. La llamada a exit garantiza que el hijo no se dedicará a hacer más tareas. Las líneas de la 8 a la 11 forman el código que ejecutará el proceso padre, mientras el hijo anda a ejecutar sus cosas. Aparece una nueva llamada el sistema, la función wait. Esta función bloquea al proceso llamadorhasta que alguno de sus hijos termina. Para nuestro ejemplo, dejará al padre bloqueado hasta que se ejecute el programa lanzado o se ejecute la línea 5, terminando en ambos casos el discurrir de su único hijo. Es decir, la función wait es un mecanismo de sincronización entre un proceso padre y sus hijos. La llamada wait recibe como parámetro un puntero a entero donde se deposita el valor devuelto porel proceso hijo al terminar; y retorna el PID del hijo. El PID del hijo es una información que puede ser útil cuando se han lanzado varios procesos hijos y se

Titulo: Procesos Concurrentes & Colas de Mensajes Asignatura: Sistema de Operaciones Preparador: Tecnólogo Jacobo Alonso

desea discriminar quién exactamente ha terminado. En nustro ejemplo no hace falta este valor, porque sólo hay...
tracking img