Παράλληλη Επεξεργασία

Σχετικά έγγραφα
Λειτουργικά Συστήματα

Λειτουργικά Συστήματα

Ε-85: Ειδικά Θέµατα Λογισµικού

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Παράλληλη Επεξεργασία

Λειτουργικά Συστήματα (ΗΥ321)

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

Διεργασίες και Νήματα (2/2)

Προγραμματισμός Ι (ΗΥ120)

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Παράλληλη Επεξεργασία

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Λειτουργικά Συστήματα Η/Υ

NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4

Εισαγωγή στην Πληροφορική

Λειτουργικά Συστήματα (Λ/Σ)

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Δομημένος Προγραμματισμός

Κατανεμημένα Συστήματα

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Κεφάλαιο 3. Διδακτικοί Στόχοι

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Παρουσίαση 5 ης Άσκησης:

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Ανάπτυξη και Σχεδίαση Λογισμικού

Παρουσίαση 5 ης Άσκησης:

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγικά & Βασικές Έννοιες

Παράλληλη Επεξεργασία

Συναρτήσεις-Διαδικασίες

Ανάπτυξη και Σχεδίαση Λογισμικού

Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

Μάθημα 3 ο ΔΙΕΡΓΑΣΙΕΣ (PROCESSES)

Λειτουργικά Συστήματα

Περιγραφή και Έλεγχος ιεργασιών

Παράλληλη Επεξεργασία

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Λειτουργικά Συστήματα

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

Χρονοδρομολογητής Κυκλικής Επαναφοράς

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Λιβανός Γιώργος Εξάμηνο 2017Β

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Εργαστήριο 5 fork(), exec(), signals

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Εργαστήριο 7 fork(), exec(), signals

Ενότητα 2 (Κεφάλαιο 3) Περιγραφή και Έλεγχος Διεργασιών. Περιεχόμενα. Ανάγκη ύπαρξης διεργασιών 1

Μάθημα 6 ο. Χρονοδρομολόγηση (Scheduling)

Εισαγωγή στον Προγραμματισμό

Λειτουργικά Συστήματα (Λ/Σ)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα

Τι σημαίνει; n Για την αποδοτική δέσμευση δομών δεδομένων μη. n Για την αποφυγή «διαρροών μνήμης» (memory leaks).

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Λειτουργικά Συστήματα

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Εισαγωγικά & Βασικές Έννοιες

Διεργασίες και Νήματα (1/2)

Λειτουργικά Συστήματα (Λ/Σ)

Αρχιτεκτονική Υπολογιστών

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Διεργασίες - Σύνοψη. Διακοπές, προνομιούχος κατάσταση Κλήσεις συστήματος. Ορισμός, μεταβάσεις κατάστασης κύκλος ζωής

Διάλεξη 15η: Αναδρομή, μέρος 1ο

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Διαδικασιακός Προγραμματισμός

Λιβανός Γιώργος Εξάμηνο 2017Β

Επεξεργασία Αρχείων Κειµένου

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΛΟΓΙΣΜΙΚΟ (software)

Θοδωρής Ανδρόνικος Τμήμα Πληροφορικής, Ιόνιο Πανεπιστήμιο

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Ανάλυση Επιδόσεων Συστημάτων Πραγματικού Χρόνου

Λειτουργικά Συστήματα

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

είκτες και Πίνακες (2)

Λειτουργικά Συστήματα

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

Transcript:

Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στα Πολυεπεξεργαστικά Συστήματα Διερασίες και Νήματα σε Πολυεπεξεργαστικά Συστήματα Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group

Παράλληλοι Η/Υ - Το Κίνητρο Δεδομένα: Συνεχής αύξηση της υπολογιστικής ισχύος Εφαρμογές με αυξανόμενες απαιτήσεις Διαχρονικότητα: Ανεξάρτητα από την ισχύ ενός επεξεργαστή πάντα η δυνατότητα συνεργασίας περισσότερων του ενός θα υπόσχεται μεγαλύτερη απόδοση

Πολυεπεξεργαστικά Συστήματα Συστήματα που περιλαμβάνουν περισσότερους από 1 επεξεργαστές, οι οποίοι συνεργάζονται για την εκτέλεση εφαρμογών (multiprocessors) Κάθε επεξεργαστής εκτελεί ανεξάρτητα ένα μέρος της συνολικής εργασίας Οι επεξεργαστές επικοινωνούν μεταξύ τους για το συντονισμό της εργασίας και την επίτευξη αποδοτικής επεξεργασίας Το τελικό αποτέλεσμα της εκτέλεσης σε πολυεπεξεργαστικό σύστημα πρέπει σε κάθε περίπτωση να είναι ίδιο με αυτό που προκύπτει από την εκτέλεση σε μονο-επεξεργαστικό σύστημα (uniprocessor)

