Aufgabe 1 ========= (Idee der Aufgabe: Dr. Wolf Mueller) Aufgabe (verbose) ----------------- Es ist Sommer und es sollen in einen Eimer 10000000 Kirschen gepflueckt werden. Fuer Fred alleine ist das zu viel Arbeit, also arbeiten seine Freunde Barney, Franz und Karl mit. Das laeuft etwa so ab: Einer greift sich den Eimer, schaut rein, ob schon genug Kirschen drin sind, wenn das der Fall ist hoert er auf zu pfluecken, sonst klettert er auf den Kirschbaum und pflueckt eine Kirsche, die er von dort in den Eimer wirft. Nach etwa 1 Stunde (die vier waren fleissig) sind sie fertig, der Eimer ist voll. Alle haben mitgezaehlt, wie viele Kirschen sie gepfluekt haben. Jeder behauptet, mehr als ein Viertel der Kirschen im Eimer gepflueckt zu haben. Sie beginnen zu streiten... Was war passiert? Leider sind oft Kirschen neben den Eimer gefallen, da die Freunde sich nicht absprachen. So kam es vor, dass waehrend der eine hochklettert und pflueckt sich ein anderer gerade den Eimer geholt hat und der erste die Kirsche nach unten, aber nicht in den Eimer geworfen hat. Was kann man tun? Aufgabe (konkret) ----------------- Schreiben Sie ein C-Programm cherry_count, das den Zaehler int cherries (globale Variable, Zugriff durch vier Threads) von 0 bis auf 10000000 mit Hilfe von vier Threads hochzaehlt. Jeder Thread i zaehlt noch seinen eigenen exklusiven Zaehler my_cherries[i] mit. Die Threads zaehlen nur solange bis die gemeinsam genutzte Variable cherries den Wert 10000000 erreicht. Ist dies der Fall, so gibt cherry_count folgende Daten mit Leerzeichen getrennt my_cheries[0], my_cheries[1], my_cheries[2], my_cheries[3], my_cheries[0]+my_cheries[1]+my_cheries[2]+my_cheries[3], cherries aus, und beendet sich. Sie werden merken, dass die korrekte Abarbeitung des Programms auf einer Mehrprozessormaschine Syncronisationsmechanismen erfordert. Implementieren Sie diese derart, dass die Syncronisation mit gcc cherry_count.c -DSYNC -o cherry_count_s eingeschaltet wird, und ohne diesen Schalter gcc cherry_count.c -o cherry_count ausgeschaltet bleibt. Testen Sie beide Varianten auf einer Mehrprozessormaschine (gruenau3, gruenau4 (Linux) oder rabe, star (Solaris 11)) und schreiben Sie Ihre Beobachtungen hinsichtlich Laufzeit und Verlaesslichkeit als Kommentar in das C-File. Referenzrechner ist GRUENAU4 (smp). Hinweis: -------- Benutzen sie Konstruktionen wie: #define ifdef SYNC ..... #endif um Syncronisation an- bzw. auschschaltber zu gestalten! 5 Punkte Aufgabe 2 ========= Es ist ein Makefile fuer die obige Aufgabe zu erstellen, das folgende Funktionen bei der Bildung des obigen Projektes enthaelt: 1. Bildung der Programme(Binary) mit und ohne SYNC. 2. Loeschen aller durch make erzeugten Files einschliesslich der Hilfsfiles 3. Installieren der Binaries an der ueblichen Stelle (/usr/local/bin) 4. Drucken des Quelltextes, wenn dieser neu ist. 5. Einpacken aller zum Projekt gehoerenden Files ohne Hilfsfiles in ein tar-File im uebergeordneten Verzeichnis 3 Punkte Abgabe des tar-Files in Goya ein kompremiertes tar-File(account-name.tgz) Aufgabe in einem Unterverzeichnis z.B.: sollte das File account-name.tgz folgende Files enthalten account-name/3.Aufgabe/Makefile account-name/3.Aufgabe/a1.c # C-Quelltext account-name/3.Aufgabe/a1.h # Headerfile, falls notwendig .... und mit /bin/tar -zxvf account-name.tgz unter Linux (gruenau4) auspackbar sein
Mi 11. Jun 09:00:25 CEST 2014 Abgabe: 24. Juni 2014 23:59 Uhr Jan-Peter Bell