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



Σχετικά έγγραφα
Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

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

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

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

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

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

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

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

Α. 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

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

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

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

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

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

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

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

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

Κεφάλαιο 3.1: Λειτουργικά Συστήματα. Επιστήμη ΗΥ Κεφ. 3.1 Καραμαούνας Πολύκαρπος

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

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

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

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

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

3.1 Λειτουργικό Σύστηµα. Λειτουργικό Σύστηµα (2) ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα. Ο υπολογιστής σαν σκέτο hardware έχει περιορισµένη χρησιµότητα

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

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

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

Κεφάλαιο 10 ο Υποπρογράµµατα

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

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

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

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

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

Εικονική Μνήµη. Κεφάλαιο 8. Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

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

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

Διάλεξη 18η: Διαχείρηση Αρχείων

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

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

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

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

Λειτουργικά Συστήματα Πραγματικού Χρόνου

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

Κύριες Υπηρεσίες ενός ΛΣ

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

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

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

Το Πρόβληµα Οµοφωνίας Σύγχρονα Συστήµατα Μεταβίβασης Μηνύµατος Μοντέλο Κατάρρευσης (crash model) Οι διεργασίες µπορούν να σταµατούν να εκτελούνται σε

ροµολόγηση Επεξεργαστή

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

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Χρονοπρογραμματισμός Εργαστηριακές Ασκήσεις

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

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

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

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

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

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

Transcript:

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

Η έννοια της διεργασίας ιεργασία (process) είναι ο µηχανισµός εκτέλεσης ενός προγράµµατος σε ένα λειτουργικό σύστηµα. Η διεργασία είναι µια ενεργή οντότητα, µέσω της οποίας εκτελείται ένα πρόγραµµα (το πρόγραµµα είναι απλά µια σειρά από εντολές και δεν αποτελεί µια διεργασία). Κάθε διεργασία εκτελεί ένα µοναδικό πρόγραµµα. Το ίδιο πρόγραµµα µπορεί να εκτελείται από πολλές διεργασίες (µε διαφορετικές ταχύτητες). Η εκτέλεση µιας διεργασίας γίνεται σειριακά, αλλά το λειτουργικό µπορεί όµως να εκτελεί πολλές διεργασίες ταυτόχρονα. Προγραµµατισµός ΙΙΙ 2 lalis@inf.uth.gr

Καταστάσεις διεργασίας new: H διεργασία είναι υπό δηµιουργία/αρχικοποίηση. running: Η διεργασία εκτελείται σε κάποιον επεξεργαστή. waiting: Η διεργασία αναµένει (απενεργοποιηµένη) κάποιο συµβάν. ready: Η διεργασία αναµένει να τις δοθεί (από το ΛΣ) σε κάποιον επεξεργαστή για την συνέχιση της εκτέλεσης της. terminated: Η διεργασία έχει ολοκληρώσει την εκτέλεση της. Προγραµµατισµός ΙΙΙ 3 lalis@inf.uth.gr

Μεταβολές κατάστασης running -> waiting -> ready: Μια διεργασία αλλάζει την κατάσταση της από running σε waiting συνήθως όταν περιµένει να τις δοθεί κάποιος πόρος που δεν είναι διαθέσιµος και πρέπει να ελευθερωθεί. Όταν δοθεί στην διεργασια ο πόρος που ζητήθηκε, η κατάσταση της διεργασίας αλλάζει σε ready. running -> ready: Μια διεργασία αλλάζει την κατάσταση της από running σε ready συνήθως όταν η εκτέλεση της διακόπτεται για να συνεχίσει η εκτέλεση µιας άλλης διεργασίας (ή και κατά την κλήση συστήµατος). ready -> running: Μια διεργασία αλλάζει την κατάσταση της από ready σε running όταν της δοθεί ο επεξεργαστής για να συνεχίσει την εκτέλεση της. Προγραµµατισµός ΙΙΙ 4 lalis@inf.uth.gr

