Διαδιεργασιακή επικοινωνία
Διαδιεργασιακή επικοινωνία (αγγλ.: InterProcess Communication, IPC) ονομάζεται στην πληροφορική ένα σύνολο μηχανισμών που παρέχουν τα λειτουργικά συστήματα των ηλεκτρονικών υπολογιστών, οι οποίοι διευκολύνουν την ανταλλαγή δεδομένων και τον συγχρονισμό μεταξύ ταυτοχρόνως εκτελούμενων διεργασιών μέσω δομών δεδομένων του πυρήνα. Τέτοιοι μηχανισμοί είναι απαραίτητοι στα μοντέρνα λειτουργικά συστήματα όπου, χάρη στον μηχανισμό της εικονικής μνήμης, κάθε διεργασία έχει τον δικό της ιδιωτικό χώρο εικονικών διευθύνσεων στον οποίον έχει πρόσβαση μόνο αυτή και ο πυρήνας. Προκειμένου να υπάρχει μία στοιχειώδης προστασία μνήμης μεταξύ διαφορετικών διεργασιών, καμία διεργασία δεν έχει δικαίωμα ανάγνωσης ή εγγραφής στον χώρο διευθύνσεων των υπολοίπων. Αν λοιπόν χρειάζεται δύο διαφορετικές διεργασίες να επικοινωνήσουν μεταξύ τους ή να ανταλλάξουν δεδομένα, αυτό μπορεί να γίνει μόνο μέσω του συστήματος αρχείων (π.χ. μία διεργασία να γράψει ένα αρχείο και μία άλλη να το διαβάσει) ή μέσω μίας μεθόδου διαδιεργασιακής επικοινωνίας. Με το προγραμματιστικό μοντέλο των υποδοχών (sockets) οι διεργασίες οι οποίες επικοινωνούν μπορούν να εκτελούνται σε διαφορετικούς υπολογιστές που διασυνδέονται μέσω ενός δικτύου. Σε πολλές περιπτώσεις ένα εκτελούμενο πρόγραμμα (η μητρική ή γονική διεργασία) δημιουργεί δευτερεύουσες (θυγατρικές) διεργασίες ώστε να εκμεταλλευτεί πιθανά οφέλη από τον ταυτοχρονισμό. Με αυτόν τον τρόπο, σε ένα παράλληλο σύστημα οι υπολογισμοί που απαιτούνται από μία εφαρμογή μπορούν να κατανεμηθούν σε πολλαπλούς επεξεργαστές με τον καθένα να εκτελεί διαφορετική διεργασία, ενώ σε ένα σειριακό σύστημα αν μία διεργασία ανασταλεί (π.χ. σε μία κλήση συστήματος) καθώς περιμένει την απελευθέρωση ενός πόρου (π.χ. πρόσβαση στον σκληρό δίσκο) ή μία είσοδο από τον χρήστη), κάποια άλλη διεργασία μπορεί να συνεχίσει τους υπολογισμούς. Είναι φανερό επομένως ότι η διαδιεργασιακή επικοινωνία δεν είναι απαραίτητη μόνο για την ανταλλαγή δεδομένων μεταξύ ανεξάρτητων διεργασιών, αλλά και για τον συντονισμό στενά συνεργαζόμενων διεργασιών οι οποίες εκτελούνται παράλληλα, σε συστήματα πολλαπλών επεξεργαστών, ή ψευδοπαράλληλα, δηλαδή με ταχύτατη και διαφανή εναλλαγή πολλαπλών ταυτοχρόνως εκτελούμενων διεργασιών στον μοναδικό επεξεργαστή. POSIXΗ διαδιεργασιακή επικοινωνία στα λειτουργικά συστήματα τύπου UNIX καθορίζεται από το πρότυπο POSIX. ΣήματαΜία περιορισμένη μορφή διαδιεργασιακής επικοινωνίας είναι τα σήματα (signals), διακοπές λογισμικού που δρουν ως σινιάλα και μπορούν να αποστέλλονται σε μία διεργασία από κάποια άλλη ή από τον πυρήνα, αναγκάζοντάς την να τα χειριστεί ασύγχρονα μόλις τα λάβει και ακολούθως να επιστρέφει στην κανονική ροή εκτέλεσης. Κάθε σήμα διακρίνεται από έναν ακέραιο με τον οποίο είναι συσχετισμένο κάποιο συμβολικό όνομα (SIGxxxx). Το μοντέλο είναι το εξής: ένα πρόγραμμα στον κώδικά του δηλώνει ότι μία συνάρτηση είναι χειριστής ενός συγκεκριμένου σήματος (εγκατάσταση χειριστή). Όταν ληφθεί το σήμα αυτό κατά την εκτέλεση της αντίστοιχης διεργασίας, αυτομάτως η τελευταία διακόπτει ό,τι έκανε (εντολή Α) και εκτελεί τον χειριστή. Μόλις ο χειριστής επιστρέψει ο έλεγχος δίνεται ξανά στην εντολή Α. Ένας χειριστής εγκαθίσταται με την κλήση συστήματος ΣωληνώσειςΗ παλαιότερη μέθοδος διαδιεργασιακής επικοινωνίας στο Unix είναι οι σωληνώσεις (pipes). Πρόκειται για δομές δεδομένων του πυρήνα που επιτρέπουν σε δύο συγγενείς διεργασίες να ανταλλάσσουν αμφίδρομα δεδομένα. Εμφανίζονται στον χώρο του χρήστη ως ζεύγη περιγραφέων αρχείων, χωρίς να αντιστοιχούν σε πραγματικά αρχεία, όπου ο ένας περιγραφέας είναι άκρο εγγραφής και ο άλλος άκρο ανάγνωσης. Οι συνήθεις κλήσεις συστήματος για Είσοδο / Έξοδο σε αρχεία ( Ακολουθεί ένα παράδειγμα χειρισμού σωληνώσεων σε γλώσσα προγραμματισμού C: #include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#define MAXLINE 512
int main(void)
{
int n, fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0)
{perror("creating pipe"); exit(1); } /* Αποτυχία κατασκευής της σωλήνωσης */
if ((pid = fork()) < 0)
{perror("cannot fork"); exit(1); } /* Αποτυχία κατασκευής της θυγατρικής διεργασίας */
else if (pid > 0) /* γονική διεργασία */
{
close(fd[0]); /* κλείσιμο του άκρου ανάγνωσης */
write(fd[1], "message through pipe\n", 21); /* κλήση εγγραφής σε αρχείο - εδώ χρησιμοποιείται για εγγραφή στο ανοιχτό άκρο της σωλήνωσης */
close(fd[1]);
}
else
{ /* θυγατρική διεργασία */
close(fd[1]); /* κλείσιμο του άκρου εγγραφής */
n = read(fd[0], line, MAXLINE); /* κλήση ανάγνωσης από αρχείο - εδώ χρησιμοποιείται για ανάγνωση από το ανοιχτό άκρο της σωλήνωσης */
write(STDOUT_FILENO, line, n); close(fd[0]);
}
exit(0);
}
Εναλλακτικά μπορούν να χρησιμοποιηθούν κατονομασμένες σωληνώσεις (named pipes ή FIFOs). Αυτές κατά τη δημιουργία τους αντιστοιχίζονται σε οντότητες του συστήματος αρχείων, εικονικά αρχεία, ώστε να μπορούν να προσπελαστούν από μη συγγενείς διεργασίες που γνωρίζουν το μονοπάτι του εικονικού αρχείου. Ο χειρισμός τους γίνεται όπως των κοινών αρχείων, οπότε κάθε διεργασία για κάθε FIFO διατηρεί μόνο έναν περιγραφέα αρχείου ο οποίος επιστρέφεται από μία κοινή κλήση Πολλές διεργασίες μπορούν ταυτόχρονα να προσπελαύνουν το ίδιο αρχείο ή FIFO, πιθανώς για να ανταλλάξουν δεδομένα, με αποτέλεσμα να εμφανίζονται συνθήκες συναγωνισμού. Το πρόβλημα επιλύεται με τα κλειδώματα αρχείων, δηλαδή εξειδικευμένα mutex που παρέχει ο πυρήνας για αμοιβαίο αποκλεισμό. Τα κλειδώματα είναι είτε κοινόχρηστα είτε αποκλειστικά (με πολλαπλές διεργασίες να μπορούν να κατέχουν ταυτόχρονα ένα κοινόχρηστο κλείδωμα για το ίδιο αρχείο αλλά όχι ένα αποκλειστικό κλείδωμα, ή παράλληλα ένα κοινόχρηστο κι ένα αποκλειστικό κλείδωμα) και αφορούν ένα αρχείο και όχι έναν περιγραφέα αρχείου: αν ο τελευταίος κλωνοποιηθεί, με μία κλήση dup() ή fork(), δεν υπάρχουν πλέον δύο κλειδώματα αλλά δύο αναφορές στο ίδιο κλείδωμα. Τα κλειδώματα αρχείων είναι προσπελάσιμα μέσω της εξειδικευμένης κλήσης συστήματος Διαδιεργασιακή επικοινωνία του System VΜία άλλη οικογένεια μεθόδων διαδιεργασιακής επικοινωνίας στο Unix είναι οι μέθοδοι IPC του Unix System V, οι οποίες διαφέρουν από τις προηγούμενες (μη αντιστοιχίζοντας κάποια οντότητα σε περιγραφείς αρχείων) αλλά μεταξύ τους έχουν κοινά χαρακτηριστικά. Information related to Διαδιεργασιακή επικοινωνία |