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

Σχετικά έγγραφα
Διεργασίες και Νήματα (2/2)

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

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

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

ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2

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

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

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

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

Εικονική Μνήμη (Virtual Μemory)

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

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

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

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

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

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

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

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

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

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

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

Πολυπύρηνοι επεξεργαστές Multicore processors

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

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

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

Κεφάλαιο 1ο Πολυπρογραμματισμός Πολυδιεργασία Κατηγορίες Λειτουργικών Συστημάτων

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

Ενσωµατωµένα Υπολογιστικά Συστήµατα (Embedded Computer Systems)

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

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

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

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

Σκοπός Μαθήματος. Λειτουργικά Συστήματα Η/Υ. Γενικές Πληροφορίες. Στόχοι Μαθήματος ΚΕΦΑΛΑΙΟ 1 - ΕΙΣΑΓΩΓΗ. Θεωρία: Εργαστήριο: Κεφάλαιο 1 «Εισαγωγή»

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

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

Εικονική Μνήμη (Virtual Μemory)

2. Σκοποί και Λειτουργίες των ΛΣ. Λειτουργικά Συστήματα Η/Υ. Περίληψη. Ι. Προστασία Υλικού ΚΕΦΑΛΑΙΟ 2 - ΕΞΕΛΙΞΗ ΚΑΙ ΣΚΟΠΟΙ ΛΣ

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

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

