Programacion paralela en C : Inicio

por:

Los inicios de la programacion paralela en C para Linux

En esta serie de entradas que hoy empezamos, nos vamos a enfocar en la programación de sucesos paralelos en C. Este tipo de programación implica conocer una serie de conceptos especiales y saber cómo funcionan como los semáforos.

Programación paralela

La decisión de utilizar programación paralela parte de la base de que muchas veces queremos agilizar nuestros cálculos y para ello queremos usar todo el potencial de nuestra CPU. Actualmente seguramente muchos tendremos una CPU con varios núcleos, así que por qué no utilizarlos todos para agilizar los cálculos. Por ejemplo si queremos sumar (por fuerza bruta) el primer millón de números, tardaremos menos si distribuimos la carga entre varios núcleos que si hay que realizarlo todo de manera secuencial.

Conceptos de programación paralela

Básicamente hay dos maneras de realizar la programación paralela, mediante hilos o mediante procesos:

  • Todos los hilos comparten los recursos, es decir si nosotros cambiamos con un hilo el valor de una posición de memoria, ese valor nuevo lo tendrán el resto de hilos.
  • Todos los procesos realizan una copia de los recursos del proceso padre, especialmente de su memoria y sus variables. En este caso un valor que cambiemos en un proceso no tiene repercusión en otro proceso, son entornos totalmente aislados.

Compartición de datos

Una de las primeras preguntas que uno se hace al escuchar cómo los procesos son totalmente aislados, es cómo se realiza la compartición de datos. En este caso también encontramos dos técnicas básicamente:

  • Memoria compartida: en este caso se utiliza una zona de memoria principal declarada de una manera especial, para que todos los procesos puedan acceder a ella.
  • Paso de mensajes: cada proceso tiene un identificador y mediante el sistema operativo y su identificador le podemos mandar mensajes.

Primeros pasos en la programación paralela en Linux

En el caso de Linux hay una llamada al sistema denominada fork que permite duplicar nuestro proceso y de esta manera se puede empezar a realizar programas multiproceso.
En este programa de ejemplo que os adjuntamos podéis ver como se crean 2 ficheros, uno por parte del hijo y otro por parte del padre. Además si quitas los comentarios podrás ver (con top, ps etc) como tienes 2 procesos con el nombre de tu ejecutable.

#include 
#include 

int main(){
    
    int pid; //ID del proceso
    FILE *fichero;
    puts("Este es un programa de ejemplo de programa multiproceso");
    
    pid = fork();
    switch(pid){
        case -1:
            fprintf(stderr,"Error al hacer fork");
        break;
        case 0:
            fichero = fopen("hijo.txt","w");
            fprintf(fichero,"Hola soy el hijo");
            fclose(fichero);
            /*while(1==1) {
                 
             }*/ 
        break;
        default:
            fichero = fopen("padre.txt","w");
            fprintf(fichero,"Hola soy el padre y mi hijo tiene el pid %d",pid);
            fclose(fichero);
            /*while(1==1) {
                 
             }*/ 
        break;      
    }   
    return 0;
}

The following two tabs change content below.

Jorge Durán

Administrador, redactor y creador de Somos Binarios
Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

2 comentarios en “Programacion paralela en C : Inicio”

  1. Elias

    Hola, como introducción al paralelismo no está mal trabajar con forks, pero quizás deberías usar la librería MPI por ejemplo, la cual posee funciones paralelas muy potentes como send, receive, scatter, gather etc. Así te aproximarías mas a una implementación mas real y útil de un código paralelo. De la misma forma, para comprender el paralelismo casi sería mejor empezar por un lenguaje orientado al paso de mensajes como es erlang que c.

    Responder
    • SomosBinarios

      Hola Elias la verdad es que con estos artículos queremos realizar un acercamiento al paralelismo y por ello empezamos con los forks y demás. Mi idea era finalizar la serie de articulos con uno sobre MPI (con el que he trabajado).

      Sobre la decisión de elegir C, básicamente es por dos razones:
      – He trabajado con C este tipo de cosas
      – Es bastante conocido por los desarrolladores (más que Ada por ejemplo).

      Un saludo 🙂

      Responder

Deja una Respuesta