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



Σχετικά έγγραφα
Ε-85: Ειδικά Θέµατα Λογισµικού

ΠΛΕ-006 ΠΑΡΑΛΛΗΛΗ ΕΠΕΞΕΡΓΑΣΙΑ Project

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

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

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

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

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

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

Περίληψη. Υπερυπολογιστές. Υπολογιστικά προβλήµατα. TOP 500 (Ιούνιος 2007) TOP 500 (Ιούνιος 2009) Ε-85: Ειδικά Θέµατα Λογισµικού

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

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

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

Νήµατα. ιεργασίες και νήµατα Υλοποίηση νηµάτων Ελαφριές διεργασίες Αξιοποίηση νηµάτων. Κατανεµηµένα Συστήµατα 10-1

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

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

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

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

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

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

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

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

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

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

Νήµατα. Πολύ σηµαντικό

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

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

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

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

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

Ο βασικός παράγοντας είναι ο χρόνος αξιοποίησης του επεξεργαστή Ελάχιστος αριθµός πράξεων και όχι µακρόχρονες αιτήσεις Ε/Ε

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

ιεργασίες και Επεξεργαστές στα Κατανεµηµένων Συστηµάτων

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

Λ10 Παράλληλος & Κατανεμημένος Προγραμματισμός Μάθημα 5 ο & 6 ο 19 & 24/11/2009

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

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

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

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

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

Εισαγωγή. E-03: Λειτουργικά Συστήµατα ΙΙ 6. Εαρινό Εξάµηνο SUN RPC. Κλήση Αποµακρυσµένων ιαδικασιών (RPC) Σύνδεση: Port Mapper.

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

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

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

Βασικές Έννοιες Πρ Ταο υγρ τόα χ μ ρ μ ο α ν τισμ ος Π ό ρ ςο ΙΙΙ γραμματισμός 1

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

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΣυγχρονισµόςσεΣυστήµατα ΠολλαπλώνΝηµάτων

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

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

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

Υλοποίηση Σηματοφόρων

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

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

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Επιτεύγµατα των Λ.Σ.

(programming interfaceή/και application programming interface API).

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 6 C & Assembly

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

ΧΡΟΝΟΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Μεθόδων Επίλυσης Προβλημάτων

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Λειτουργικά συστήματα πραγματικού χρόνου

Συγχρονισµός: Αδιέξοδο & Παρατεταµένη Στέρηση

Η πολυνηματική γλώσσα προγραμματισμού Cilk

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Transcript:

