Ουρές Μηνυμάτων (Message Queues in System V) Προγραμματισμός II 1

Σχετικά έγγραφα
IPC System V. Προγραμματισμός II 1

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Συγχρονισμός & σηματοφόροι. Προγραμματισμός II 1

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Λειτουργικά Συστήματα. Ενότητα # 10: Προγραμματισμός UNIX Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Προγραμματισμός συστημάτων UNIX/POSIX

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Προγραμματισμός συστημάτων UNIX/POSIX

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

Μη ανασταλτική/πολυπλεξία Ε/Ε (non-blocking/multiplexed I/O) Προγραμματισμός II 1

Ανάπτυξη και Σχεδίαση Λογισμικού

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Υλοποίηση Σηματοφόρων

Λειτουργικά Συστήματα

Εγχειρίδιο Συναρτήσεων. Socket *sopen(const int type, const int protocol, const char *host, const char *service)

Επικοινωνία αίτησης-απάντησης. Κατανεμημένα Συστήματα 1

Επικοινωνία αίτησης-απάντησης. Κατανεμημένα Συστήματα 1

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Διάλεξη 18η: Διαχείρηση Αρχείων

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Χώροι Πλειάδων (Tuple Spaces) Ταυτόχρονος Προγραμματισμός 1

Επικοινωνία με μηνύματα. Κατανεμημένα Συστήματα 1

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Χώροι Πλειάδων (Tuple Spaces) Ταυτόχρονος Προγραμματισμός 1

Προγραμματισμός Δομές Δεδομένων

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

Παράλληλη Επεξεργασία

Επικοινωνία με μηνύματα. Κατανεμημένα Συστήματα 1

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Υποδοχείς (Sockets) Προγραμματισμός II 1

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (ΗΥ120)

Βασικά Θέματα Επικοινωνίας. Κατανεμημένα Συστήματα 1

Προγραμματισμός Ι (ΗΥ120)

Διαδικασιακός Προγραμματισμός

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Εργαστήριο Λειτουργικών Συστημάτων. Inside System Calls

Επεξεργασία Αρχείων Κειµένου

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Εργαστήριο 2: Πίνακες

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

ιαφάνειες παρουσίασης #6 (β)

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Εργαστήριο 9: Αρχεία

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

Διαδικασιακός Προγραμματισμός

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

FILE *fopen(const char *fname, const char *mode) void fclose(file *f) void fflush(file *f)

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Ι. Δομές & Ενώσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Εργαστήριο 5 fork(), exec(), signals

Δομημένος Προγραμματισμός (ΤΛ1006)

Ενδεικτικές λύσεις και στατιστικά

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Αλγόριθμοι Ταξινόμησης Μέρος 1

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

είκτες και Πίνακες (2)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Transcript:

Ουρές Μηνυμάτων (Message Queues in System V) Προγραμματισμός II 1 lalis@inf.uth.gr

Ουρά μηνυμάτων Αποθήκη μηνυμάτων στην μνήμη του λειτουργικού Περιορισμένος αριθμός / όγκος μηνυμάτων Κάθε μήνυμα είναι μια σειρά από bytes κατ εξαίρεση, κάποια από αυτά τα bytes ερμηνεύονται και από το λειτουργικό σύστημα βλέπε παρακάτω Κάθε μήνυμα είναι ξεχωριστό από τα υπόλοιπα Πολλές διεργασίες μπορεί να χρησιμοποιούν την ίδια ουρά μηνυμάτων ταυτόχρονα με εγγυημένο διαχωρισμό ανάμεσα στα διαφορετικά μηνύματα βεβαίως, χωρίς συγχρονισμό, τα μηνύματα θα μπουν / απομακρυνθούν στην / από την ουρά με τυχαία σειρά Προγραμματισμός II 2 lalis@inf.uth.gr

P1 P2 P3 P4 msg4 msg3 msg2 msg1 Προγραμματισμός ΙΙ 3 lalis@inf.uth.gr

Δημιουργία/ανεύρεση ουράς μηνυμάτων int msgget(key_t key, int flags); Δημιουργεί/βρίσκει την ουρά μηνυμάτων με κλειδί key, και επιστρέφει το αναγνωριστικό της Οι «κλασικές» βασικές επιλογές flags IPC_CREAT: δημιουργεί την ουρά μηνυμάτων IPC_EXCL: αποτυχία αν η ουρά ήδη υπάρχει άδειες, χρησιμοποιώντας τις ίδιες τιμές όπως στην open Αν το key είναι IPC_PRIVATE δημιουργείται μια ανώνυμη/ιδιωτική ουρά μηνυμάτων δεν μπορεί να βρεθεί μέσω msgget Προγραμματισμός II 4 lalis@inf.uth.gr

Έλεγχος ουράς μηνυμάτων int msgctl(int msqid, int cmd, struct msqid_ds *data); H cmd προσδιορίζει την ζητούμενη λειτουργία IPC_RMID: καταστροφή ουράς μηνυμάτων IPC_STAT: ανάκτηση πληροφοριών για την ουρά IPC_SET: καθορισμός ιδιοτήτων της ουράς Η αποθήκευση πληροφοριών και ο καθορισμός των επιθυμητών ιδιοτήτων γίνεται μέσω ειδικής δομής Η χωρητικότητα της ουράς μπορεί να ελεγχθεί ή/και να επαναπροσδιοριστεί μέσω της msgctl Αν η ουρά καταστραφεί, οι επόμενες κλήσεις πάνω στο αναγνωριστικό της ουράς αποτυγχάνουν, με την errno να λαμβάνει την τιμή EIDRM Προγραμματισμός II 5 lalis@inf.uth.gr

