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

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