Οργάνωση επεξεργαστή (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαχείριση μνήμης III

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

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

Η γλώσσα προγραμματισμού C

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών Απόδοση ΚΜΕ. (Μέτρηση και τεχνικές βελτίωσης απόδοσης)

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

Διαφορές single-processor αρχιτεκτονικών και SoCs

Παράλληλα Συστήματα. Γιώργος Δημητρίου. Ενότητα 3 η : Παράλληλη Επεξεργασία. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

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

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

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

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

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

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

Εικονική Μνήμη (1/2)

i Throughput: Ο ρυθμός ολοκλήρωσης έργου σε συγκεκριμένο χρόνο

Παραλληλισμός σε επίπεδο εντολών

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

Κεντρική Μονάδα Επεξεργασίας. Επανάληψη: Απόδοση ΚΜΕ. ΚΜΕ ενός κύκλου (single-cycle) Παραλληλισμός σε επίπεδο εντολών. Υπολογιστικό σύστημα

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

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

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

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

Κεντρική Μονάδα Επεξεργασίας

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

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

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

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

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

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών Εικονική Μνήμη. (και ο ρόλος της στην ιεραρχία μνήμης)

Ιεραρχία Μνήμης. Εικονική μνήμη (virtual memory) Επεκτείνοντας την Ιεραρχία Μνήμης. Εικονική Μνήμη. Μ.Στεφανιδάκης

HY-486 Αρχές Κατανεμημένου Υπολογισμού

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

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

Κεντρική Μονάδα Επεξεργασίας (ΚΜΕ) Τμήματα ΚΜΕ (CPU) Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (Ι)

ΕΙΣΑΓΩΓΗ. Παρέχει µια διεπαφή (interface) ανάµεσα στο υλισµικό και στα προγράµµατα εφαρµογών/χρηστών.

Εισαγωγή στα Λειτουργικά συστήματα Ι. Καθηγητής Κώστας Αναγνωστόπουλος

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

Ειδικά Θέματα Προγραμματισμού

ΔΙΑΧΕΙΡΙΣΗ ΜΝΗΜΗΣ. Λειτουργικά Συστήματα Ι. Διδάσκων: Καθ. Κ. Λαμπρινουδάκης ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

Οργάνωση Υπολογιστών (Ι)

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

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

Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ. «Φέτα» ημιαγωγών (wafer) από τη διαδικασία παραγωγής ΚΜΕ

Εικονική Μνήμη (Virtual Memory)

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

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

ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

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

Υ- 01 Αρχιτεκτονική Υπολογιστών Πολυεπεξεργαστές, 2ο μέρος

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Transcript:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Διάλεξη 3 ΝΗΜΑΤΑ Οι διαφάνειες έχουν καθαρά επικουρικό χαρακτήρα στην παρουσίαση των διαλέξεων του μαθήματος. Δεν αντικαθιστούν σε καμία περίπτωση την παρακάτω βιβλιογραφία που αποτελεί και το βασικό εγχειρίδιο αναφοράς. Βιβλιογραφία: Σύγχρονα Λειτουργικά Συστήματα, A.S. Tanenbaum, 4 η έκδ., Κλειδάριθμος, 2018. Λειτουργικά Συστήματα, W. Stallings, 9 η έκδ., Τζιόλα, 2017. Λειτουργικά Συστήματα, A. Silberschatz, P. Galvin, G. Gagne, 7 η εκδ., ΙΩΝ, 2007.

Στόχοι Η διάλεξη αυτή έχει ως στόχο να εισάγει τον σπουδαστή στη δημιουργία, διαχείριση και εφαρμογή των νημάτων στα λειτουργικά συστήματα, και ειδικότερα: να γνωρίσει τη δομή και τη χρήση των νημάτων να γνωρίσει τις βασικές εντολές υλοποίησης και εφαρμογής των νημάτων να είναι σε θέση να εφαρμόσει τις παραπάνω μεθόδους υλοποίησης νημάτων για να επιλύσει προβλήματα. 2

Ενότητες Η έννοια του νήματος Πλεονεκτήματα και μειονεκτήματα χρήσης νημάτων Παράλληλη επεξεργασία Παραδείγματα χρήσης νημάτων Υλοποίηση νημάτων σε επίπεδο χρήστη και πυρήνα Μοντέλα πολλαπλών νημάτων POSIX threads και νήματα σε Windows και Linux 3

Η έννοια του νήματος Τι γίνεται αν μια λογική διεργασία χρειάζεται να υποστηρίξει παράλληλη ή «ταυτόχρονη» (εναλλασσόμενη) εκτέλεση κώδικα; Λύση: μπορεί να δημιουργηθούν πολλές διεργασίες που συνεργάζονται για τον κοινό σκοπό. Οι διεργασίες (processes) αποτελούν επιλογή παράλληλου προγραμματισμού και επεξεργασίας συνήθως σε προβλήματα με εργασίες ιδιαίτερου φόρτου (workloads) και σημαντικών απαιτήσεων σε υπολογιστική ισχύ ή/και μνήμη (π.χ. rendering or printing complicated file formats). 4

Σχηματική απεικόνιση παράλληλης επεξεργασίας με διεργασίες Πηγή εικόνας: https://computing.llnl.gov/tutorials/parallel_comp/ 5

Μειονεκτήματα χρήσης διεργασιών Επιβαρυμένου φόρτου η εναλλαγή διεργασιών (context switch overhead) Η εναλλαγή του περιβάλλοντος λειτουργίας (context switch) που θα χρειαστεί να πραγματοποιηθεί κατά την εναλλαγή των διεργασιών είναι ιδιαίτερου φόρτου (ιδιαίτερα κατά την ταυτόχρονη εκτέλεση), καθώς η διαδικασία αυτή της φόρτωσης, τερματισμού και επανεκκίνησης των διεργασιών, περιλαμβάνει αντιγραφές από και προς τη μνήμη των περιεχομένων του προγράμματος (κώδικας διεργασιών), ελέγχους μνήμης, κ.α.. Επιπρόσθετες διαδικασίες επικοινωνίας για διαμοιρασμό δεδομένων (data sharing measures and inter-process communication techniques) Οι διεργασίες κατά βάση δεν μοιράζονται πόρους π.χ. κώδικα και δεδομένα, αν και αυτό φυσικά είναι εφικτό διαμέσω κοινής/μεριζόμενης μνήμης (shared memory) και διαδιεργασιακής επικοινωνίας (inter-process communication), οπότε και απαιτούνται πρόσθετες διαδικασίες/λειτουργίες για να επιτευχθεί αποτελεσματικά. 6

Βέλτιστη λύση: Νήματα Τα νήματα (threads), ονομάζονται και ελαφρές διεργασίες (lightweight processes LWPs), αποτελούν ξεχωριστές ροές του ίδιου προγράμματος που εκτελούνται όμως μέσα σε μια λογική διεργασία. Πηγή εικόνας: www.youtube.com/watch?v=eviuwzb5hyc 7

Τα νήματα (threads) αποτελούν επιλογή παράλληλου προγραμματισμού και επεξεργασίας συνήθως σε προβλήματα με εργασίες όχι ιδιαίτερου φόρτου (lightweight tasks) δηλ. χωρίς απαιτήσεις σε υπολογιστική ισχύ ή μνήμη (π.χ. web server servicing page requests, multi-part information processing, I/O management). Τα νήματα λειτουργούν όπως και οι διεργασίες, δεν είναι όμως πραγματικά ανεξάρτητες εκτελέσεις, καθώς: μοιράζονται την ίδια μνήμη! (τον ίδιο χώρο διευθύνσεων της διεργασίας) (address space sharing) έχουν τα ίδια δικαιώματα πρόσβασης σε πόρους μοιράζονται τους ίδιους πόρους (δεδομένα, κώδικα, ανοικτά αρχεία, σήματα) (resource sharing) μοιράζονται ακόμα και τον χρόνο της ΚΜΕ που έχει δοθεί στη διεργασία 8

9

Για κάθε νήμα το ΛΣ διατηρεί στον Πίνακα Ελέγχου του Νήματος (Thread Control Block) πληροφορίες κυρίως μόνο για την ξεχωριστή κατάσταση εκτέλεσης, δηλαδή για τη στοίβα (stack και thread-specific data) του νήματος, καθώς και για τις τιμές των καταχωρητών (registers) (απαριθμητής προγράμματος (PC), κ.α.) της ΚΜΕ. Οπότε κατά την εναλλαγή νημάτων (thread switch) κατά την εκτέλεση της διεργασίας, εναλλάσσει μόνο τα παραπάνω περιεχόμενα, δηλ. ουσιαστικά της ξεχωριστής κατάστασης εκτέλεσης. 10

Πηγή εικόνας: https://randu.org/tutorials/threads/ 11

Πηγή εικόνας: https://www.javamex.com/tutorials/threads/how_threads_work.shtml 12

Πλεονεκτήματα χρήσης νημάτων Αμελητέου φόρτου η εναλλαγή νημάτων (fast thread switching) Το σύστημα δεν επιβαρύνεται κατά τις εναλλαγές νημάτων (thread switch) καθώς τα νήματα μοιράζονται σχεδόν όλους τους πόρους (program context, cpu caches) και έτσι δεν πραγματοποιείται σχεδόν καθόλου αντιγραφή μνήμης (παρά μόνο τη στοίβας του εκάστοτε νήματος). Οπότε, κατά την εναλλαγή μεταξύ νημάτων δεν πραγματοποιούνται ιδιαίτερες λειτουργίες διαχείρισης και έλεγχοι πρόσβασης της μνήμης, με αποτέλεσμα το thread switch να είναι πολύ πιο γρήγορο από το context switch. Ουσιαστικά η εναλλαγή μεταξύ νημάτων (thread switch) ισοδυναμεί στην πράξη με απλή εναλλαγή κατάστασης ΚΜΕ (register set switch) και της στοίβας του εκάστοτε νήματος, και όχι με πραγματική εναλλαγή περιβάλλοντος λειτουργίας όπως συμβαίνει με την εναλλαγή διεργασιών (context switch). 13

Γρήγορη εναλλαγή της εκτέλεσης των εργασιών (faster task-switching) Ως αποτέλεσμα της γρήγορης εναλλαγής των νημάτων έχουμε και γρηγορότερη εναλλαγή των εργασιών που εκτελούνται από τις διεργασίες. Εύκολη πρόσβαση σε κοινά δεδομένα (efficient data sharing) Τα νήματα μοιράζονται τον ίδιο χώρο διευθύνσεων της διεργασίας και τους πόρους αυτής (code, data, κ.α.), οπότε αυτό τα καθιστά βέλτιστη επιλογή για την εύκολη και αποτελεσματική πρόσβαση σε κοινά δεδομένα. 14

Μειονεκτήματα χρήσης νημάτων Προβλήματα συγχρονισμού της πρόσβασης σε κοινά δεδομένα (synchronization problems) Η πρόσβαση σε κοινά δεδομένα απαιτεί ιδιαίτερη προσοχή στη διαχείρισή της με τη χρήση πρόσθετων μεθόδων όπως locks, mutexes, κ.α., έτσι ώστε να εξασφαλιστεί η συνέπεια στην πρόσβαση στα δεδομένα από πολλαπλά νήματα (π.χ. data is not being read while written, nor written by multiple threads at the same time). Ευάλωτη εκτέλεση των νημάτων (vulnerable threads execution) Καθώς τα νήματα μοιράζονται τον ίδιο χώρο διευθύνσεων σε περίπτωση κάποιας αποτυχίας στην εκτέλεση ενός νήματος (data corruption or an access violation) ενδέχεται αυτή να επιφέρει κλιμακωτές αποτυχίες και στα υπόλοιπα. Δύσκολη απασφαλμάτωση προγραμμάτων (multi-threaded program debugging difficulties) Οι πολυνηματικές εφαρμογές παρουσιάζουν επιπρόσθετες δυσκολίες στην εύρεση και επίλυση προβλημάτων (bugs) σε αυτές. 15

Παράλληλη επεξεργασία σε επίπεδο νήματος Τα νήματα εκμεταλλεύονται την πλατφόρμα παράλληλης επεξεργασίας οπότε και εκτελούνται από το ΛΣ συνήθως στον ίδιο πυρήνα με την τεχνική της ταυτόχρονης πολυνημάτωσης (οπότε έχουμε πάντα περισσότερα threads per core), είτε ακόμα και σε διαφορετικούς πυρήνες. Η ταυτόχρονη πολυνημάτωση (Simultaneous MultiThreading, SMT ή HyperThreading) αποτελεί εναλλασσόμενη εκτέλεση πολλαπλών ανεξάρτητων νημάτων στον ίδιο πυρήνα/επεξεργαστή, εκμεταλλευόμενο το καθένα το χρόνο αδράνειας των άλλων ή των διαθέσιμων πόρων. Γενικά η εκτέλεση πολλαπλών νημάτων (multithreading) ταυτόχρονα στον ίδιο πυρήνα ή επεξεργαστή, ή παράλληλα σε διαφορετικούς πυρήνες επεξεργασίας (multicore/manycore processors) ή επεξεργαστές (multiprocessor systems) αποτελεί παραλληλισμό σε επίπεδο νήματος (Thread Level Parallelism, TLP). 16

Simultaneous MultiThreading, SMT or HyperThreading Software threads: κάθε εκτελέσιμο πρόγραμμα αποτελεί μια διεργασία (process), η οποία μπορεί να δημιουργεί ένα ή περισσότερα νήματα χρήστη (user threads). Hardware threads: κάθε πυρήνας (physical core) μπορεί να εκτελεί περισσότερα από ένα νήματα πυρήνα (hardware threads), γνωστά και ως logical cores, καθώς το OS τα βλέπει ως ξεχωριστούς λογικούς processors. Τα νήματα πυρήνα μπορούν να εκτελούνται ταυτόχρονα (SMT) στον ίδιο πυρήνα εκμεταλλευόμενο το καθένα το χρόνο αδράνειας του άλλου ή των διαθέσιμων πόρων. Π.χ. ένας επεξεργαστής με 2 φυσικούς SMT πυρήνες υποστηρίζει συνολικά 4 νήματα πυρήνα, δυο σε κάθε πυρήνα. Πηγή: C# Multithreaded and Parallel Programming, Rodney Ringler, PACKT Publishing, 2014 Πηγή: http://sd.blackball.lv/downloadfile.ashx?file=15304 Ενημερωτική προαιρετική διαφάνεια

Σχηματική απεικόνιση ταυτόχρονης επεξεργασίας με νήματα (Simultaneous MultiThreading, SMT or HyperThreading) Πηγή εικόνας: https://www.quora.com/if-my-cpu-has-4-physical-and-8-logical-cores-is-it-4-or-8-cores 18

Γενική δομή SMT αρχιτεκτονικής εκτέλεσης 4 hardware threads σε 2 core CPU Πηγή: https://mediatum.ub.tum.de/doc/1072465/1072465.pdf Ενημερωτική προαιρετική διαφάνεια

Προσεγγίσεις νημάτων Πηγή: https://a2k2.wordpress.com/category/operating-system/ http://slideplayer.com/slide/6931097/ 20

Παραδείγματα χρήσης νημάτων Επεξεργαστής κειμένου με τρία νήματα Web server με πολλαπλά νήματα 21

User Level Threads (ULTs) Kernel Level Threads (KLTs) Υλοποίηση νημάτων 22

Υλοποίηση νημάτων σε επίπεδο χρήστη (User Threads) Η διαχείριση των νημάτων γίνεται από βιβλιοθήκες που εκτελούνται σε κατάσταση χρήστη (user mode/space). Αποφεύγεται η επικοινωνία με το σύστημα/πυρήνα (δεν πραγματοποιούνται κλήσεις συστήματος). Ένα νήμα αφήνει την ΚΜΕ με κλήση της ρουτίνας εναλλαγής, με λειτουργία που προκαλεί έμμεσα εναλλαγή ή με την λήξη ενός μετρητή. Συνήθως δεν υποστηρίζεται κατανομή του χρόνου εκτέλεσης της διεργασίας στα διάφορα νήματα που έχει μέσα της. Παραδείγματα: POSIX threads pthreads, Mach C-threads, Solaris threads

Πλεονεκτήματα νημάτων χρήστη: Τα νήματα χρήστη εναλλάσσονται (θεωρητικά) γρηγορότερα από τα νήματα πυρήνα. Ωστόσο, στην πράξη, καλές υλοποιήσεις νημάτων σε επίπεδο πυρήνα (π.χ. Linux) εναλλάσσονται με συναφή απόδοση. Μειονεκτήματα νημάτων χρήστη : Ένα νήμα μπορεί να μονοπωλήσει τον χρόνο εκτέλεσης μιας διεργασίας (λιμοκτονία (starvation) των υπολοίπων νημάτων). Όταν μπλοκαριστεί ένα νήμα μέσα σε κάποια λειτουργία Ι/Ο τότε μπλοκάρονται όλα τα νήματα που εκτελούνται μέσα στην ίδια διεργασία (γιατί το ΛΣ δεν «γνωρίζει» την ύπαρξη τους). 24

Υλοποίηση νημάτων σε επίπεδο συστήματος/πυρήνα (Kernel Threads) Τα νήματα πυρήνα υλοποιούνται στον πυρήνα του ΛΣ και οι αντίστοιχες βιβλιοθήκες χρησιμοποιούν κλήσεις συστήματος. Σε αυτή την περίπτωση ο πυρήνας χρονοδρομολογεί κάθε νήμα εντός της μονάδας χρόνου που αναλογεί στην διεργασία μέσα στην οποία εκτελούνται τα νήματα. Αν και υπάρχει περισσότερος φόρτος στο σύστημα λόγω της εναλλαγής κατάστασης μεταξύ user mode και system mode, οι μετρήσεις απόδοσης δείχνουν αμελητέα αύξηση στο χρόνο. Παραδείγματα: Linux, Windows, Solaris,Tru64 UNIX

Πλεονεκτήματα νημάτων πυρήνα: Αποτροπή της μονοπώλησης της μονάδας χρόνου μιας διεργασίας από ένα νήμα (ενώ υπάρχουν και άλλα προς εκτέλεση). Το μπλοκάρισμα ενός νήματος σε Ι/Ο δεν συνεπάγεται μπλοκάρισμα και των άλλων νημάτων που εκτελούνται μέσα στην ίδια διεργασία. Μια διεργασία μπορεί να εκμεταλλευτεί (πιο εύκολα) τη συμμετρική πολυεπεξεργασία του ΛΣ και να τρέχει γρηγορότερα με κάθε ΚΜΕ που προστίθεται στο σύστημα. Μειονεκτήματα νημάτων πυρήνα: Ταχύτητα εναλλαγής νημάτων 26

Μεικτές εφαρμογές (Hybrid implementations) Πολυπλεξία νημάτων επιπέδου χρήστη σε νήματα επιπέδου-πυρήνα 27

Μοντέλα πολλαπλών νημάτων (Multithreading Models) Ανάλογα με το αν το ΛΣ υποστηρίζει νήματα σε επίπεδο πυρήνα αλλά και το πως αυτά αντιστοιχίζονται σε νήματα επιπέδου χρήστη, υπάρχουν διάφορες προσεγγίσεις υλοποίησης: Πολλά σε Ένα (Many-to-One) Πολλά νήματα επιπέδου χρήστη αντιστοιχούν σε ένα νήμα πυρήνα. Χρησιμοποιείται σε συστήματα που δεν υποστηρίζουν νήματα πυρήνα. Ένα προς Ένα (One-to-One) Κάθε νήμα χρήστη αντιστοιχεί σε ένα νήμα πυρήνα. Πολλά προς Πολλά (Many-to-Many) Επιτρέπει σε πολλά νήματα χρήστη να αντιστοιχιστούν σε πολλά νήματα πυρήνα. Επιτρέπει στο ΛΣ να δημιουργήσει επαρκή αριθμό νημάτων πυρήνα. 28

29

Pthreads (POSIX Threads) Το POSIX (Portable Operating System UnIX) είναι αποτέλεσμα της προσπάθειας της IEEE (IEEE πρότυπο 1003.1c) να δημιουργήσει ένα πρότυπο στα Λειτουργικά Συστήματα Unix (και συμβατά ). POSIX API (application interface) εμπεριέχει βιβλιοθήκες όπως για τη δημιουργία και συγχρονισμό νημάτων σε περιβάλλον Unix και POSIX συμβατά, κ.α.. To API προσδιορίζει τους τύπους (types), τις επικεφαλίδες των εντολών/συναρτήσεων (interfaces), και την συμπεριφορά των εντολών/συναρτήσεων της αντίστοιχης βιβλιοθήκης. Η υλοποίηση της βιβλιοθήκης εναπόκειται στο ΛΣ. 30

POSIX κλήσεις για διαχείριση νημάτων 31

Νήματα στα Windows Υποστηρίζουν τα Win32/Win64 και POSIX APIs. Εφαρμογές που ακολουθούν το πρότυπο POSIX μπορούν να εκτελούνται χωρίς να αλλάζει ο πηγαίος κώδικας. Υλοποιούν την αντιστοίχιση νημάτων χρήστη-πυρήνα «ένα προς ένα» Τα νήματα (threads) μπορούν να δημιουργηθούν με την κλήση CreateThread. Κάθε νήμα περιέχει: ένα thread id ένα σύνολο από καταχωρητές (register set) ξεχωριστές στοίβες για το χρήστη και τον πυρήνα ιδιωτικό χώρο αποθήκευσης δεδομένων 32

33 The POSIX subsystem is designed to run POSIX applications following the POSIX standard which is based on the UNIX model.

Νήματα στο Linux (Linux Threads) Η δημιουργία νημάτων σε επίπεδο πυρήνα γίνεται μέσω της κλήσης συστήματος clone(), με σύνταξη: int clone(int (*fn) (void *), void *childstack, int flags, void *arg) fn(), η ρουτίνα που εκτελεί το νήμα μόλις δημιουργείται, μετά την επιστροφή της οποίας τερματίζει childstack, δείκτης ο οποίος καθορίζει τη θέση της στοίβας που χρησιμοποιείται από το νήμα (καθώς μοιράζεται τη μνήμη με την καλούμενη διεργασία ή πατρική δεν είναι δυνατό να εκτελείται χρησιμοποιώντας την ίδια στοίβα) flags, παράμετροι της clone (για λεπτομέρειες χρήση της εντολής man) arg, η (τυχόν) παράμετρος που δίνεται στην fn() συνάρτηση H δημιουργία νημάτων σε επίπεδο χρήστη γίνεται μέσω της κλήσης της βιβλιοθήκης pthread pthread_create(), με σύνταξη: int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg); start_routine(), η ρουτίνα που εκτελεί το νήμα μόλις δημιουργείται Όταν είναι επιτυχής επιστρέφει ένα thread id του νέου νήματος στη thread, και την τιμή 0 στην καλούμενη διεργασία. Αλλιώς, σε περίπτωση σφάλματος επιστρέφεται μη μηδενική τιμή. Εάν η παράμετρος attr είναι NULL τότε χρησιμοποιούνται οι εξορισμού τιμές (default attributes). arg, η (τυχόν) παράμετρος που δίνεται στην start_routine() 34

