2007 - Pablo Abrile1 Threads Lenguajes de Programación I.
-
Upload
carmen-moncayo -
Category
Documents
-
view
224 -
download
3
Transcript of 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.
2007 - Pablo Abrile 1
Threads
Lenguajes de Programación I
2007 - Pablo Abrile 2
Objetivos
Evolución de la Pila de Registros de Activación en Lenguajes tipo ALGOL con unidades concurrentes
Conceptos a recordar de prácticas previas Lenguajes Tipo ALGOL Pila de Registros de Activación
Conceptos a introducir Unidades concurrentes (en conjunto con los
conceptos previos)
2007 - Pablo Abrile 3
Lenguajes Tipo ALGOL
También llamados Orientados a Pila
Programa Ejecutable
Datos
La Frontera varía en cada instante de la ejecución
Heap
2007 - Pablo Abrile 4
Lenguajes Tipo ALGOL
Tienen bloques (fragmentos de programa) Sin nombre Con nombre (funciones)
Dentro de estos bloques pueden definirse variables a emplear
Al llamar a estos bloques, en la pila de ejecución se crean los registros de activación donde se almacenan las variables que se emplean
2007 - Pablo Abrile 5
Pila de Registros de Activación
Registro de ActivaciónConjunto de todos los elementos nuevos que
necesita un bloque para ejecutarse. Variables Dirección de retorno si llamo a una función
(cadena dinámica) Puntero al padre en el árbol de anidamiento
(cadena estática)
2007 - Pablo Abrile 6
Pila de Registros de Activación
A → B → B → C → D
Programa
RA de A
RA de B
RA de B
RA de C
RA de D
2007 - Pablo Abrile 7
Pila de Registros de ActivaciónUnidades Concurrentes
Programa
RA de A
RA de B
RA de B
RA de C
RA de D
Thread 1 Thread 2 …….. Thread nThread Ppal
Variables Globales – Descriptores de archivos – Mem. De Heap - etc.
2007 - Pablo Abrile 8
Ejercicio Ejemplo
Programa Ejecutable#include <pthread.h>#include <stdio.h>
Headers de la librería POSIX Threads
void *XX(void) {int i;printf("%x\n",&i);
}
Función XXSerá llamada desde-Thread creado con pthread_create- Thread Principal (main)
int main (){ pthread_t thread; pthread_create(&thread, NULL, XX, NULL); XX(); XX(); XX();
}
Thread Principal
Creación del Thread que llamará a XX
Invocaciones a XX desde el thread principal
2007 - Pablo Abrile 9
Salida Esperada
XX se llama 4 veces en total3 desde el main. En adelante Thread
Principal1 desde el thread creado con
pthread_create. En adelante Thread 1Se esperan: 4 impresiones por pantalla
¿Que ocurre con las direcciones de memoria que serán impresas?
2007 - Pablo Abrile 10
Pilas de Ejecución
1 para el Thread Principal (main) 1 para el Thread 1 (creado por
pthread_create)
2007 - Pablo Abrile 11
XX() (thread principal)
Programa
XX()
Thread 1Thread Principal
i
Dirección bfaba8d4
Primer Llamado a XX()
2007 - Pablo Abrile 12
Programa
Thread 1Thread Principal
Al terminar el primer llamado el registro de activación se quita de la pila
2007 - Pablo Abrile 13
XX() (thread principal)
Programa
XX()
Thread 1Thread Principal
i
Dirección bfaba8d4
Segundo Llamado a XX()
Se vuelve a apilar en la misma posición
2007 - Pablo Abrile 14
Programa
Thread 1Thread Principal
Al terminar el segundo llamado el registro de activación se quita de la pila
2007 - Pablo Abrile 15
XX() (thread principal)
Programa
XX()
Thread 1Thread Principal
i
Dirección bfaba8d4
Tercer Llamado a XX()
Se vuelve a apilar nuevamente en la misma posición
2007 - Pablo Abrile 16
XX() Thread 1
Programa
XX()
Thread 1Thread Principal
i
Dirección b7e1d3c4
Llamado a XX()Desde el thread creado con pthread_create (Thread 1)
2007 - Pablo Abrile 17
Salida Esperada
bfaba8d4 bfaba8d4 bfaba8d4 b7e1d3c4
El orden puede variar de acuerdo a cuando se ejecute el Thread 1
Puede hacerlo entre las llamadas a XX() desde el Thread Principal
2007 - Pablo Abrile 18
Salida Obtenida
2007 - Pablo Abrile 19
Orden de aparición alterno
Introducimos una demora en la función XX Entre los tres llamados del thread principal
a XX se alternará el llamado al thread creado con pthread_create
void *XX(void){int i;for (i=0; i<999999999; i++); //Demora antes de imprimir. printf("%x\n",&i);
}
2007 - Pablo Abrile 20
Salida
Debido a la demora, se alternan las salidas El resultado sigue siendo el mismo ya que
las pilas de ejecución son separadas para cada thread!!
Salida de Thread 1
Salida de main
2007 - Pablo Abrile 21
Ejercicio 2 2 threads
ThreadHola: Imprime HolaThreadMundo: Imprime Mundo
#include <pthread.h>#include <stdio.h>
void *mensaje(void* msj){printf("%s\n",msj);
}int main (){
pthread_t threadHola,threadMundo; pthread_create(&threadHola, NULL, mensaje, "Hola"); pthread_create(&threadMundo, NULL, mensaje, "Mundo");
}
El cuarto argumento de pthread_create es el argumento a pasar a mensaje cuando se crea el thread.En este caso, el mensaje a imprimir por el thread
2007 - Pablo Abrile 22
Resultado
En general, por el poco tiempo de procesamiento que lleva la función “mensaje” se verá la respuesta “Hola” “Mundo” (aunque puede no ser así).
Introducimos una demora en la función mensaje para ver si el orden de impresión puede variar
2007 - Pablo Abrile 23
void *mensaje(void* msj){int i;for (i=0; i<999999999; i++); //Demora introducidaprintf("%s\n",msj);
}
2007 - Pablo Abrile 24
Para probar los ejercicios
Comprobar que se tienen instaladas las librerías de POSIX threads.
Realizar un script “compilar” que contengagcc $1.c -o $1 –lpthread
./compilar 01_threadsCompila 01_threads.c
./01_threads
2007 - Pablo Abrile 25
Información de Interés
Fork(): Múltiples procesos vs. Threads
2007 - Pablo Abrile 26
Para mayor información
Material disponible en el sitio web de la cátedra http://www.exa.unicen.edu.ar/catedras/lengprg1/
2007 - Pablo Abrile 27
FIN