Ε-85: Ειδικά Θέµατα Λογισµικού Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων Χειµερινό Εξάµηνο 2009-10 «Νήµατα Επιπέδου Χρήστη» Κατηγορίες Νηµάτων Υπάρχουν δύο κατηγορίες νηµάτων Νήµατα επιπέδου πυρήνα (kernel level threads) Νήµατα επιπέδου χρήστη (user level threads) Η διαφορά τους βρίσκεται στο κατά πόσο το ίδιο το λειτουργικό γνωρίζει την ύπαρξη νηµάτων ή όχι Παναγιώτης Χατζηδούκας (Π.Δ. 407/80) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 1 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 2 Νήµατα Επιπέδου Πυρήνα Τασύγχρονα λειτουργικά συστήµατα προσφέρουν τη δυνατότητα δηµιουργίας νηµάτων επιπέδου πυρήνα (kernel-level threads) Ο πυρήνας διαχωρίζει την έννοια της διεργασίας από τα νήµατα ιεργασία: οι πόροι που χρειάζεται ένα πρόγραµµα για να εκτελεστεί Νήµατα: κατάσταση εκτέλεσης της διεργασίας Ένα πρόγραµµα αποτελείται από µία διεργασία και από ένα ή περισσότερα νήµατα επιπέδου πυρήνα Το λειτουργικό σύστηµα προσφέρει µια επιπλέον κλήση συστήµατος για τη δηµιουργία ενός νέου νήµατος επιπέδου πυρήνα στα πλαίσια µιας διεργασίας Τα νήµατα επιπέδου πυρήνα είναι οντότητες αναγνωρίσιµες από το λειτουργικό σύστηµα Ο χρονοπρογραµµατιστής του λειτουργικού αναθέτει τα νήµατα στους φυσικούς επεξεργαστές για να εκτελεστούν Νήµατα Επιπέδου Πυρήνα Ηδηµιουργία, καταστροφή και διαχείριση των νηµάτων επιπέδου πυρήνα απαιτεί τη χρήση κατάλληλων κλήσεων συστήµατος Υψηλός κόστος λόγω της µετάβαση του επεξεργαστή από το επίπεδο χρήστη στο επίπεδο πυρήνα Κάποιες εφαρµογές απαιτούν χρήση µεγάλου αριθµού νηµάτων Εκµετάλλευση λεπτά καταµερισµένου παραλληλισµού (fine-grained parallelism) Εκτέλεση εµφωλευµένων (nested) βρόχων παραλληλισµού Καλύτερη εξισορρόπηση φορτίου Αξιοποίηση αναδροµικών αλγορίθµων Επικάλυψη υπολογισµών µε επικοινωνία Το κόστος δηµιουργίας διαχείρισης των νηµάτων επιπέδου πυρήνα υπερκαλύπτει το όφελος χρήσης τους E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 3 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 4 Νήµατα Επιπέδου Χρήστη Εναλλακτικήπροσέγγιση: δηµιουργία νηµάτων στο επίπεδο χρήστη Τα νήµατα αποτελούνται από ένα περιγραφέα (descriptor) που περιέχει Τις τιµές των καταχωρητών του νήµατος (registers) Μια περιοχή µνήµης που χρησιµοποιείται ως στοίβα (stack) Επιπλέον πεδία που χρησιµοποιούνται από τη βιβλιοθήκη νηµάτων για διαχειριστικούς λόγους Τα νήµατα επιπέδου χρήστη είναι οντότητες µη αναγνωρίσιµες από το λειτουργικό σύστηµα ηµιουργούνται, διαχειρίζονται, χρονοδροµολογούνται και καταστρέφονται αποκλειστικά από κατάλληλη βιβλιοθήκη επιπέδου χρήστη Νήµατα Επιπέδου Χρήστη Γιακάθε εργασία που µπορεί να εκτελεστεί παράλληλα δηµιουργείται ένα νήµα επιπέδου χρήστη Το νήµα αυτό εκτελείται από κάποιο νήµα επιπέδου πυρήνα Τα νήµατα επιπέδου πυρήνα λειτουργούν ως ιδεατοί επεξεργαστές (virtual processors) οι οποίοι εκτελούν νήµατα επιπέδου χρήστη Αντίστοιχα οι φυσικοί επεξεργαστές εκτελούν νήµατα επιπέδου πυρήνα Εποµένως η δηµιουργία και εκτέλεση πολλών νηµάτων επιπέδου χρήστη µε ένα νήµα επιπέδου πυρήνα δεν σηµαίνει παράλληλη εκτέλεση Τα νήµατα επιπέδου χρήστη θα εκτελεστούν σε έναν φυσικό επεξεργαστή E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 5 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 6 1