/* Παράδειγμα δημιουργίας νήματος */ Μεταγλώττιση προγράμματος: gcc -o name name.c -lpthread */ #include <stdio.h> #include <pthread.h> #include <errno.h> void *start_routine(void *arg) { printf( Το νέο νήμα δημιουργήθηκε και αυτή είναι η ρουτίνα που εκτελεί\n ); return NULL; /* ή pthread-exit(); */ } void main(){ int retval; pthread_t thread; retval = pthread_create(&thread, NULL, start_routine, NULL); /* Δημιουργία νήματος */ if (retval==0) printf( Επιτυχής δημιουργία νήματος\n ); else { printf( Σφάλμα στη δημιουργία νήματος, %d\n,errno); abort(); } } 35

Νήματα στην Java Τα νήματα στη Java μπορούν να δημιουργηθούν μέσω: Επέκτασης του Thread class Υλοποίησης της διεπαφής Runnable Την διαχείριση των νημάτων στη Java αναλαμβάνει η JVM Κατάσταση νημάτων στην Java: 36

Προσεγγίσεις πολυνηματισμού Fine-grained ή Interleaved multithreading (cycle by cycle) Coarse-grained multithreading ή Blocked multithreading (multitasking) Simultaneous multithreading (SMT) (Hyperthreading) Ενημερωτική προαιρετική διαφάνεια