Πολυεπεξεργαστικά Συστήματα Η επικοινωνία των επεξεργαστών παίζει βασικό ρόλο στο σχεδιασμό των multiprocessors. Τα κυριότερα αρχιτεκτονικά μοντέλα που έχουν επικρατήσει είναι: Επικοινωνία μέσω κοινής μνήμης: Όλοι οι επεξεργαστές έχουν πρόσβαση στην ίδια κύρια μνήμη Η επικοινωνία γίνεται με λειτουργίες read/write στην κοινή μνήμη Ο προγραμματισμός είναι απλός Ηεπίτευξηυψηλήςαπόδοσηςγίνεταιδύσκολήόσοαυξάνεταιο αριθμός των επεξεργαστών. Επικοινωνία μέσω μηνυμάτων: Κάθε επεξεργαστής έχει ιδιωτική μνήμη Οι επεξεργαστές επικοινωνούν με αποστολή/λήψη μηνυμάτων μέσω ενός γρήγορου διασυνδετικού δικτύου Παρουσιάζουν δυσκολίες στον προγραμματισμό Αποδοτικά για μεγάλο αριθμό επεξεργαστών

Πολυεπεξεργαστικά Συστήματα

Λειτουργικό Σύστημα Μέσο διασύνδεσης των χρηστών και των εφαρμογών τους με το υλικό των υπολογιστών Ο χρονοδρομολογητής του λειτουργικού συστήματος αναθέτει διεργασίες στους επεξεργαστές του συστήματος ΒΙΒΛΙΟΘΗΚΕΣ ΜΕΤΑΦΡΑΣΤΕΣ ΕΦΑΡΜΟΓΕΣ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ - ΔΡΟΜΟΛΟΓΗΤΗΣ ΕΠΕΞΕΡΓΑΣΤΕΣ ΜΝΗΜΗ ΠΕΡΙΦΕΡΕΙΑΚΑ

Διεργασίες Προγράμμα = Εκτελέσιμος κώδικας + δεδομένα (στατική οντότητα) Διεργασία = Στιγμιότυπο της εκτέλεσης ενός προγράμματος. Συλλογή από δομές δεδομένων που περιγράφουν πλήρως την διαδικασία εκτέλεσης του προγράμματος μια ορισμένη στιγμή (δυναμική οντότητα)

Διεργασίες Η περιγραφή μιας διεργασίας γίνεται μέσω: Του χώρου διευθύνσεων της (address space), δηλαδή τμήματος της κύριας μνήμης που δεσμεύεται για την διεργασία και αποτελείται από: Το τμήμα κώδικα (code segment) To τμήμα δεδομένων (data segment) To τμήμα στοίβας (stack segment) Το τμήμα σωρού (Heap) Πληροφορίες που διατηρεί το λειτουργικό σύστημα εσωτερικά (κατάσταση διεργασίας, προτεραιότητα, δεσμευμένοι πόροι, στατιστικά). Σαν κατάσταση διεργασίας θα αναφέρουμε κάθε στιγμιότυπο κατά στο οποίο τα παραπάνω δεδομένα έχουν συγκεκριμένες τιμές. Ειδικά θα αναφέρομαστε στην: Κατάσταση μνήμης, για να περιγράψουμε την κατάσταση του χώρου διευθύνσεων Κατάσταση CPU, για να περιγράψουμε τιμές καταχωρητών όπως ο Program Counter (PC), ο Stack Pointer (SP) και άλλοι. 0xFFFFFFFF SP HP PC 0x00000000 STACK (προσωρινά δεδομένα κ.α.) HEAP (δυναμικά δεδομένα) DATA SEGMENT (στατικά δεδομένα) CODE SEGMENT

Εκτέλεση διεργασίας Για να εκτελεστεί μια διεργασία σε έναν επεξεργαστή πρέπει να φορτωθεί σε αυτόν η κατάσταση CPU της διεργασίας Κατά την εκτέλεση τις διεργασίας η κατάσταση CPU μεταβάλλεται Για να σταματήσει η εκτέλεση μιας διεργασίας και να ξεκινήσει μια άλλη (context switching): Αποθηκεύεται η κατάσταση CPU της τρέχουσας διεργασίας Φορτώνεται η κατάσταση CPU της προς εκτέλεση διεργασίας