Βασικές Ιδιότητες Νήµατα επιπέδου πυρήνα Υψηλός κόστος: οι πράξεις νηµάτων είναι κλήσεις συστήµατος ροµολόγηση από το λειτουργικό σύστηµα Εκµετάλλευση πολλών επεξεργαστών Αν ένα νήµα µπλοκάρει, τα υπόλοιπα νήµατα συνεχίζουν την εκτέλεση τους Νήµατα επιπέδου χρήστη Χαµηλό κόστος: οι πράξεις νηµάτων είναι απλές κλήσεις συναρτήσεων ροµολόγηση από τη βιβλιοθήκη, στο χρόνο εκτέλεσης της διεργασίας εν εκµεταλλεύονται πολλαπλούς επεξεργαστές Αν ένα νήµα µπλοκάρει, τότε µπλοκάρει όλη η διεργασία Κατηγορίες δροµολόγησης Χωρίς προεκχώρηση: µε ελεγχόµενη εναλλαγή (π.χ. yield) Με προεκχώρηση: αυτόµατη εναλλαγή, π.χ. µε κάποιον timer Μοντέλα Υλοποίησης Νηµάτων Μοντέλο ένα-προς-ένα (1:1) Κάθε νήµα της διεργασίας αντιστοιχεί σε ένα νήµα επιπέδου πυρήνα Μοντέλο πολλά-προς-ένα (Μ:1) Κάθε νήµα της διεργασίας αντιστοιχεί σε ένα νήµα επιπέδου χρήστη Υπάρχει ένα νήµα επιπέδου πυρήνα που λειτουργεί ως ιδεατός επεξεργαστής (virtual processor) Μοντέλο πολλά-προς-πολλά (Μ:Ν) Υβριδικό µοντέλο: Κάθε νήµα της διεργασίας αντιστοιχεί σε ένα νήµα επιπέδου χρήστη Υπάρχουν πολλαπλοί ιδεατοί επεξεργαστές E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 7 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 8 Νήµατα ύο Επιπέδων Πλεονεκτήµατα Εκµετάλλευση πολλαπλών επεξεργαστών του συστήµατος Η διεργασία µπλοκάρει αν µπλοκάρουν Ν νήµατα Χαµηλό κόστος διαχείρισης νηµάτων επιπέδου χρήστη ηµιουργία συγκεκριµένου πλήθους νηµάτων επιπέδου πυρήνα Ίσος µε τον πραγµατικό επιθυµητό παραλληλισµό Τα νήµατα αυτά (ιδεατοί επεξεργαστές) διατηρούνται καθ όλη τη διάρκεια εκτέλεσης του προγράµµατος Τερµατίζουν όταν τελειώσει όλο το πρόγραµµα ροµολόγηση δύο επιπέδων Λειτουργικό σύστηµα ιδεατοί επεξεργαστές Βιβλιοθήκη νηµάτων νήµατα χρήστη ηµιουργία νηµάτων επιπέδου χρήστη: όσα είναι απαραίτητα για να εκφραστεί ο παραλληλισµός της εφαρµογής Νήµα 1 Νήµα 2 Νήµα 3 Νήµα 4 Απεικόνιση ένα-προς-ένα (1:1) Πυρήνα 1 Πυρήνα 2 Πυρήνα 3 Πυρήνα 4 CPU 1 CPU 2 Heap Data Code E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 9 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 10 Απεικόνιση πολλά-προς-ένα (Μ:1) Απεικόνιση πολλά-προς-πολλά (Μ:Ν) Νήµα 1 Νήµα 2 Νήµα 3 Νήµα 4 Πυρήνα 1 CPU 1 CPU 2 Heap Data Code Νήµα 1 Νήµα 2 Νήµα 3 Νήµα 4 Πυρήνα 1 Πυρήνα 2 CPU 1 CPU 2 Heap Data Code E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 11 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 12 2

Παραδείγµατα Υλοποιήσεων Επιπέδου πυρήνα POSIX Threads σε Linux, Solaris, Windows Win32 Threads Επιπέδου χρήστη GNU Pth Windows fibers Υβριδικό µοντέλο POSIX Threads σε AIX (IBM), HPUX PM2 Marcel threads PSthreads Βιβλιοθήκη PSthreads Παρέχει µη προεκχωρήσιµα νήµατα επιπέδου χρήστη Μη προεκχωρήσιµα (non preemptive): Ένα νήµα δεν µπορεί να ξεκινήσει την εκτέλεσή του όσο το προηγούµενο νήµα δεν έχει τερµατίσει ή δεν έχει παραχωρήσει εθελοντικά τον επεξεργαστή του Ο χρονοπρογραµµατιστής νηµάτων επιπέδου χρήστη καλείται µόνο σε συγκεκριµένα σηµεία του κώδικα της βιβλιοθήκηςκαι όχι σε τυχαίες χρονικές στιγµές µε χρήση κάποιου timer ιαθεσιµότητα http://cs.uoi.gr/~ompi/download.html#psthreads E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 13 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 14 Οργάνωση ιεπαφή Παρέχειπαρόµοιο API (Application Programming Interface) µε τα POSIX threads εν παρέχει όλες τις λειτουργίες του προτύπου αφού είναι ειδικού σκοπού Παρέχει υποστήριξη χρόνου εκτέλεσης στον OMPi OpenMP C compiler E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 15 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 16 Αρχικοποίηση Bιβλιοθήκης int psthread_init(int nvps, unsigned long stacksize) Καλείται στην αρχή κάθε προγράµµατος, πριν κληθεί οποιαδήποτε άλλη συνάρτηση της βιβλιοθήκης Αρχικοποιεί τις εσωτερικές δοµές δεδοµένων και δηµιουργεί τα νήµατα επιπέδου πυρήνα που θα χρησιµοποιηθούν κατά την εκτέλεση Το πλήθος των νηµάτων επιπέδου πυρήνα καθορίζεται από την παράµετρο nvps Η παράµετρος stacksizeκαθορίζει το µέγεθος της στοίβας των νηµάτων Επιστρέφει 0 για επιτυχία, EAGAIN αν αποτύχει π.χ. αδυναµία δέσµευσης απαιτούµενων πόρων ιαχείριση Νηµάτων psthread_t: τύπος δεδοµένων που περιγράφει νήµα επιπέδου χρήστη psthread_attr_t: καθορισµός αν ένα νήµα θα δηµιουργηθεί αποδεσµευµένο ή όχι PSTHREAD_JOINABLE, PSTHREAD_DETACHED E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 17 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 18 3