Fine-grained ή Interleaved multithreading (cycle by cycle) Η μονάδα επεξεργασίας διαχειρίζεται δυο ή περισσότερα νήματα ταυτόχρονα, πραγματοποιώντας την εναλλαγή της εκτέλεσης μεταξύ τους σε κάθε κύκλο (thread switch at each clock cycle), οπότε δεν υπάρχουν δυο συνεχόμενες εντολές του ίδιου νήματος στην ίδια διοχέτευση. Εάν κάποιο νήμα είναι μπλοκαρισμένο (blocked) εξαιτίας εξαρτήσεων των δεδομένων ή καθυστερήσεις της μνήμης, τότε αυτό το νήμα παραλείπεται και συνεχίζει με την εκτέλεση ενός έτοιμου (ready) νήματος. Time division multiplexing (TDM)-approach that switches from one thread to another on each instruction issued. Single scalar Σε κάθε κύκλο μια εντολή από κάθε νήμα. Ενημερωτική προαιρετική διαφάνεια Παράδειγμα εκτέλεσης 4 νημάτων Superscalar Σε κάθε κύκλο όσο το δυνατόν περισσότερες εντολές από κάθε νήμα.

Coarse-grained multithreading ή Blocked multithreading (multitasking) Οι εντολές ενός νήματος εκτελούνται διαδοχικά έως ότου συμβεί ένα γεγονός το οποίο προκαλεί καθυστέρηση, όπως η αστοχία της κρυφής μνήμης (cache miss) και καθυστερήσεις μνήμης (load latencies), διακλαδώσεις και εξαρτήσεις μεταξύ εντολών (branching and dependencies between instructions). Σε αυτή την περίπτωση, το νήμα μπλοκάρεται (blocked) και έτσι κάνει την εναλλαγή μεταβαίνοντας στην εκτέλεση άλλου νήματος. Δεν είναι τόσο δίκαιη μέθοδος δρομολόγησης νημάτων καθώς ένα νήμα ενδέχεται να μονοπωλήσει τη μονάδα επεξεργασίας για αρκετό χρόνο εάν τυγχάνει να βρίσκει όλα του τα δεδομένα άμεσα στη κρυφή μνήμη. Single scalar Σε κάθε κύκλο μια εντολή από κάθε νήμα και συνεχίζονται έως ότου ολοκληρώσει ή μπλοκαριστεί. Ενημερωτική προαιρετική διαφάνεια Superscalar Σε κάθε κύκλο όσο το δυνατόν περισσότερες εντολές από κάθε νήμα.