Εκτέλεση διεργασίας ΧΡΟΝΙΚΗ ΣΤΙΓΜΗ Τ0 ΧΡΟΝΙΚΗ ΣΤΙΓΜΗ Τ1 ΧΡΟΝΙΚΗ ΣΤΙΓΜΗ Τ2 ΧΡΟΝΙΚΗ ΣΤΙΓΜΗ Τ3 ΔΙΕΡΓΑΣΙΑ Α ΔΙΕΡΓΑΣΙΑ Α ΔΙΕΡΓΑΣΙΑ Α ΔΙΕΡΓΑΣΙΑ Α ΚΑΤΑΣΤΑΣΗ CPU A (T0) ΚΑΤΑΣΤΑΣΗ CPU A (T1) ΔΙΕΡΓΑΣΙΑ Β ΔΙΕΡΓΑΣΙΑ Β ΔΙΕΡΓΑΣΙΑ Β ΔΙΕΡΓΑΣΙΑ Β ΚΑΤΑΣΤΑΣΗ CPU Β (T0) ΚΑΤΑΣΤΑΣΗ CPU Β (T0) ΚΑΤΑΣΤΑΣΗ CPU Β (T2) ΕΠΕΞΕΡΓΑΣΤΗΣ ΕΠΕΞΕΡΓΑΣΤΗΣ ΕΠΕΞΕΡΓΑΣΤΗΣ ΕΠΕΞΕΡΓΑΣΤΗΣ ΚΑΤΑΣΤΑΣΗ CPU A (T1) ΚΑΤΑΣΤΑΣΗ CPU Β (T2) ΚΑΤΑΣΤΑΣΗ CPU A (T3)

Ζητούμενο: Αξιοποίηση των πολυεπεξεργαστικών συστημάτων Κάθε στιγμή σε έναν επεξεργαστή εκτελείται μια διεργασία. Θεωρία: Χρόνος σε multiprocessor = χρόνος σε uniprocessor # επεξεργαστών Οι εφαρμογές καλούνται να εκμεταλλευτούν στο έπακρο την ύπαρξη πολυεπεξεργαστικών συστημάτων Πως μπορεί να γίνει αυτό;

1 η Λύση: Πολλαπλές Διεργασίες Η εφαρμογή ξεκινά με την δημιουργία μιας αρχικής διεργασίας (parent process) η οποία δημιουργεί με τη σειρά της διεργασίεςαντίγραφα (child processes). Σε κάθε διεργασία-παιδί ο χώρος διευθύνσεων είναι ακριβές αντίγραφο του χώρου διευθύνσεων της αρχικής διεργασίας. Κάθε διεργασία-παιδί αναλαμβάνει συγκεκριμένους σκοπούς της εφαρμογής και κατανέμεται σε διαφορετικό επεξεργαστή από τον αλγόριθμο δρομολόγησης, γεγονός που συνεπάγεται την παράλληλη εκτέλεση της εφαρμογής. Για την δημιουργία διεργασιών δείτε την κλήση συστήματος fork()

Παράλληλη εκτέλεση διεργασιών

2 η Λύση: Νήματα (Threads) Φιλοσοφία των νημάτων: Αντιγραφή και διαχωρισμός μόνο των απαραίτητων δεδομένων. Κοινή διαμοίραση των υπόλοιπων. Συγκεκριμένα: Μια διεργασία μπορεί να δημιουργήσει πολλαπλά νήματα, τα οποία εκτελούν μια συγκεκριμένη συνάρτηση. Κάθε τέτοιο νήμα έχει ξεχωριστή κατάσταση CPU και συνεπώς όλα μπορούν να εκτελεστούν ταυτόχρονα σε διαφορετικούς επεξεργαστές. Κάθε νήμα χρησιμοποιεί τον ίδιο χώρο διευθύνσεων, οπότε όλα επενεργούν στα ίδια δυναμικά και στατικά δεδομένα. Για την δημιουργία νημάτων δείτε την κλήση συστήματος pthread_create() 0xFFFFFFFF SP2 SP1 SP0 HP PC 0x00000000 THREAD STACK 2 THREAD STACK 1 THREAD STACK 0 HEAP (δυναμικά δεδομένα) DATA SEGMENT (στατικά δεδομένα) CODE SEGMENT

Παράλληλη εκτέλεση νημάτων

Σύγκριση διεργασιών-νημάτων Χώρος διευθύνσεων Κάθε διεργασία-παιδί έχει ξεχωριστό χώρο διευθύνσεων Όλα τα νήματα έχουν κοινό χώρο διευθύνσεων Τα νήματα είναι πιο βολικά στον προγραμματισμό παράλληλων εφαρμογών καθώς ανταλλάσσουν πληροφορία με απλές λειτουργίες load-store Η ανταλλαγή πληροφορίας μεταξύ διεργασιών πρέπει να γίνει ρητά (πέρασμα μηνυμάτων, ορισμός κοινής μνήμης) Κόστος διαχείρισης Οι διεργασίες είναι βαριές, η δημιουργία τους και η εναλλαγή τους απαιτούν σημαντικό χρόνο Τα νήματα είναι πιο ελαφρά, δημιουργούνται και εναλλάσσονται ταχύτερα Οι παράλληλες εφαρμογές που χρησιμοποιούν νήματα είναι ταχύτερες Μεταφερσιμότητα Η έννοια της διεργασίας είναι έγκυρη για όλα τα λειτουργικά συστήματα Η έννοια των νημάτων παρουσιάζει διαφορές από λειτουργικό σε λειτουργικό Η υιοθέτηση του προτύπου POSIX γιατανήματααυξάνειτην μεταφερσιμότητα τους

