17.Ο κύκλος ζωής μιας αίτησης Εισόδου/Εξόδου

            Ο προσομοιωτής αυτός περιγράφει το κύκλο ζωής ενός αιτήματος για Είσοδο/Έξοδο (Input/Output – IO).

·         Αρχικά, μια διεργασία καλεί την κλήση συστήματος (system call) read() στο file descriptor ενός αρχείου που έχει ανοιχτεί προηγουμένως

·         Ο κώδικας του system call στον πυρήνα του λειτουργικού ελέγχει την ορθότητα των παραμέτρων της εντολής. Στην περίπτωση εισόδου, αν τα δεδομένα είναι ήδη διαθέσιμα στον buffer cache, επιστρέφονται στη διεργασία και η αίτηση I/O ολοκληρώνεται

·         Διαφορετικά, χρειάζεται να εκτελεστεί μια φυσική I/O, έτσι η διεργασία αφαιρείται από την ουρά εκτέλεσης και τοποθετείται στην ουρά για τη συσκευή, και δρομολογείται η αίτηση I/O. Τελικά, το υποσύστημα Ι/Ο στέλνει την αίτηση στον οδηγό (driver) της συσκευής. Ανάλογα με το λειτουργικό σύστημα, η αίτηση στέλνεται μέσω μιας κλήσης υπορουτίνας ή με ένα μήνυμα στον πυρήνα.

·         Ο οδηγός της συσκευής δεσμεύει χώρο στον πυρήνα για τη λήψη δεδομένων  και δρομολογεί την I/O. Τελικά, ο οδηγός στέλνει εντολές στον ελεγκτή της συσκευής (device controller) γράφοντας στους καταχωρητές ελέγχου της συσκευής.

·         Ο ελεγκτής της συσκευής λειτουργεί το υλικό της συσκευής για τη μεταφορά των δεδομένων.

·         Ο οδηγός μπορεί να περιμένει για την παραλαβή των δεδομένων ή μπορεί να έχει ορίσει μια μεταφορά DMA στην μνήμη του πυρήνα. Υποθέτουμε ότι η μεταφορά γίνεται μέσω του ελεγκτή DMΑ, ο οποίος παράγει ένα Interrupt όταν η μεταφορά ολοκληρωθεί.

·         Ο χειριστής του interrupt δέχεται το σήμα, αποθηκεύει τα απαραίτητα δεδομένα και στη συνέχεια ενημερώνει με σήμα τον οδηγό της συσκευής και επιστρέφει από το Interrupt.

·         Ο οδηγός της συσκευής δέχεται το σήμα, βρίσκει ποια αίτηση I/O έχει ολοκληρωθεί, επίσης βρίσκει ποια είναι η κατάσταση της αίτησης και στέλνει στη συνέχεια σήμα στον υποσύστημα I/O του πυρήνα ότι η αίτηση έχει ολοκληρωθεί.

·         Ο πυρήνας μεταφέρει τα δεδομένα ή  τους κωδικούς της κατάστασης της αίτησης I/O στην διεύθυνση μνήμης της αιτούμενης διεργασίας και επαναφέρει τη διεργασία από την ουρά αναμονής (wait queue) πίσω στη ουρά “ready” ώστε να συνεχιστεί η εκτέλεσή της.

·         Η μεταφορά της διεργασίας στην ουρά “ready” ξεμπλοκάρει τη διεργασία. Όταν ο χρονοδρομολογητής θέσει την διεργασία στη CPU, η διεργασία συνεχίζει την εκτέλεση του system call.