Simultaneous multithreading (SMT) (Hyperthreading) Εντολές από πολλαπλά νήματα εκτελούνται ταυτόχρονα στον ίδιο κύκλο (instructions issued concurrently from different threads) στις λειτουργικές μονάδες εκτέλεσης του ίδιου πυρήνα ή υπερβαθμωτού επεξεργαστή. Η προσέγγιση αυτή είναι πιο δύσκολη στην εφαρμογή της καθώς περισσότερα από ένα νήματα μπορεί να είναι ενεργά σε κάθε φάση της διοχέτευσης σε κάθε κύκλο, το οποίο περιπλέκει τις μεθόδους προστασίας της μνήμης κ.α.. Ένας SMT επεξεργαστής χρησιμοποιεί ένα physical processor core ως δυο ή περισσότερους logical processors (hardware threads) στο σύστημα. Όμως την κάθε χρονική στιγμή μόνο ένα hardware thread σε κάθε physical processor core μπορεί να εκτελεί μια εντολή (software instruction) (όσο το άλλο περιμένει). Ενημερωτική προαιρετική διαφάνεια

Στόχος του SMT είναι να γεμίσουν τα ενδεχόμενα κενά (empty bubbles) στις διοχετεύσεις με χρήσιμες εντολές, όχι όμως με εντολές από παρακάτω στον ίδιο κώδικα (το οποίο είναι και δύσκολο να προσδιοριστεί), αλλά με εντολές από άλλα νήματα που εκτελούνται την ίδια χρονική στιγμή, όλα στον ίδιο πυρήνα. Με αυτόν τον τρόπο ένας SMT επεξεργαστής εμφανίζεται στο σύστημα σαν να αποτελείται από ξεχωριστούς processors (multi-processor system) ή ξεχωριστούς πυρήνες (multi-core processor/system). bubbles Πηγή εικόνας: http://slideplayer.com/slide/9241784/ Ενημερωτική προαιρετική διαφάνεια

