Apuntes concurrencia

  • View
    226

  • Download
    0

Embed Size (px)

DESCRIPTION

Concurrencia

Text of Apuntes concurrencia

  • Programacin de Sistemas y Concurrencia

    Grado en Ingeniera Informtica

    Grado en Ingeniera del Software

    Grado en Ingeniera de Computadores

    Tema 3: La Programacin Concurrente

    como Abstraccin

  • Contenido

    De la programacin secuencial a la programacin concurrente

    Beneficios y usos de la programacin concurrente

    Problemas de la programacin concurrente:

    Instrucciones atmicas

    Seccin crtica

    Exclusin mutua

    Plataformas para la ejecucin concurrente

    2

  • Programacin secuencial

    Los lenguajes de programacin secuenciales explotan explcitamente las caractersticas de la mquina que los ejecuta

    En cada ciclo del reloj Se trae una instruccin de la memoria

    Se decodifica y se envan seales a las componentes del sistema para que se ejecute

    CPU

    RAM

    input output

    Mquina Von-Neumann {

    x =

    y =

    if (x < y) z = x;

    else z = y;

    }

    {

    x = 0;

    y = 0;

    }

    3

  • Ejemplo

    Si P = p1;p2;;pn es un programa secuencial p1 siempre preceder a p2 (cualquiera que sea la ejecucin), P2 siempre preceder a p3 . pn-1 siempre preceder a pn

    Si el smbolo significa precede a y e significa para toda ejecucin, el comportamiento puede formalizarse como e.(p1 p2) (p2 p3) (pn-1 pn)

    Este comportamiento se mantiene incluso si el cdigo P tiene instrucciones de seleccin y bucles.

    if (b) {A;} else {B;}

    e.(b A) (b B) (depende de los datos de entrada)

    4

  • Ejemplo

    while (b) {A}

    e.b (b B b) (b B b B b)

    (el nmero de iteraciones depende de los datos de entrada)

    Dado P = p1;p2;;pn Si 0

  • Programacin concurrente

    No todas las instrucciones de un programa tienen que ejecutarse de forma secuencial

    {

    x = 0;

    y = 0;

    z = 0;

    }

    El lenguaje nos obliga a establecer un orden de ejecucin

    6

  • Programacin concurrente

    No todas las instrucciones de un programa tienen que ejecutarse de forma secuencial

    Este cdigo podra ejecutarse de 6 formas distintas y todas ellas correctas

    {

    x = 0;

    y = 0;

    z = 0;

    }

    {

    x = 0;

    z = 0;

    y = 0;

    }

    {

    y = 0;

    x = 0;

    z = 0;

    }

    ..

    7

  • Programacin concurrente No todas las instrucciones de un programa tienen que ejecutarse

    de forma secuencial

    Este cdigo podra ejecutarse de 6 formas distintas y todas ellas correctas

    Supongamos que definimos un nuevo operador || para representar este comportamiento

    x = 0 || y = 0 || z = 0 = {x = 0 y = 0 z = 0,

    x = 0 z = 0 y = 0,

    y = 0 x = 0 z = 0,

    }

    8

  • Programacin concurrente Supongamos que definimos un nuevo operador || para

    representar este comportamiento

    Y si tuviramos 3 procesadores?

    Podramos asignar cada cdigo a un procesador, obteniendo un comportamiento correcto y una ejecucin posiblemente ms rpida.

    Extendemos el significado de P || Q para indicar que existe una ejecucin vlida de P y Q, en la que ambos cdigos se solapan en el tiempo

    e. (P Q) (Q P)

    9

  • Programacin Concurrente

    Cmo razonamos sobre la ejecucin de P || Q? Podramos exigir la existencia de dos procesadores para que

    exista un solapamiento de instrucciones real No es buena idea porque entonces el cdigo de nuestro programa

    dependera de la arquitectura subyacente

    En su lugar, suponemos que existen un par de procesadores lgicos cada uno ejecutando uno de los cdigos.

    Un procesador lgico puede coincidir con uno real, pero qu hacemos si no hay suficientes procesadores?

    Supongamos que P = p1 p2 pn y que Q = q1 q2 qm

    Cmo puede ser la ejecucin P || Q si slo hay un procesador?

    10

  • Interleaving

    Supongamos n = 2 y m = 3: P = p1 p2 y Q = q1 q2 q3

    p1 q1

    q1 p2 p1 q2

    p2 q2 q1

    q2

    q3

    q2

    q3

    p2 q3

    q3 p2

    q2 p2

    q2

    q3

    p2 q3

    q3 p2

    q3

    p1

    p1

    p2

    p2 q3

    q3 p2

    P || Q genera un rbol de ejecucin

    Cada camino en el rbol representa una posible ejecucin correcta de P ||Q

    En este caso hay 10 posibles ejecuciones (sobre un procesador)

    11

  • Interleaving

    Supongamos n = 2 y m = 3: P = p1 p2 y Q = q1 q2 q3

    p1 q1

    q1 p2 p1 q2

    p2 q2 q1

    q2

    q3

    q2

    q3

    p2 q3

    q3 p2

    q2 p2

    q2

    q3

    p2 q3

    q3 p2

    q3

    p1

    p1

    p2

    p2 q3

    q3 p2

    P || Q genera un rbol de ejecucin

    Cada camino en el rbol representa una posible ejecucin correcta de P ||Q

    La ejecucin secuencial P; Q es una de entre todas las posibles

    12

  • Orden Parcial

    Una ejecucin correcta de P || Q (P = p1 p2 pn ,Q = q1 q2 qm ) se obtiene intercalando las instrucciones de P y Q, pero no de cualquier forma

    El orden relativo de las instrucciones en P y Q debe mantenerse, Dados dos ndices i, j,

    si i < j entonces e. (pi pj) (qi qj) si i < j entonces e. (pi qj) (qj pi)

    El orden en P y Q se conserva

    Pero no hay orden establecido entre las instrucciones de P y las de Q

    13

  • Orden Parcial

    Una ejecucin correcta de P || Q (P = p1 p2 pn ,Q = q1 q2 qm ) se obtiene intercalando las instrucciones de P y Q, pero no de cualquier forma

    El orden relativo de las instrucciones en P y Q debe mantenerse, Dados dos ndices i, j,

    si i < j entonces e. (pi pj) (qi qj) si i < j entonces e. (pi qj) (qj pi)

    14

    En cada momento, puede haber varias instrucciones posibles a ser ejecutadas, por lo que la ejecucin paralela es, por definicin, INDETERMINISTA

    Las instrucciones de P||Q estn parcialmente ordenadas

  • Programacin Concurrente

    Cmo razonamos sobre la ejecucin de P || Q? Podramos imponer que necesariamente tengamos dos procesadores para

    que exista un solapamiento de instrucciones real No es buena idea porque entonces el cdigo de nuestro programa dependera de

    la arquitectura subyacente

    Suponemos que existen un par de procesadores lgicos cada uno ejecutando uno de los cdigos. Un procesador lgico puede coincidir con uno real, pero

    qu hacemos si no hay suficientes procesadores? Intercalamos las instrucciones de P y Q en el procesador

    (semntica del interleaving)

    Es como si los procesadores lgicos que ejecutan P y Q evolucionaran a velocidades distintas

    Por lo tanto, No podemos hacer suposiciones sobre la velocidad relativa entre procesadores

    lgicos No podemos hacer suposiciones sobre la velocidad real de ejecucin de los

    cdigos sobre los procesadores

    15

  • Programacin Concurrente

    Resumiendo,

    P || Q representa la ejecucin concurrente de P y Q.

    P y Q se llaman procesos/hebras porque se ejecutan concurrentemente con otros procesos

    Sin embargo, los cdigo de P y Q se ejecutan secuencialmente

    Si P = p1 p2 pn y Q = q1 q2 qm, el nmero total de posibles ejecuciones de P||Q sin tener en cuenta posibles solapamientos de instrucciones es

    (m+n)!/m!*n!

    Cada posible ejecucin se denomina traza (es un camino en el rbol)

    Para que un programa P||Q sea correcto deben serlo todas sus trazas de ejecucin

    16

  • Motivacin

    Mejorar el rendimiento de los procesadores

    Explotar las arquitecturas multiprocesadores

    Simplificar el modelado de sistemas que son concurrentes de forma natural

    Obtener ganancias en tiempo.

    Ejemplo ordenacin por intercambio

    i 8 5 0 3 7 4 2 9 1 3

    j

    5 8 0 3 7 4 2 9 1 3

    i j

    0 8 6 3 7 4 2 9 1 3

    i j

    17

  • Ejemplo

    public class Ordenar{

    public static int insercion(int[] vector, int inicio,int fin){

    int numOperBasicas = 0;

    for (int i = inicio; i vector[j]){

    numOperBasicas++;

    int aux = vector[i];

    vector[i] = vector[j];

    vector[j] = aux;

    }

    }

    }

    return numOperBasicas; }

    18

  • Ejemplo

    public static void main(String[] args){

    int[] vector = new int[2000];

    Random r = new Random();

    for (int i = 0; i

  • Ejemplo public static void main(String[] args){

    int[] vector = new int[2000];

    Random r = new Random();

    for (int i = 0; i

  • Ejemplo class HebraO extends Thread{

    int[] vector;

    int inicio,fin;

    public OrdenConc(int[] vector,int i,int j){

    this.vector = vector;

    inicio = i;

    fin = j;

    }

    public void run() {

    Ordenar.insercion(vector, inicio, fin);

    }

    }

    HebraO o1 = new OrdenConc(vector,0,vector.length/ 2);

    HebraO o2 = new OrdenConc(vector, vector.length/ 2,vector.length);

    o1.start();

    o2.start();

    //espero que terminen

    Ordenar.mezclar(vector,0, vector.len