Αναπαράσταση ταυτόχρονης εκτέλεσης µε έναν επεξεργαστή και πλεκτή ροή διεργασιών running P1 ready waiting running P2 ready waiting running P3 ready waiting Προγραµµατισµός ΙΙΙ 5 lalis@inf.uth.gr

Εναλλαγή λειτουγίας Όταν ο επεξεργαστής ανατίθεται σε µια νέα διεργασία για να συνεχίσει την εκτέλεση της, το σύστηµα πρέπει να σώσει την κατάσταση της τρέχουσας διεργασίας (που εκτελείται εκείνη την στιγµή) και να φορτώσει την κατάσταση της νέας διεργασίας προς εκτέλεση. Αυτό ονοµάζεται εναλλαγή περιβάλλοντος λειτουργίας (context switch). O χρόνος που απαιτείται για την εκτέλεση της λειτουργίας αυτής είναι «κόστος» (overhead) για το σύστηµα, το οποίο όσο ασχολείται µε την εναλλαγή δεν εκτελεί εντολές από τα προγράµµατα των διεργασιών. Ο χρόνος της εναλλαγής εξαρτάται κυρίως από: (α) την πολυπλοκότητα του λειτουργικού συστήµατος, (β) την υποστήριξη από το υλικό (επεξεργαστής και διαχείριση µνήµης). Προγραµµατισµός ΙΙΙ 6 lalis@inf.uth.gr

ιεργασίες και µνήµη Οι διεργασίες δεν έχουν κοινή µνήµη, και κάθε διεργασία διαθέτει ξεχωριστό χώρο στον οποίο µόνο αυτή έχει πρόσβαση. Αυτό εγγυάται πως µιας διεργασία δεν θα αλλιώσει τα δεδοµένα µιας άλλης διεργασίας - επίτηδες ή κατά λάθος. Ο µόνος τρόπος για δύο διεργασίες να ανταλλάξουν δεδοµένα είναι µέσα από ελεγχόµενους µηχανισµούς επικοινωνίας του συστήµατος. Μερικά συστήµατα (όπως το Linux) υποστηρίζουν διαθέτουν ειδικές διεργασίες που µοιράζονται την ίδια µνήµη µεταξύ τους - ονοµάζονται ελαφρές διεργασίες (lightweight processes). Ο προγραµµατισµός µε ελαφρές διεργασίες γίνεται είτε απ ευθείας είτε µέσω pthreads - το τελευταίο είναι προτιµώτερο γιατί εξασφαλίζει µεταφερσιµότητα (portability) του προγράµµατος σε άλλα συστήµατα. Προγραµµατισµός ΙΙΙ 7 lalis@inf.uth.gr

ιεργασίες και λειτουργικό σύστηµα προστατευτικός «τοίχος» διεργασία Pi διεργασία Pk διεργασία Pj Λειτουργικό σύστηµα λειτουργίες ΛΣ Προγραµµατισµός ΙΙΙ 8 lalis@inf.uth.gr

Γιατί νήµατα αφού υπάρχουν οι διεργασίες; Η δηµιουργία ενός νήµατος είναι συνήθως πιο γρήγορη από την δηµιουργία µιας διεργασίας. Η εναλλαγή µεταξύ νηµάτων είναι πιο γρήγορη από την εναλλαγή µεταξύ διεργασιών - εξαρτάται πάρα πολύ από την υλοποίηση. Οι διεργασίες συνήθως φέρνουν επιπρόσθετο µακροχρόνιο κόστος, π.χ. λιγότερο αποδοτική χρήση κρυφής µνήµης, κλπ. - εξαρτάται πάρα πολύ από την υλοποίηση του λειτουργικού συστήµατος. Τα νήµατα διαθέτουν «από κατασκευής» κοινή µνήµη και άρα η µεταξύ τους επικοινωνία είναι πολύ πιο γρήγορη απ ότι η χρήση κλήσεων συστήµατος (βλέπε αργότερα) για την επικοινωνία µεταξύ διεργασιών. Παρατήρηση: και οι διεργασίες µπορεί να έχουν κοινή µνήµη, αλλά αυτό απαιτεί επιπρόσθετο και πιο πολύπλοκο προγραµµατισµό. Προγραµµατισµός ΙΙΙ 9 lalis@inf.uth.gr