Βέβαια ένα πραγματικό multi-processor system εκτελεί πράγματι πολλαπλά νήματα παράλληλα στο χρόνο, αλλά μόνο ένα σε κάθε processor. Το ίδιο ισχύει και για ένα multi-core processor/system (ή Chip Multiprocessor, CMP), με δυο ή περισσότερους πυρήνες σε κάθε chip. Σε αυτές τις περιπτώσεις συνήθως οι σχεδιάσεις των πυρήνων αποτελούν SMT πυρήνες, κάνοντας ακόμα πιο αποτελεσματικό το σύστημα. Παράδειγμα: Οι πυρήνες της σειράς επεξεργαστών Intel Core i series αποτελούν 2-thread SMT. Δηλ. ένας dual-core Core i processor αποτελεί ένα 4-thread chip (2 threads/core x 2 cores/chip => 4 threads/chip). Ενημερωτική προαιρετική διαφάνεια

Παράδειγμα SMT: ένα νήμα εκτελεί επεξεργασία με ακέραιους αριθμούς όσο ένα άλλο περιμένει για μια πράξη κινητής υποδιαστολής για να ολοκληρωθεί, και αντιστρόφως. SMT processor: 2 threads can run concurrently Multicore processor: 2 threads can run on separate cores Single integer and floating point units Multiple cores, multiple integer and floating point units Πηγή: http://www.slideshare.net/piyushmittalin/multi-corearchitecture Ενημερωτική προαιρετική διαφάνεια

