37
Programación de Sistemas y Concurrencia Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Tema 3: La Programación Concurrente como Abstracción

Apuntes concurrencia

  • Upload
    orial

  • View
    243

  • Download
    0

Embed Size (px)

DESCRIPTION

Concurrencia

Citation preview

  • 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.length/ 2,vector.length)

    21

  • Ejemplo

    Estudio de las complejidades

    Si n es el nmero de elementos del vector a ordenar

    22

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

    } }

  • Ejemplo

    Si n es el nmero de elementos del vector a ordenar

    Caso secuencial: T(n) n2/2

    Caso secuencial con dos llamadas: T(n) n2/4 + n

    Caso paralelo T(n) n2/8 + n

    n2/2 n2/4+n n2/8+n

    20 100 120 60

    40 800 440 240

    1000 500000 251000 126000

    T(n) n

    23

  • Comunicacin y Sincronizacin

    La comunicacin puede realizarse a travs de la memoria compartida

    O a travs de algn mecanismo de paso de mensajes

    emisor{

    . x = m

    }

    receptor{

    local y

    .

    y = x

    }

    Global x

    Los procesos en un programa concurrente habitualmente se comunican y sincronizan sus acciones.

    emisor{

    .

    send m to receptor

    .

    }

    receptor{

    local y

    .

    receive y from emisor

    .

    }

    24

  • Comunicacin y Sincronizacin

    La comunicacin puede realizarse a travs de la memoria compartida

    emisor{

    . x = m

    }

    receptor{

    local y

    .

    y = x

    }

    Global x

    Los procesos en un programa concurrente habitualmente se comunican y sincronizan sus acciones.

    25

    El receptor no puede leer su mensaje hasta que el emisor no lo haya enviado

    Esto es un ejemplo de una condicin de sincronizacin

  • Problemas de la programacin concurrente

    Instrucciones atmicas Seccin crtica

    Exclusin mutua

    Ejemplo: Mquinas vendedoras de entradas

    Pueden comprarse entradas desde distintas taquillas

    26

  • Problemas de la programacin concurrente

    Cada Taquilla es una proceso Ti

    Todas las taquillas se ejecutan concurrentemente

    Todas las taquillas ejecutan el mismo cdigo

    Suponemos que hay un array de booleanos que representa los asientos del teatro

    T1 || T2 || || Tn

    Cdigo de Tn

    while (true){

    mostrar butacas libres al usuario

    a = //asiento seleccionado

    asientos[a] = true

    emitir la entrada

    }

    .

    boolean asientos[]

    27

    Cdigo de T1

    while (true){

    mostrar butacas libres al usuario

    a = //asiento seleccionado

    asientos[a] = true

    emitir la entrada

    }

  • Ejemplo: Mquinas vendedoras de

    entradas

    Esta solucin es incorrecta. Es posible que dos personas distintas compren el mismo asiento

    Ti: mostrar butacas libres al usuario

    Tj: mostrar butacas libres al usuario

    Ti: a = ; //asiento seleccionado en la taquilla i, por ejemplo a = 22

    Tj: a = ; //asiento seleccionado en la taquilla j, por ejemplo a = 22

    Ti: asientos[22] = true

    Tj: asientos[22] = true

    Ti: emitir la entrada

    Tj: emitir la entrada

    El asiento 22 se ha vendido a dos clientes distintos

    Esto es una traza de ejecucin, un posible camino en el rbol, que muestra un error. Sirve para demostrar que un programa es incorrecto

    28

    Cdigo de cada taquilla

    while (true){

    mostrar butacas libres al usuario

    a = //asiento seleccionado

    asientos[a] = true

    emitir la entrada

    }

  • Ejemplo: Mquinas vendedoras de entradas

    Aadimos este cdigo para asegurarnos de que cuando se selecciona una butaca est realmente libre

    Refinamos el cdigo Cdigo de Ti

    while (true){

    exito = false;

    while (!exito){

    mostrar butacas libres al usuario

    a=; //asiento seleccionado

    if (! asientos[a]) {

    asientos[a] = true ;

    emitir la entrada

    exito = true;

    } else {

    dar un mensaje de error

    }

    }

    }

    29

  • Ejemplo: Mquinas vendedoras de entradas

    TRAZA de ejecucin que muestra el error

    Ti: chequea asiento[22] y lo encuentra libre

    Tj: chequea asiento[22] y lo encuentra libre

    Ti: asientos[22] = true

    Tj: asientos[22] = true

    Ti: emitir la entrada

    Tj: emitir la entrada

    Estamos en la misma situacin de antes, salvo que ahora tenemos localizado el problema

    30

    Cdigo de Ti

    while (true){

    exito = false;

    while (!exito){

    mostrar butacas libres al usuario

    a=; //asiento seleccionado

    if (! asientos[a]) {

    asientos[a] = true ;

    emitir la entrada

    exito = true;

    } else {

    dar un mensaje de error

    }

    }

    }

  • Ejemplo: Mquinas vendedoras de entradas

    Instrucciones atmicas: las que el procesador realiza sin interrupcin.

    Slo las instrucciones mquina son atmicas

    load asientos[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asientos[a] to true

    code for emitir la entrada

    cet xito a true

    L1: code for mensaje error

    L2: code following if statement

    >

    load asientos[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asientos[a] to true

    >

    code for emitir la entrada

    set xito a true

    L1: code for mensaje error

    L2: code following if statement

    y si el cdigo marcado fuera atmico?

    31

    while (true){

    exito = false;

    while (!exito){

    mostrar butacas libres al usuario

    a=; //asiento seleccionado

    if (! asientos[a]) {

    asientos[a] = true ;

    emitir la entrada

    exito = true;

    } else {

    dar un mensaje de error

    }

    }

    }

  • Ejemplo: Mquinas vendedoras de entradas

    Ejemplo: Mquinas vendedoras de entradas

    Instrucciones atmicas: las que el procesador realiza sin interrupcin.

    Slo las instrucciones mquina son atmicas

    >

    load asiento[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asiento[a] to true

    >

    code for emitir la entrada

    set xito a true

    L1: code for mensaje error

    L2: code following if statement

    TRAZA de ejecucin que muestra el error

    Ti: chequea asientos[22] y lo encuentra libre

    Tj: chequea asientos[22] y lo encuentra libre

    Ti: asientos[22] = true

    Tj: asientos[22] = true

    Ti: emitir la entrada

    Tj: emitir la entrada

    Si el cdigo azul fuera atmico la traza errnea ya no ocurrir

    32

  • Ejemplo: Mquinas vendedoras de entradas

    Ejemplo: Mquinas vendedoras de entradas

    Instrucciones atmicas: las que el procesador realiza sin interrupcin.

    Slo las instrucciones mquina son atmicas

    >

    load asiento[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asiento[a] to true

    >

    code for emitir la entrada

    set xito a true

    L1: code for mensaje error

    L2: code following if statement

    33

    El nico entrelazado posible ocurre ANTES O DESPUS de

    que Ti hay ejecutado el cdigo azul

    TRAZA de ejecucin no errnea

    Ti: chequea asiento[22] y lo encuentra libre

    Ti: asientos[22] = true

    Tj: chequea asiento[22] y lo encuentra ocupado

  • Ejemplo: Mquinas vendedoras de entradas

    Instrucciones atmicas: las que el procesador realiza sin interrupcin. Slo las instrucciones mquina son atmicas

    Seccin crtica: parte del cdigo de un proceso que debera ejecutarse de forma atmica

    Cuando dos secciones crticas de dos procesos no pueden solaparse en el tiempo (su cdigo no puede entrelazarse) se dice que deben ejecutarse en exclusin mutua

    Si SCi y SCj son dos secciones crticas de los procesos Ti y Tj, la exclusin mutua significa que e. (SCi SCj ) (SCj SCi )

    >

    load asiento[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asiento[a] to true

    >

    code for emitir la entrada

    set xito a true

    L1: code for mensaje error

    L2: code following if statement

    Seccin crtica

    >

    load asiento[a] to CPU register

    test the value of CPU register

    jump to L1 if true

    set asiento[a] to true

    >

    code for emitir la entrada

    set xito a true

    L1: code for mensaje error

    L2: code following if statement

    Seccin crtica

    34

  • Plataformas

    Sistemas monoprocesadores La concurrencia siempre se implementa utilizando el entrelazado

    de las instrucciones de los procesos.

    Es til para dar servicio a varios usuarios desde la misma mquina

    Se aprovechan los ciclos del procesador mientras que est realizando operaciones de entrada/salida

    Todos los procesos comparten memoria, por lo que la comunicacin se realiza de forma natural a travs de esta memoria compartida.

    Tambin es posible modelar sistemas de memoria distribuida en los que los procesos se comunican a travs del paso de mensajes.

    35

  • Plataformas

    Multiprocesadores fuertemente acoplados

    Es posible tener paralelismo real

    Los procesos se comunican de forma natural a travs del espacio de memoria comn que comparten

    Cada procesador puede tener a su vez memoria local

    Normalmente a cada CPU le corresponde ms de un proceso

    En este tipo de arquitectura hay buenas ganancias en tiempo por la ejecucin paralela y porque el costo de comunicaciones es bajo.

    CPU CPU CPU CPU

    RAM

    36

  • Plataformas

    Multiprocesadores dbilmente acoplados (Sistemas distribuidos)

    En esta arquitectura hay concurrencia real

    Cada nodo de la red podra ser un monoprocesador o un multiprocesador fuertemente acoplado

    La comunicacin se realiza de forma natural mediante paso de mensajes a los procesos

    El coste de las comunicaciones en esta arquitectura es relevante, y puede degradar las ganancias en tiempo obtenidas debido a la ejecucin paralela

    CPU CPU CPU CPU

    RAM RAM RAM RAM

    37