Υλοποίηση νηµάτων σε επίπεδο χρήστη User level threads (π.χ. Unix): Το λειτουργικό δεν γνωρίζει την ύπαρξη νηµάτων. Οι πράξεις σε επίπεδο νηµάτων είναι πολύ γρήγορες (ουσιαστικά τοπικκές κλήσεις διαδικασίας) αφού δεν απαιτούν κλήσεις συστήµατος. Μπορεί να γίνει ξεχωριστός (και προσδιορισµένος από την εφαρµογή) χρονοπρογραµµατισµός για τα νήµατα µιας διεργασίας. Τα νήµατα χρονοπρογραµµατίζονται µέσα από την διεργασία, και άρα καταναλώνουν χρόνο της διεργασίας (όχι των άλλων διεργασιών). Μπορεί να υποστηριχθεί µεγαλύτερος αριθµός νηµάτων. εν µπορεί να γίνει (εύκολα) εκµετάλλευση πολυεπεξεργαστών. Αν µπλοκάρει ένα νήµα σε κλήση συστήµατος, µπλοκάρει η διεργασία. Προγραµµατισµός ΙΙΙ 10 lalis@inf.uth.gr

Αναπαράσταση user level threads διεργασία διεργασία νήµα νήµα νήµα νήµα νήµα νήµα βιβλιοθήκη νηµάτων βιβλιοθήκη νηµάτων Σύστηµα (kernel) διεργασία διεργασία Προγραµµατισµός ΙΙΙ 11 lalis@inf.uth.gr

Υλοποίηση νηµάτων σε επίπεδο συστήµατος Kernel level threads (π.χ. Linux): Το λειτουργικό γνωρίζει την ύπαρξη νηµάτων - ουσιαστικά κάθε νήµα είναι µια ειδική (ελαφριά) διεργασία. Οι πράξεις νηµάτων είναι στην ουσία κλήσεις συστήµατος. Μπορεί να γίνει παράλληλη εκτέλεση σε πολλούς επεξεργαστές. Μπορεί να γίνει συνολικός χρονοπρογραµµατισµός. Όσο περισσότερα νήµατα έχει µια διεργασία, στην ουσία τόσο περισσότερο ποσοστό του χρόνου του επεξεργαστή λαµβάνει, πιθανότητα σε βάρος άλλων διεργασιών (εξαρτάται από το σύστηµα). Όταν ένα νήµα µπλοκάρεται σε κάποια κλήση συστήµατος, τα υπόλοιπα νήµατα που εκετελούνται «µέσα» στην ίδια διεργασία συνεχίζουν την εκτέλεση τους. Προγραµµατισµός ΙΙΙ 12 lalis@inf.uth.gr

Αναπαράσταση system level threads διεργασία διεργασία νήµα νήµα νήµα νήµα νήµα νήµα Σύστηµα (kernel) νήµα νήµα νήµα νήµα νήµα νήµα νήµα (διεργασίας) νήµα (διεργασίας) Προγραµµατισµός ΙΙΙ 13 lalis@inf.uth.gr

Χρονοπρογραµµατισµός νηµάτων Non-preemptive: Ένα νήµα εκτελείται µέχρι να πραγµατοποιήσει κλήση συγχρονισµού σε επίπεδο νηµάτων, οπότε δίνεται έλεγχος στο επόµενο νήµα. Πολύ απλή υλοποίηση. Κατάλληλο όπου δεν χρειάζεται επεξεργασία σε πραγµατικό χρόνο. Ένα νήµα µπορεί να µονοπωλήσει τον χρόνο. Μόνο σε user level threads. Preemptive: Η εναλλαγή µεταξύ διαφορετικών νηµάτων γίνεται µε διακοπή (χωρίς τον έλεγχο του προγραµµατιστή που υλοποιεί το νήµα). Κανένα νήµα δεν µπορεί να µονοπωλήσει τον χρόνο. Υπάρχει δυνατότητα εκµετάλλευσης πολλών επεξεργαστών. Σε user level threads η εναλλαγή υλοποιείται µέσω της βιβλιοθήκης, ενώ σε system level threads από το ίδιο το λειτουργικό σύστηµα. Προγραµµατισµός ΙΙΙ 14 lalis@inf.uth.gr