SMT Dual-core processor: all 4 threads can run concurrently Πηγή: http://www.slideshare.net/piyushmittalin/multi-corearchitecture Ενημερωτική προαιρετική διαφάνεια

Υλοποίηση SMT επεξεργαστή Η υλοποίηση ενός SMT επεξεργαστή απαιτεί τον διπλασιασμό όλων των τμημάτων του επεξεργαστή που αποθηκεύουν την κατάσταση εκτέλεσης (architectural ή execution ή thread state) του κάθε νήματος. Π.χ. τον program counter, τους ορατούς καταχωρητές της αρχιτεκτονικής (architecturally-visible registers) αλλά όχι τους rename registers (register files), τις απεικονίσεις μνήμης (memory mappings) στην TLB, κ.α.). Αυτά τα τμήματα αποτελούν ένα μικρό σύνολο από όλο το υλικό του επεξεργαστή. Στο μεγαλύτερο σύνολό τους και τα πιο σύνθετα τμήματα τα μοιράζονται όλα τα νήματα (π.χ. decoders, schedulers και dispatch logic, register files, functional/execution units/resources, caches). Πηγή: http://www.lighterra.com/papers/modernmicroprocessors/ Πηγή εικόνας: www.neogaf.com/forum/showthread.php?t=1265421 Ενημερωτική προαιρετική διαφάνεια