ηµιουργία νήµατος int psthread_create(psthread_t *thr, psthread_attr_t *attr, void (func)(void *), void *arg) ηµιουργεί ένα νέο νήµα επιπέδου χρήστη Το νήµα αρχίζει την εκτέλεσή του από τη συνάρτηση func έχεται ως µοναδικό όρισµα τον δείκτη arg εν επιστρέφει τίποτα Η εκτέλεση του νήµατος τελειώνει όταν αυτό επιστρέφει από την ρουτίνα του ή καλέσει τη συνάρτηση psthread_exit() Αν επιτύχει, ο περιγραφέας του νήµατος αποθηκεύεται στην διεύθυνση που υποδεικνύει η παράµετρος thr και επιστρέφεται 0 Σε περίπτωση αποτυχίας η συνάρτηση επιστρέφει EAGAIN Εισαγωγή σε Ουρά Εκτέλεσης int psthread_enqueue(psthread_t thr, int queue) int psthread_enqueue_head(psthread_t thr, int queue) int psthread_enqueue_tail(psthread_t thr, int queue) Τοποθετεί ένα νήµα σε µία ουρά εκτέλεσης Αν queue == -1, εισάγεται σε µια κεντρική ουρά ιαφορετικά εισάγεται στην τοπική ουρά του ιδεατού επεξεργαστή Σε περίπτωση αποτυχίας η συνάρτηση επιστρέφει EINVAL E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 19 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 20 void psthread_exit (void) Τερµατισµός Νήµατος Η συνάρτηση αυτή τερµατίζει την εκτέλεση του νήµατος που την καλεί Οι εσωτερικές δοµές δεδοµένων που διατηρεί η βιβλιοθήκη για το νήµα αυτό ελευθερώνονται αν το νήµα ήταν αποδεσµευµένο Εσωτερικά υπάρχει µηχανισµός ανακύκλωσης των δοµών Η συνάρτηση δεν επιστρέφει ποτέ void psthread_waitall (void) Αναµονή Νηµάτων Η συνάρτηση αυτή αναστέλλει την εκτέλεση του νήµατος µέχρι να τερµατίσουν όλα τα νήµατα-παιδιά του που δεν είναι αποδεσµευµένα Αν δεν υπάρχουν παιδιά, η κλήση επιστρέφει άµεσα µε τιµή 1. Αν το νήµα µπλοκάρει, η κλήση θα επιστρέψει 0 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 21 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 22 Απελευθέρωση Ιδεατού Επεξεργαστή void psthread_yield (void) Καλώντας την συνάρτηση αυτή ένα νήµα παραχωρεί εθελοντικά τον επεξεργαστήτου στην βιβλιοθήκη νηµάτων η οποία αναλαµβάνει να εκτελέσει ένα άλλο νήµαστην θέση του προηγούµενου Το νήµα που παραχώρησε τον επεξεργαστή συνεχίζει την εκτέλεσή του από το σηµείο που σταµάτησε, όταν επιλεγεί πάλι από τον χρονοπρογραµµατιστή της βιβλιοθήκης Βοηθητικές Συναρτήσεις psthread_t psthread_self (void):επιστρέφει τον περιγραφέα του νήµατος που την κάλεσε psthread_t psthread_nvps (void):επιστρέφει τον αριθµό των ιδεατών επεξεργαστών psthread_t psthread_current_vp (void):επιστρέφει τον αριθµό του υποκείµενου ιδεατού επεξεργαστή psthread_time_t psthread_gettime(void):επιστρέφει το χρόνο σε sec void psthread_vp_sleep (int msec):αναστέλλει την εκτέλεση του ιδεατού επεξεργαστή για msec milliseconds E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 23 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 24 4

