miércoles, 5 de mayo de 2010

Pensando en paralelo

Edit (3 meses despues...): Que fallo mas tonto!, me olvide de colgar la implementación de la lista enlazada :(, está aquí [llist.c]

Entre los paradigmas de programacion en paralelo, destacan el multiproceso (varios procesos, un hilo para cada uno), y el multihilo (un solo proceso, varios hilos de ejecucion), la principal diferencia es que si un programa es multiproceso, la memoria (la RAM) no es compartida, esto hace que no haya que preocuparse de cuando se accede a los datos, o se modifican, para evitar que otras instancias del programa fallen, pero hace obligatorio el uso de IPC (Comunicacion Entre Procesos) para coordinar el programa.

Asi, con el multihilo el IPC se puede reemplazar por cosas como variables globales, ademas por no necesitar una region de memoria propia, es bastante mas ligero, aun asi, elijas el modelo que elijas, siempre tendras el mismo problema, que se puede resumir en

-¿Por que cruzo la gallina paralela la calle?
-cruzar la calle Para

-¿Por que cruzo la gallina paralela la calle?
-Para calle la cruzar


Que se quiere decir con esto?, que la programacion en paralelo implica que mucho codigo se va a invertir en coordinar el programa... y bueno, a quien le guste esa parte, pues bien, pero a quien no...


Esta presentacion tan... cutre , era para mostrar un pequeño codigo (aunque aun esta bastante verde) que pretende simplificar el uso de programas multihilo sobre listas de palabras, por ejemplo:

#include "thread_launcher.h"
#include <stdio.h>
#include <stdlib.h>

void print(char *s){

    printf("%s\n",s);
}

int main(int argc,char **argv){

    if (argc<2){
        printf("Uso: ./sample <nombre del archivo>\n");

        return 1;
    }
    FILE *f=fopen(argv[1],"r");

    if (f==NULL){
        printf("No se ha podido leer el archivo %s\n",argv[1]);

        return 2;
    }
    launch_threads(2, print, f);

    fclose(f);
    return 0;
}

Lo unico que hay que hacer (aparte de añadir -lpthread al compilar y importar el codigo), es abrir un archivo, y usar la funcion:

launch_threads(<Numero de hilos>, <Funcion que se llamara>, <Archivo que se lee>);

[ThreadLauncher.zip]

ps: el codigo esta acabado, pero no demasiado probado... aviso...


Hasta otra!

2 comentarios:

  1. pensaras que has escrito una chorrada quizas, pero a mi me dio la vida este codigo.
    Hace tiempo escribi un programa en visual basic igualito a este que porte para amiga: http://www.os4depot.net/index.php?function=showfile&file=network/misc/wlandecrypter.rar

    Un wlandecrytpter que bautice wlan123 por que precisaba de 3 pasos para sacar una web de las de telefonica.
    El programita estaba bien, es decir, era basic pero ... tenia un problema grave. Por un lado era inecesario por que wlandecrypter cumple bien su cometido pero ... la finalidad era hacerlo sobre railes, que llegases metieses los datos y este te sacase la wep sin mediar con la linea de comandos que tanto asusta a muchas personas (lo realice para un chaval de mi antiguo curre).
    El programa funcionaba pero tardaba mucho en realizar lo que tendria que hacerse en poco tiempo (paralelo) por que recorria secuencialmente en un solo proceso.
    Lo cierto es que aunque funcionaba era lentisimo y sabia que tendria que hacer algo asi e incluso podia agilizarlos haciendo chapuzas, ... en fin, no te canso mas. El tema es que viendolo asi me dan ganas de reimplementarlo.
    Al cabo de los meses viendo que era una mierda aquello lo re-escribi usando el algoritmo boyer moore (ventana) y la cosa mejoro (grep y egrep usan boyer moore desde principios de los 90).

    Si ademas usamos esto que para los programadores es algo trivial (yo no soy programador) lo cierto es que se puede llegar a hacer cosas interesantes.

    En fin, que me ha venido bien, eso era lo que queria decir.

    saludos.

    ResponderEliminar