Επιπλέον, ξεχωριστά για κάθε νήμα, ο επεξεργαστής πρέπει να διατηρεί πληροφορίες (Thread Control Block) για το ποιες εντολές και προσωρινά δεδομένα (stack information) καθώς και ποιοι rename registers (saved registers) ανήκουν σε κάθε νήμα την κάθε χρονική στιγμή, χωρίς όμως αυτό να προσθέτει ιδιαίτερη πολυπλοκότητα στα κυκλώματα ελέγχου του πυρήνα (core logic). Πηγή: http://www.lighterra.com/papers/modernmicroprocessors/ Πηγή εικόνας: http://slideplayer.com/slide/6502627/ Συνολικά, αν και ο διπλασιασμός αυτός απαιτεί επιπλέον περίπου 10% core logic, όμως ο επεξεργαστής μπορεί να εκτελεί πολλαπλά νήματα ταυτόχρονα, με καλύτερη χρήση των λειτουργικών μονάδων, με αύξηση του αριθμού των εντολών ανά κύκλο, και καλύτερη συνολική απόδοση. Ενημερωτική προαιρετική διαφάνεια

Πηγή εικόνας: http://slideplayer.com/slide/8097470/ Ενημερωτική προαιρετική διαφάνεια

Ερωτήσεις Περιγράψτε τα πλεονεκτήματα της χρήσης πολλαπλών νημάτων έναντι της χρήσης πολλαπλών διεργασιών, και τα μειονεκτήματα των διεργασιών. Περιγράψτε τα στοιχεία που έχει ξεχωριστά κάθε νήμα καθώς και εκείνα που μοιράζονται όλα τα νήματα σε μια διεργασία. Περιγράψτε την εναλλαγή μεταξύ νημάτων (thread switch), σε σχέση με την εναλλαγή διεργασιών (context switch), και γιατί η εναλλαγή μεταξύ νημάτων είναι πιο γρήγορη; Περιγράψτε την υλοποίηση νημάτων σε επίπεδο χρήστη (user threads) και σε επίπεδο πυρήνα (kernel threads), καθώς και τα αντίστοιχα πλεονεκτήματα και μειονεκτήματα. Ποια τα μοντέλα πολλαπλών νημάτων που υποστηρίζονται από τα διάφορα συστήματα; 48