Συνδυασµός από user και kernel level threads Ιεραρχικά νήµατα (π.χ. Solaris-2). Κάθε διεργασία δηµιουργεί νήµατα σε επίπεδο συστήµατος, και σε κάθε τέτοιο νήµα µπορεί να απεικονισθούν περισσότερα νήµατα σε επίπεδο χρήστη. Το σύστηµα χρονοπρογραµµατίζει τα νήµατα συστήµατος, ενώ η εφαρµογή χρονοπρογραµµατίζει τα νήµατα χρήστη. υνατότητα ο αλγόριθµος χρονοπρογραµµατισµού νηµάτων σε επίπεδο συστήµατος να επεκταθεί, µέσω πολιτικών χρονοπρογραµµατισµού που προσδιορίζει η εφαρµογή. Υπάρχουν πρωτότυπα συστήµατα, όπου το λειτουργικό ειδοποιεί την εφαρµογή για διάφορα γεγονότα έτσι ώστε να µπορεί να γίνει καλύτερη εκµετάλλευση των πόρων, σύµφωνα µε την λογική της εφαρµογής. Προγραµµατισµός ΙΙΙ 15 lalis@inf.uth.gr

Αναπαράσταση συνδυασµένης προσέγγισης διεργασία διεργασία νήµα νήµα νήµα νήµα νήµα νήµα Σύστηµα (kernel) νήµα νήµα νήµα νήµα (διεργασίας) νήµα (διεργασίας) Προγραµµατισµός ΙΙΙ 16 lalis@inf.uth.gr

Αλληλεπίδραση σε ένα ιεραρχικό σύστηµα ιεργασία (process) - new thread needed - available thread idle - got new thread - thread preempted - thread blocked - thread unblocked Σύστηµα (kernel) Προγραµµατισµός ΙΙΙ 17 lalis@inf.uth.gr

Κλήσεις συστήµατος Προγραµµατισµός ΙΙΙ 18 lalis@inf.uth.gr

Κλήσεις συστήµατος Το λειτουργικό σύστηµα δεν δίνει στις διεργασίες απ ευθείας πρόσβαση σε κρίσιµους πόρους όπως µνήµη, επεξεργαστή, δίσκο, άλλες συσκευές. Η διεργασία λαµβάνει πόρους και επικοινωνεί µε τις διάφορες συσκευές µέσω ειδικών διαδικασιών που ονοµάζονται κλήσεις συστήµατος. Οι κλήσεις συστήµατος υλοποιούνται ως διακοπές λογισµικού (software interrupts) και έχουν σαν αποτέλεσµα την άµεση κλήση από ειδικά τµήµατα κώδικα του λειτουργικού συστήµατος (που είναι ασφαλή και έµπιστα και έχουν πρόσβαση σε όλους του πόρους του συστήµατος). Ο προγραµµατιστής συνήθως δεν «βλέπει» τις πραγµατικές κλήσεις συστήµατος αλλά χρησιµοποιεί «καπάκια» (wrappers) που έχουν την οικεία µορφή µιας συνάρτησης σε C. Αυτά τα «καπάκια» δίνονται συνήθως σε µορφή βιβλιοθήκης. Προγραµµατισµός ΙΙΙ 19 lalis@inf.uth.gr

ιεργασίες, λειτουργικό και κλήσεις συστήµατος διεργασία Pi svc n διεργασία Pk διεργασία Pj svc m Λειτουργικό σύστηµα κώδικας κλήσης #n µνήµη / συσκευές κώδικας κλήσης #m Προγραµµατισµός ΙΙΙ 20 lalis@inf.uth.gr

