2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

27
2007 - Pablo Abrile 1 Threads Lenguajes de Programación I

Transcript of 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

Page 1: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 1

Threads

Lenguajes de Programación I

Page 2: 2007 - Pablo Abrile1 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)

Page 3: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 4: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 5: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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)

Page 6: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 7: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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.

Page 8: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 9: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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?

Page 10: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 10

Pilas de Ejecución

1 para el Thread Principal (main) 1 para el Thread 1 (creado por

pthread_create)

Page 11: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 11

XX() (thread principal)

Programa

XX()

Thread 1Thread Principal

i

Dirección bfaba8d4

Primer Llamado a XX()

Page 12: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 12

Programa

Thread 1Thread Principal

Al terminar el primer llamado el registro de activación se quita de la pila

Page 13: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 14: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 14

Programa

Thread 1Thread Principal

Al terminar el segundo llamado el registro de activación se quita de la pila

Page 15: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 16: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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)

Page 17: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 18: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 18

Salida Obtenida

Page 19: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

}

Page 20: 2007 - Pablo Abrile1 Threads Lenguajes de Programació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

Page 21: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 22: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 23: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 23

void *mensaje(void* msj){int i;for (i=0; i<999999999; i++); //Demora introducidaprintf("%s\n",msj);

}

Page 24: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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

Page 25: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 25

Información de Interés

Fork(): Múltiples procesos vs. Threads

Page 26: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

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/

Page 27: 2007 - Pablo Abrile1 Threads Lenguajes de Programación I.

2007 - Pablo Abrile 27

FIN