Αµοιβαίος Αποκλεισµός Τα κλειδιά λειτουργούν σε νήµατα επίπεδου πυρήνα Εσωτερικά αντιστοιχούν σε κλειδιά των νηµάτων του προτύπου POSIX (mutexes, spinlocks) void psthread_lock_t void psthread_lock_init(psthread_lock_t *lock_var) void psthread_lock_acquire(psthread_lock_t *lock_var) int psthread_lock_try_acquire(psthread_lock_t *lock_var) void psthread_lock_release(psthread_lock_t *lock_var) void psthread_lock_destroy (psthread_lock_t *lock_var) Μεταβλητές Συνθήκης void psthread_cond_t void psthread_cond_init(psthread_cond_t *cond) void psthread_cond_wait(psthread_cond_t *cond, psthread_lock_t *lock) void psthread_cond_signal(psthread_cond_t *cond) void psthread_cond_broadcast(psthread_cond_t *cond) void psthread_cond_destroy(psthread_cond_t *cond) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 25 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 26 Φράγµατα Εκτέλεσης void psthread_barrier_t int psthread_barrier_init(psthread_barrier_t *cond, int count) int psthread_barrier_wait(psthread_barrier_t *bar) int psthread_barrier_destroy(psthread_barrier_t *bar) Ιδιωτικά εδοµένα void psthread_key_t int psthread_key_create(psthread_key_t *key, void *dummy) int psthread_key_setspecific(psthread_key_t *key, const void *value) void *psthread_key_getspecific(psthread_key_t *key) int psthread_key_destroy(psthread_key_t *key) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 27 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 28 Εγκατάσταση Βιβλιοθήκης Μετην εντολή configure επιλέγετε τις ιδιότητες της βιβλιοθήκης καθώς και που θα γίνει η εγκατάσταση Μετά εκτελείτε make και make install Επιλογές Αρχιτεκτονική ουρών εκτέλεσης Υποστήριξη κλοπής εργασίας από αποµακρυσµένες ουρές Συµπεριφορά αδρανών ιδεατών επεξεργαστών Μερικές ειδικές επιλογές Μέγιστος αριθµών ιδεατών επεξεργαστών Μέθοδος συγχρονισµού Τρόπος διαχείρισης νηµάτων #include <psthread.h> static psthread_t maintid; static int count=0; psthread_lock_t lock; Παράδειγµα (1/3) void mythread(void *arg) int t= (int)arg; printf("thread %p, arg=%d\n",psthread_self(),t); psthread_vp_sleep(100); psthread_lock_acquire(&lock); count++; psthread_lock_release(&lock); printf("thread %p finished\n", psthread_self()); psthread_exit(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 29 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 30 5

Παράδειγµα (2/3) #define USER_LEVEL_THREADS 256 #define VIRTUAL_PROCESSORS 4 int main(int argc, char *argv[]) psthread_time_t t0, t1; psthread_t tid[user_level_threads]; psthread_init(virtual_processors, 0); maintid= psthread_self(); printf("main thread=%p\n", maintid); psthread_lock_init(&lock); t0 = psthread_gettime(); for (i = 0; i < USER_LEVEL_THREADS; i++) psthread_create(&tid[i], mythread,(void *)i,-1); psthread_enqueue(tid[i], -1); Παράδειγµα (3/3) /*for (i = 0; i < USER_LEVEL_THREADS; i++) psthread_join(tid[i]); printf("tid %p joined\n",tid[i]); */ psthread_waitall(); t1 = psthread_gettime(); printf("main finished. count=%d\n",count); printf("elapsed Time =%f seconds\n",t1 - t0); psthread_lock_destroy(&lock); return(0); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 31 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 32 ιαχείριση Νηµάτων Υλοποίηση σε επίπεδο χρήστη Βασικά στοιχεία νήµατος Στοίβα (stack) Καταχωρητές (registers) Βασικές λειτουργίες ηµιουργία (δέσµευση στοίβας, αρχικοποίηση καταχωρητών) Εναλλαγή περιεχοµένου Μέθοδοι υλοποίησης setjmp/longjmp ucontext_t operations (makecontext, swapcontext) assembly fibers (Windows) #include <setjmp.h> jmp_buf context; int setjmp(jmp_buf env); setjmp - longjmp Αποθηκεύει το context ενός νήµατος στον buffer env και επιστρέφει 0 Το νήµα, όταν αποκατασταθεί το context του (από τη longjmp()), θα συνεχίσει την εκτέλεσή του από το ίδιο σηµείο. Τότε η setjmp() επιστρέφει την τιµή του ορίσµατος val της longjmp() void longjmp(jmp_buf env, int val); Αποκαθιστά το context του νήµατος που έχει αποθηκευτεί στον buffer env από προηγούµενη κλήση της setjmp() Αν val==0 τότε η setjmp επιστρέφει 1 Αν val!=0 τότε η setjmp επιστρέφει val E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 33 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 34 #include <setjmp.h> main() jmp_buf env; i = setjmp(env); printf("i = %d\n", i); if (i!= 0) exit(0); setjmp - longjmp longjmp(env, 2); printf("νever reached...\n"); setjmp - longjmp Εναλλαγή από old_thread σε new_thread switch(old_thread, new_thread) if (!setjmp(old_thread->context)) longjmp(new_thread->context, 1); /* δεν επιστρέφει ποτέ εδώ*/ /* εδώ θα επιστρέψει η εκτέλεση του οld_thread µετά από µία κλήση της συνάρτησης longjmp(old_thread->context, 1); */ old_thread_work(); E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 35 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 36 6