Κλήσεις συστήµατος (συνέχεια) Οι κλήσεις συστήµατος δέχονται σαν παράµετρο δεδοµένα µεγέθους long και συνήθως περιορισµένο αριθµό (6 σε i386). Κάθε κλήση συστήµατος επιστρέφει ένα αποτέλεσµα: < 0 σηµαίνει αποτυχία = 0 εξαρτάται από την κλήση συστήµατος!!! > 0 σηµαίνει επιτυχία Η επιτυχία / αποτυχία κλήσης συστήµατος πρέπει να ελέγχεται! Σε περίπτωση αποτυχίας, ο κωδικός λάθους (οι περισσότεροι κωδικοί λάθους ορίζονται στο αρχείο errno.h) αποθηκεύεται στην καθολική µεταβλητή errno και έχει ισχύ µέχρι την επόµενη κλήση συστήµατος. Το µήνυµα που αντιστοιχεί σε κωδικό λάθους επιτρέφει η strerror, και απ ευθείας εκτύπωση του µηνύµατος γίνεται µε την perror. Προγραµµατισµός ΙΙΙ 21 lalis@inf.uth.gr

Βασικές λειτουργίες διεργασιών Προγραµµατισµός ΙΙΙ 22 lalis@inf.uth.gr

ηµιουργία νέας διεργασίας Μια διεργασία µπορεί ανά πάσα στιγµή να δηµιουργήσει µια νέα διεργασία. Η διεργασία που δηµιουργεί µια διεργασία ονοµάζεται γονιός (parent) ενώ η νέα διεργασία που δηµιουργήθηκε ονοµάζεται παιδί (child). Ένα παιδί µπορεί µε την σειρά του να κάνει δικά του παιδιά κλπ, δηµιουργώντας ένα γεννεαλογικό δέντρο. Κάθε νέα διεργασία ανταγωνίζεται µε τις υπόλοιπες διεργασίες για όλους τους πόρους του συστήµατος (µνήµη, επεξεργαστής, δίσκος). Συνήθως κάθε νέα διεργασία αποκτά δική της ξεχωριστή µνήµη καθώς και ξεχωριστά αντίγραφα πρόσβασης σε πόρους που τυχόν χρησιµοποιεί η διεργασία γονιός! Προγραµµατισµός ΙΙΙ 23 lalis@inf.uth.gr

ηµιουργία νέας διεργασίας Η fork δηµιουργεί νέες διεργασίες, που εκτελούν το ίδιο πρόγραµµα µε την διεργασία γονιό, και µάλιστα αρχίζοντας από το σηµείο που κλήθηκε η fork. Ο µόνος τρόπος να εξακριβώσει κανείς αν βρίσκεται στην διεργασία γονιό ή παιδί είναι το αποτέλεσµα που επιστρέφει η fork (0=παιδί). int main(int argc, char *argv[]) { int ret; } printf( creating new process\n ); ret=fork(); if (!ret) { printf( hi from the child\n ); exit(0); } printf( hi from the parent\n ); Προγραµµατισµός ΙΙΙ 24 lalis@inf.uth.gr

Αναπαράσταση δηµιουργίας νέας διεργασίας κώδικας προγράµµατος Α διεργασία γονιός διεργασία παιδί fork Η διεργασία παιδί εκτελεί το ίδιο πρόγραµµα µε την διεργασία γονιό αλλά µε διαφορετικά αντίγραφα δεδοµένων/µεταβλητών Προγραµµατισµός ΙΙΙ 25 lalis@inf.uth.gr

