Fork() und pointer auf Speicher...



  • Hallo,

    ich habe eine Frage bezüglich fork() und dem verwendeten Speicher....
    (Bin diesbezüglich ziemlicher Anfänger)

    Es sieht folgendermaßen aus: ich muss ein Bild berechnen und damit das etwas zügiger geht soll das ganze parallelisiert werden. Die berechnung des Bildes führt eine Fkt aus, welche folgende Parameter hat:

    void calc_image(pixel_data_t *data, int full_width, int full_height,
                         int clip_x, int clip_y, int clip_width, int clip_height);
    

    pointer data: Pointer auf die Stelle im Speicher, ab wo die berechneten Daten in den Speicher geschrieben werden sollen.

    int clip_y: Position, von wo an die Berechnung stattfinden soll (y-Koordinate im Bild).

    int clip_height: Anzahl der Zeilen, die berechnet werden sollen.

    Ich denke die anderen Parameter sind erstmal nicht so wichtig für meine Frage.

    Wie stark es parallelisiert wird, kann angegeben werden, ist also von Fall zu Fall verschieden. Davon hängt es also ab, in wieviele Segmente ich das Bild aufteile und parallel berechnen lasse. Wie gesagt mache ich das Zeilenweise , also bei z.B. 2 Parallelen Prozessen teile ich das Bild in eine obere hälfte und in eine untere hälfte, bei 4 in 4 Abschnitte usw...
    Zu Begin wird der Speicher für das gesamte Bild allociert:

    pixel_data_t *data = calloc(width*height, sizeof(pixel_data_t));
    

    Naja und nun berechne ich quasi die Position des Pointers data (also den offset) für jedes Segment. Somit werden die berechneten Pixel hintereinander in den Speicher geschrieben und zum schluss wird das Bild einfach in eine Datei geschrieben.

    Nun die Frage:
    Meine Schleife sieht in etwa so aus (habe den code gerade nicht zur hand):

    for(int i=0; i<berechnete Anzal durchläufe; i++ )
    {
    calc_image(pointer+offset, berechnete_y-Koordinate, anzahl_Zeilen,...)
    }
    Nachdem alle Pixel berechnet und im Speicher sind, wird das Bild geschrieben:
    fwrite(data, sizeof(pixel_data_t), width*height, file);
    

    Es schreibt also jeder Durchgang für jedes Segment des Bildes, welches er berechnet, die Pixel direkt an die entsprechende Speicherstelle im Speicher (ist das jetzt so langsam verständlich??? 😕 ). Anschließend wird das ganze dann als Bild mit fwrite im Dateisystem gespeichert.

    Naja und um das zu parallelisieren hab ich mir gedacht, ich forke einfach bei jedem Durchlauf (jaja, soeinfach ist es bestimmt nicht 😃 ):

    for(int i=0; i<berechnete Anzal durchläufe; i++ )
    {
      pid=fork();
      if(pid==0)
      {
        calc_image(pointer+offset, berechnete_y-Koordinate, anzahl_Zeilen,...)
        exit(0);
      }
    }
    wait();
    fwrite(data, sizeof(pixel_data_t), width*height, file);
    

    Meine entgültige Frage ist nun: wenn ich nun calc_image() aufrufe, wird dann immernoch der richtige Speicher (also pointer+offset) angesprochen oder wewrden die berechneten Pixel woanders im Speicher gespeichert? So wie ich es verstanden habe, haben verschiedene Prozesse doch verschiedenen Speicher, oder? Müsste ich dann mit Pipes arbeiten?

    Naja ich hoffe ihr könnt mir helfen, schoneinmal vielen dank und ich hoffe ihr habt mein Problem verstanden 😉 .

    Gruß,
    Scarvy



  • wenn ich nun calc_image() aufrufe, wird dann immernoch der richtige Speicher (also pointer+offset) angesprochen oder wewrden die berechneten Pixel woanders im Speicher gespeichert?

    woanders. Prozesse haben - wie du ja selbst sagst - getrennten Speicher. (bzw. mit Copy-on-Write haben sie getrennten Speicher fürs schreiben).

    Für Interprozesskommunikation (IPC) könntest du Sharedmemory verwenden oder einfach Threads nehmen (die haben einen gemeinsamen Speicher). In beiden Fällen musst du dich aber um die Synchronisation kümmern!

    http://beej.us/guide/bgipc/output/html/multipage/shm.html



  • Supi, vielen Dank. Im Nachhinein war es irgendwie eine dumme Frage... hatte da zuviel Kauderwelsch in meinem Kopf 😉

    Leider müssen es Prozesse sein, also werd ich das mit dem shared memory machen. Sah auch nicht allzu schwer aus.

    Also besten Dank,
    Scarvy


Anmelden zum Antworten