makecontext -swapcontext #include <ucontext.h> ucontext_t context; Πεδία δοµής: sigset_t uc_sigmask: Σήµατα που είναι µπλοκαρισµένα όσο το συγκεκριµένο context είναι ενεργό stack_t uc_stack: Η στοίβα που χρησιµοποιείται από το context mcontext_t uc_mcontext: αναπαράσταση ενός context που έχει σωθεί Κλήσεις int getcontext(ucontext_t *ucp); int setcontext(const ucontext_t *ucp); void makecontext(ucontext_t *ucp, (void *f)(),int argc,...); int swapcontext(ucontext_t *oucp, const ucontext_t *ucp); makecontext -swapcontext #include <ucontext.h> ucontext_t auc,buc,mainuc; void a() printf("a"); swapcontext(&auc, &buc); /* switch to thread B */ printf("\nswitching to main\n"); swapcontext(&auc, &mainuc); /* switch to main thread */ void b() printf("b"); swapcontext(&buc, &auc); /* switch to thread A */ E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 37 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 38 makecontext -swapcontext int main(void) printf("start\n"); /* main thread starts */ /* Set up context for thread A */ getcontext(&auc); auc.uc_stack.ss_size = 16 * 1024; auc.uc_stack.ss_sp = malloc(auc.uc_stack.ss_size); makecontext(&auc, a, 0); /* Set up context for thread B */ getcontext(&buc); buc.uc_stack.ss_size = 16 * 1024; buc.uc_stack.ss_sp = malloc(buc.uc_stack.ss_size); makecontext(&buc, b, 0); /* Switch to A */ getcontext(&mainuc); /* Save the context of main thread */ swapcontext(&mainuc, &auc); /* Switch to thread A */ printf("done\n"); /* Execution control returned to main thread */ return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 39 UthLib Βιβλιοθήκηπου παρέχει τις βασικές λειτουργίες νηµάτων επιπέδου χρήστη Χρησιµοποιείται για την δηµιουργία πολυνηµατικών συστηµάτων χρόνου εκτέλεσης Η PSthreads χρησιµοποιεί την UthLib Βασικές Κλήσεις typedef void *uth_t; uth_t uth_create(void (*start)(void *arg), void *arg): ηµιουργία νήµατος void uth_switchto(uth_t old, uth_t next): Μεταφορά ελέγχου εκτέλεσης (εναλλαγή) από το τρέχον (old) στο επόµενο (next) uth_t uth_self(void): Αυτοπροσδιορισµός νήµατος void uth_delete(uth_t t): Καταστροφή νήµατος (απελευθέρωση πόρων ή τοποθέτηση σε ουρά ανακύκλωσης) E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 40 #include <uth.h> uth_t auc,buc,mainuc; void a(void *arg) UthLib printf("a"); uth_switchto(auc, buc); /* switch to thread B */ printf( \nswitching to main\n"); uth_switchto(auc, mainuc); /* switch to main thread */ void b(void *arg) printf("b"); uth_switchto(buc, auc); /* switch to thread A */ UthLib int main(void) printf("start\n"); /* main thread starts */ uth_init(0); uth_vp_init(0,0); /* Set up context for thread A */ auc = uth_create(a, 0); /* Set up context for thread B */ buc = uth_create(b, 0); /* Switch to A */ mainuc = uth_self(); uth_switchto(mainuc, auc); /* Switch to thread A */ printf("done\n"); /* Execution control returned to main thread */ return 0; E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 41 E-85: Ε.Θ.Λ: Προγραµµατισµός Συστηµάτων Υψηλών Επιδόσεων 42 7