Αναµονή περάτωσης διεργασίας Η wait χρησιµοποιείται για αναµονή του τερµατισµού µιας (οποιαδήποτε) διεργασίας παιδιού, µέσω της οποίας µπορεί να διαβαστεί η τιµή που επέστρεψε η αντίστοιχη main() της διεργασίας. int main(int argc, char *argv[]) { int ret; } printf( creating new process\n ); if (!fork()) { printf( hi from the child\n ); return(5); } wait(&ret); printf( child terminated with code %d\n,ret); printf( hi from the parent\n ); Υπάρχουν «εκδόσεις» της wait (όπως waitpid, wait4 κλπ), όπου µπορεί να προσδιοριστεί η διεργασία της οποίας αναµένεται ο τερµατισµός καθώς και να γίνουν διάφορες άλλες επιλογές. Προγραµµατισµός ΙΙΙ 26 lalis@inf.uth.gr

Εκτέλεση νέου προγράµµατος Η execv χρησιµοποιείται για την αντικατάσταση του προγράµµατος που εκτελεί µια διεργασία - καλείται συνήθως αµέσως µετά την fork. Η execv εκτελεί ένα νεό πρόγραµµα δίνοντας παράλληλα και τα ορίσµατα που αυτό αναµένει (ανάλογα µε το πως ζητούµε την εκτέλεση ενός προγράµµατος από την γραµµή εντολών). int main(int argc, char *argv[]) { printf( executing %s\n,argv[1]); if (!fork()) { execv(argv[1],argv[2]); /* we should never reach this point! */ perror( execv ); exit(1); } } Υπάρχουν πολλές εκδόσεις της execv (όπως execve, execvp κλπ) µε λίγο διαφορετική λειτουργικότητα. Προγραµµατισµός ΙΙΙ 27 lalis@inf.uth.gr

Αναπαράσταση δηµιουργίας νέας διεργασίας και εκτέλεσης νέου προγράµµατος κώδικας προγράµµατος Α κώδικας προγράµµατος Β διεργασία γονιός διεργασία παιδί fork execv Η διεργασία παιδί «πετά» τον παλιό κώδικα και τον αντικαθιστά µε ένα νέο πρόγραµµα, που µπορεί να είναι διαφορετικό από αυτό που εκτελεί η διεργασία γονιός Προγραµµατισµός ΙΙΙ 28 lalis@inf.uth.gr

Οµάδες διεργασιών Για λόγους διαχείρισης είναι χρήσιµο πολλές διαφορετικές διεργασίες να οµαδοποιούνται, π.χ. έτσι ώστε κάποιες λειτουργίες να γίνονται για όλες τις διεργασίας που ανήκουν σε µια οµάδα. Μια διεργασία µπορεί να αλλάξει την οµάδα στην οποία βρίσκεται καθώς και την οµάδα των παιδιών της. Μια διεργασία προστίθεται σε µια οµάδα µε την κλήση setpgid(pid,gid) όπου δίνονται ο αριθµός της διεργασίας καθώς και ο αριθµός της οµάδας. Μια νέα οµάδα δηµιουργείται µε την κλήση setpgid(pid,0) όπου η διεργασία που πραγµατοποιεί την κλήση γίνεται αυτόµατα µέλος της νεάς οµάδας που έχει σαν αριθµό τον αριθµό της διεργασίας. Παρόµοια οµαδοποίησης υποστηρίζεται και µέσω των session groups. Προγραµµατισµός ΙΙΙ 29 lalis@inf.uth.gr

Συνεργαζόµενες διεργασίες Οι ανεξάρτητες διεργασίες (independent processes) δεν επηρεάζουν ούτε επηρεάζονται (άµεσα) από την εκτέλεση άλλων διεργασιών. Οι συνεργαζόµενες διεργασίες (cooperating processes) επηρεάζουν την εκτέλεση τους µέσω κατάλληλης επικοινωνίας. Κύριοι λόγοι για την δηµιουργία συνεργαζόµενων διεργασιών: ιαχείριση κοινής πληροφορίας Επιτάχυνση υπολογισµών ιαχωρισµός κώδικα σε ξεχωριστά τµήµατα Οι συνεργαζόµενες διεργασίες επικοινωνούν µεταξύ τους µε: Σήµατα Αρχεία, σωλήνες Ανταλλαγή µηνυµάτων Κοινή µνήµη Προγραµµατισµός ΙΙΙ 30 lalis@inf.uth.gr