110 likes | 220 Views
Διαφάνειες παρουσίασης #11. Διασωληνώσεις Σήματα Κοινή μνήμη Σηματοφορείς. διασωλήνωση. Διεργασία 1. Διεργασία 2. fd[0] fd[1]. άλλη διεργασία. Διασωληνώσεις (i). Pipes Δίοδος επικοινωνίας με δύο άκρα. Σε κάθε μια διεργασία int fd [2]; Περιγραφή
E N D
Διαφάνειες παρουσίασης #11 Διασωληνώσεις Σήματα Κοινή μνήμη Σηματοφορείς
διασωλήνωση Διεργασία1 Διεργασία2 fd[0] fd[1] άλληδιεργασία Διασωληνώσεις (i) • Pipes • Δίοδος επικοινωνίας με δύο άκρα • Σε κάθε μια διεργασία int fd [2]; • Περιγραφή fd[0] file descriptor για ανάγνωση (λήψη) fd[1] file descriptor για εγγραφή (αποστολή)
Διασωληνώσεις (ii) • Δημιουργία νέας διασωλήνωσης int pipe (int fd[2]); • Ανάγνωση και εγγραφή ssize_t read (int fd, // fd[0]void * buffer, size_t size); ssize_t write (int fd, // fd[1]const void * buffer, size_t size); • Κλείσιμο int close (int fd);
θυρίδα Διεργασία1 Διεργασία2 σήμα Σήματα (i) • Messages: Unix System V • Μοιάζει με "θυρίδα γραμματοκιβωτίου" • Δομή σήματος • Τύπος σήματος • Περιεχόμενο struct msgbuf { long int mtype; char mtext [MAX_MESSAGE]; };
Σήματα (ii) • Δημιουργία "θυρίδας" για σήματα int msgget (key_t key, int flag); • Αποστολή σήματος int msgsnd (int msgid, const void * buf, int len, int flag); • Λήψη σήματος int msgrcv (int msgid, void * buf,int len, int mtype, int flag); • Άλλες λειτουργίες διαχείρισης int msgctl (int msgid, int cmd, ...);
κοινή μνήμη Διεργασία 2 δείκτης Διεργασία 1 δείκτης μεταβλητή Κοινή μνήμη (i) • Shared memory: Unix System V • Μεταβλητές κοινές για πολλές διεργασίες
Κοινή μνήμη (ii) • Δημιουργία κοινής μνήμης int shmget (key_t key, int size,int flag); • Συσχέτιση με μεταβλητή void * shmat (int shmid,void * addr, int flag); • Αποσυσχέτιση από μεταβλητή int shmdt (void * addr); • Άλλες λειτουργίες διαχείρισης int shmctl (int shmid, int cmd, ...);
σηματοφορέας Διεργασία2 Διεργασία1 τιμή λειτουργία λειτουργία Σηματοφορείς (i) • Semaphores: Unix System V • Επινόηση με βάσεις στη θεωρία παράλληλων συστημάτων • Οι λειτουργίες που εφαρμόζονται στο σηματοφορέα πραγματοποιούνται στιγμιαία • Έτσι εξασφαλίζεται ότι μια μόνο διεργασία μεταβάλλει το σηματοφορέα κάθε στιγμή
Σηματοφορείς (ii) • Δημιουργία σηματοφορέα int semget (key_t key, int num,int flag); • Εφαρμογή λειτουργιών σε σηματοφορείς int semop (int semid,struct sembuf * opPtr, int len); • Άλλες λειτουργίες διαχείρισης int semctl (int shmid, int num,int cmd, ...);
Σηματοφορείς (iii) • Λειτουργίες σηματοφορέων struct sembuf { short sem_num; short sem_op; short sem_flg; }; • Τιμές της παραμέτρου sem_op • +n: αύξηση της τιμής του σηματοφορέα κατά n. • -n: μείωση της τιμής του σηματοφορέα κατά n.Μπλοκάρει αν η τιμή είναι μικρότερη του n. • 0: έλεγχος για μηδενική τιμή σηματοφορέα. Μπλοκάρει αν η τιμή δεν είναι ίση με 0.
Σηματοφορείς (iv) • Συγχρονισμός με σηματοφορείς • Κάθε σηματοφορέας παριστάνει έναν πόρο που μπορεί να χρησιμοποιείται από nτο πολύ διεργασίες κάθε στιγμή • Η τιμή του σηματοφορέα είναι ο αριθμός των διεργασιών που επιτρέπεται ακόμα να χρησιμοποιήσουν τον πόρο (μεταξύ 0 και n) • Πριν χρησιμοποιήσει τον πόρο, κάθε διεργασία μειώνει την τιμή του σηματοφορέα • Μετά τη χρήση, κάθε διεργασία αυξάνει την τιμή του σηματοφορέα