Δομή μηνυμάτων struct msg { long mtype; // convention! // data/payload }; Η δομή είναι ενδεικτική (δεν ορίζεται πουθενά) Τα πρώτα sizeof(long) bytes ερμηνεύονται από το λειτουργικό ως ο τύπος του μηνύματος Ο τύπος ενός μηνύματος πρέπει να είναι θετικός Μπορεί να γίνει παραλαβή μηνυμάτων ανάλογα με τον τύπο τους βλέπε παρακάτω Προγραμματισμός II 6 lalis@inf.uth.gr

Αποστολή μηνύματος int msgsnd(int msqid, void *msgp, size_t msize, int flags); Τοποθετεί το μήνυμα msgp στην ουρά msqid Το μέγεθος του μηνύματος επιπλέον των bytes για τον τύπο του μηνύματος, δίνεται μέσω msize Μπλοκάρει αν δεν υπάρχει διαθέσιμος χώρος Αποφυγή μπλοκαρίσματος: IPC_NOWAIT στα flags αν δεν υπάρχει χώρος, η κλήση επιστρέφει άμεσα με τιμή αποτυχίας και την errno ίση με EAGAIN Προγραμματισμός II 7 lalis@inf.uth.gr

Παραλαβή μηνύματος ssize_t msgrcv(int msqid, void *msgp, size_t msize,long mtype,int flags); Απομακρύνει ένα μήνυμα από την ουρά msqid, αποθηκεύει το περιεχόμενο (ως msize bytes) στο msgp, και επιστέφει το πόσα bytes αποθηκεύτηκαν αποτυγχάνει αν το μήνυμα δεν χωράει (errno ίσο E2BIG) εκτός αν στα flags συμπεριληφθεί MSG_NOERROR οπότε αντιγράφονται msize bytes και τα υπόλοιπα χάνονται Το μήνυμα επιλέγεται με βάση το mtype 0: το πρώτο μήνυμα στην ουρά >0: το πρώτο μήνυμα με αυτό το τύπο (ή το πρώτο μήνυμα με διαφορετικό τύπο, αν η flags περιέχει το MSG_EXCEPT) <0: το πρώτο μήνυμα με τον μικρότερο τύπο < mtype Μπλοκάρει αν δεν υπάρχει κατάλληλο μήνυμα εκτός αν στα flags συμπεριληφθεί IPC_NOWAIT, οπότε η κλήση αποτυγχάνει (errno ίσο με ENOMSG) Προγραμματισμός II 8 lalis@inf.uth.gr

(1) P1 P2 msg queue PING... (2) P1 msg queue P2 PONG... Προγραμματισμός ΙΙ 9 lalis@inf.uth.gr

#define PINGMSG 1 #define PONGMSG 2 struct msg { long type; char data[maxdata]; }; int main (int argc, char *argv[] ) { int mqid; struct msg m; } mqid = msgget(ipc_private,s_irwxu); if (!fork()) { msgrcv(mqid,&m,maxdata,pingmsg,0); printf("child got msg: %d:%s\n",m.type,m.data); m.type = PONGMSG; strcpy(m.data,"pong from child"); msgsnd(mqid,&m,strlen(m.data)+1,0); return(0); } m.type = PINGMSG; strcpy(m.data,"ping from parent"); msgsnd(mqid,&m,strlen(m.data)+1,0); msgrcv(mqid,&m,maxdata,pongmsg,0); printf("parent got msg: %d:%s\n",m.type,m.data); msgctl(mqid,ipc_rmid,null); return(0); Προγραμματισμός ΙΙΙ 10 lalis@inf.uth.gr

client queue (1) client server server queue ADD_REQ... (2) client client queue ADD_RES... server queue server Προγραμματισμός ΙΙ 11 lalis@inf.uth.gr

#define REQMSG 1 #define RSPMSG 2 #define REQ_SIZE (sizeof(struct req)-sizeof(long)) #define RSP_SIZE (sizeof(struct rsp)-sizeof(long)) struct req { long type; // REQMSG int mqid; // message queue id to use for reply int a,b; // arguments }; struct rsp { long type; // RSPMSG int res; // result }; Προγραμματισμός ΙΙΙ 12 lalis@inf.uth.gr

int main (int argc, char *argv[] ) { int key,mqid; struct req req; struct rsp rsp; key = ftok(argv[1],0); mqid = msgget(key,ipc_creat S_IRWXU); do { msgrcv(mqid,&req,req_size,0,0); if (req.type!= REQMSG) { continue; } // ignore rsp.type = RSPMSG; rsp.res = req.a + req.b; msgsnd(req.mqid,&rsp,rsp_size,0); } while (rsp.res!= 0); msgctl(mqid,ipc_rmid,null); return(0); } int main (int argc, char *argv[] ) { int key, mqid1,mqid2; struct req req; struct rsp rsp; } key = ftok(argv[1],0); mqid1 = msgget(key,0); mqid2 = msgget(ipc_private,s_irwxu); req.type = REQMSG; req.mqid = mqid2; req.a = atoi(argv[2]); req.b = atoi(argv[3]); msgsnd(mqid1,&req,req_size,0); msgrcv(mqid2,&rsp,rsp_size,rspmsg,0); msgctl(mqid2,ipc_rmid,null); return(0); server client Προγραμματισμός ΙΙΙ 13 lalis@inf.uth.gr