Κλήση συστήματος: Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
JohnMad (συζήτηση | συνεισφορές)
JohnMad (συζήτηση | συνεισφορές)
μΧωρίς σύνοψη επεξεργασίας
Γραμμή 1:
Στην [[επιστήμη υπολογιστών]] '''κλήσεις συστήματος''' ονομάζεται ένα σύνολο υπηρεσιών που παρέχει μέσω μίας προτυποποιημένης [[API|προγραμματιστικής διασύνδεσης]] ο [[πυρήνας (υπολογιστές)|πυρήνας]] του [[λειτουργικό σύστημα|λειτουργικού συστήματος]]. Κανονικά ο κώδικας των εκτελούμενων [[πρόγραμμα|προγραμμάτων]] («κώδικας χρήστη») δεν έχει άμεση πρόσβαση στον πυρήνα, αλλά χάρη στις κλήσεις συστήματος που αυτός εξάγει, τα προγράμματα χρήστη μπορούν να καλούν με ελεγχόμενο τρόπο [[διαδικασία (υπολογιστές) | διαδικασίες]] που παρέχουν υπηρεσίες στον καλούντα. Η σύνταξη, η σημασιολογία και η ονοματολογία των κλήσεων συστήματος διαφέρει από ΛΣ σε ΛΣ, με αποτέλεσμα ένα [[εκτελέσιμο (υπολογιστές)|εκτελέσιμο]] πρόγραμμα συνήθως να μπορεί να τρέξει μόνο σε ένα ΛΣ. Ο κώδικας χρήστη δεν μπορεί να προσπελάσει μόνος του τους πόρους του [[ηλεκτρονικός υπολογιστής|υπολογιστή]] (π.χ. [[σκληρός δίσκος|δίσκους]], [[μνήμη υπολογιστή|μνήμη]] συστήματος, [[περιφερειακές συσκευές]], [[δίκτυο υπολογιστών|δίκτυο]] κλπ), αλλά μπορεί να ζητήσει ό,τι χρειάζεται (π.χ. άνοιγμα ενός [[αρχείο υπολογιστή|αρχείου]] στον δίσκο) από τον πυρήνα μέσω των κλήσεων συστήματος.
 
Συνήθως οι [[γλώσσα προγραμματισμού|γλώσσες προγραμματισμού]] παρέχουν προτυποποιημένες βιβλιοθήκες που αποκρύπτουν αυτήν τη διαδικασία από τον προγραμματιστή και παρέχουν φορητότητα κώδικα από ΛΣ σε ΛΣ. Π.χ. η απλή συνάρτηση <code>fopen()</code> της πρότυπης βιβλιοθήκης της [[C (γλώσσα προγραμματισμού)|γλώσσας C]], με κοινή σύνταξη για όλες τις [[αρχιτεκτονική υπολογιστή|αρχιτεκτονικές]] και λειτουργικά συστήματα αλλά με διαφορετική υλοποίηση για το καθένα, όταν κληθεί καλεί με τη σειρά της την αντίστοιχη κλήση συστήματος - κατά κανόνα πιο πολύπλοκη - που παρέχει το υποκείμενο ΛΣ. Ο κώδικας που υλοποιεί τις κλήσεις συστήματος είναι ουσιαστικά τμήμα του πυρήνα, οπότε η <code>fopen()</code> του συγκεκριμένου παραδείγματος ζητά μετάβαση του επεξεργαστή σε «κατάσταση πυρήνα», κατά την οποία μπορούν να εκτελεστούν εντολές με άμεση επίδραση στο υλικό και τους πόρους του υπολογιστή, και μεταφέρει τον έλεγχο στον κώδικα της κλήσης συστήματος. Όταν ο τελευταίος τερματίσει ο επεξεργαστής μεταβαίνει πάλι σε «κατάσταση χρήστη» και η <code>fopen()</code> συνεχίζει την εκτέλεσή της από την εντολή που ακολουθεί την κλήση συστήματος. Φυσικά τα προγράμματα χρήστη μπορούν να παρακάμψουν την <code>fopen()</code> και να καλέσουν κατευθείαν τον πυρήνα, κάτι που γίνεται αναγκαστικά όταν η βιβλιοθήκη της γλώσσας προγραμματισμού δεν παρέχει υψηλού επιπέδου διασύνδεση (όπως την <code>fopen()</code>) για κάποια λειτουργία.
 
Κάθε φορά που μία [[διεργασία (υπολογιστές)|διεργασία]] καλεί μία κλήση συστήματος το ΛΣ εκτελεί έναν έλεγχο ώστε να επιβεβαιώσει ότι πράγματι η διεργασία αυτή έχει δικαίωμα να εκτελέσει τη συγκεκριμένη πράξη στον συγκεκριμένο πόρο (π.χ. ανάγνωση αρχείου). Τα δικαιώματα πρόσβασης των διαφορετικών χρηστών του συστήματος (άρα και των διεργασιών που αυτοί δημιουργούν μέσω των προγραμμάτων που εκτελούν), διατηρούνται από το ΛΣ σε κατάλληλες [[δομή δεδομένων|δομές δεδομένων]]. Οι κλήσεις συστήματος διαχειρίζονται τους ίδιους πόρους για λογαριασμό διαφορετικών διεργασιών, με αποτέλεσμα να προσπελαύνουν και να τροποποιούν κατά τη λειτουργία τους τις ίδιες εσωτερικές δομές δεδομένων του πυρήνα. Το λειτουργικό σύστημα αναλαμβάνει να [[αμοιβαίος αποκλεισμός|συντονίσει]] τις κλήσεις συστήματος που εκτελούνται από κάθε διεργασία ώστε να μην προξενούνται προβλήματα. Ακόμη, ο [[χρονοπρογραμματιστής]] του πυρήνα επιβλέπει κάθε κλήση συστήματος, αφού πολλές από αυτές οδηγούν σε αναστολή της καλούσας διεργασίας μέχρι να απελευθερωθεί κάποιος πόρος ή να ικανοποιηθεί κάποια άλλη συνθήκη.