Διαχείριση διεργασιών - νημάτων Σε κάθε διεργασία που δημιουργείται ανατίθεται ένας μοναδικός αριθμός που λέγεται pid (process id ) pid_t pid; Μέσω του αναγνωριστικού pid ο προγραμματιστής μπορεί να ξεχωρίσει και να διαχειριστεί τις διάφορες διεργασίες. Μια διεργασία μπορεί να μάθει το pid της μέσω της κλήσης pid_t getpid(void); Σύμφωνα με το πρότυπο POSIX κάθε νήμα που δημιουργείται περιγράφεται από μια δομή τύπου pthread_t: pthread_t thread; Μέσω του αναγνωριστικού pthread_t ο προγραμματιστής μπορεί να ξεχωρίσει και να διαχειριστεί τα διάφορα νήματα Ένανήμαμπορείναπάρειτη δομή που το περιγράφει με την κλήση pthread_t pthread_self(void);

Κύκλος ζωήςδιεργασιών-νημάτων Δημιουργία Κλήση συστήματος Δημιουργία Κλήση pid_t fork (void ); Όταν καλείται η fork( ) δημιουργείται ένα αντίγραφο της διεργασίας που την κάλεσε Η διεργασία που την καλεί ονομάζεται διεργασία-πατέρας και αυτή που δημιουργείται διεργασία-παιδί Η επεξεργασία συνεχίζεται τόσο στα παιδιά όσο και στον πατέρα, από τις εντολές που ακολουθούν την fork( ) int pthread_create ( pthread_t * thread, pthread_attr_t *attr, void * (*start_routine) (void *), void * arg); Η κλήση αυτή κατασκευάζει ένα νέο νήμα που θα εκτελέσει τη συνάρτηση start_routine, με όρισμα το arg. Η δομή που περιγράφει το νέο νήμα αποθηκεύεται στο όρισμα thread. Το νέο νήμα είναι έτοιμο να εκτελεστεί αμέσως μετά τη δημιουργία του.

Κύκλος ζωής διεργασιών-νημάτων Για τον ομαλό τερματισμό του προγράμματος η διεργασία-πατέρας θα πρέπει να περιμένει τον τερματισμό των παιδιών: Κλήση συστήματος pid_t waitpid( pid_t pid, int *status, int options); Η διεργασία που καλεί την waitpid( ) σταματά την εκτέλεση της μέχρι η pid διεργασία που αναμένει να τερματίσει την εκτέλεση της Τερματισμός των παιδιών Kλήση void exit(int); Η διεργασία που καλεί την exit( ) τερματίζει την εκτέλεση της Για τον ομαλό τερματισμό του προγράμματος ένα οποιοδήποτε νήμα πρέπει να περιμένει τα υπόλοιπα να τελειώσουν: Κλήση int pthread_join( pthread_t thread, void ** ret); Το νήμα που καλεί την pthread_join( ) σταματά την εκτέλεση του μέχρι το thread νήμα που αναμένει, να τερματίσει την εκτέλεση του. Στο όρισμα ret αποθηκεύεται η τιμή που επιστρέφει η συνάρτηση που εκτελέστηκε από το νήμα Τερματισμός νημάτων Κλήση void pthread_exit(void *);

Παράδειγμα με διεργασίες void * work_function(void *); int main(int argc, char **argv) { int i=1; int pid, status; pid = fork(); if(pid == 0){ printf( Child\n ); work_function((void *) i); exit(0); } printf( Father of %d\n, pid); waitpid(pid, &status, 0); } return 0;

Παράδειγμα με νήματα void * work_function(void *); int main(int argc, char **argv) { int i = 1; pthread_t thread; pthread_create(&thread, NULL, workfunction, (void *) i); pthread_join(thread, NULL); printf( Child ended, exiting \n ); } return 0;

Απορίες και συζήτηση μέσω του forum του μαθήματος στο My.CEID e-mail επικοινωνίας kik@hpclab.ceid.upatras.gr Ανακοίνωση ασκήσεων και υλικό στην ιστοσελίδα του μαθήματος http://parallel.hpclab.ceid.upatras.gr/