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

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

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

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

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

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

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

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

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

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

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

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

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

Σήματα (Signals) Προγραμματισμός II 1

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

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

Σήματα (Signals) Προγραμματισμός II 1

Προγραμματισμός Ι (HY120)

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

Σήματα (Signals) Προγραμματισμός II 1

IPC System V. Προγραμματισμός II 1

CE121 Προγραµµατισµός ΙΙ. Χρόνος εκτέλεσης. Βάνα Ντουφεξή

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

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

Εργαστήριο Λειτουργικών Συστημάτων Ακ. Έτος Άσκηση 3

Προγραµµατισµός ικτύων Ε-01

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

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Προγραμματισμός Ι (HY120)

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

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

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

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

Αρχεία. Προγραμματισμός II 1

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1

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

Αρχεία. Προγραμματισμός II 1

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

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

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

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

Περιγραφείς Αρχείων & Ανακατεύθυνση EE. Προγραμματισμός II 1

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

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

Ιδιοκτησία Αντικειµένου

Οργάνωση Υπολογιστών (IΙI)

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1

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

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Αντικειµενοστρεφής Προγραµµατισµός

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

Προγραμματισμός ΙI (E)

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Ζητήματα Σχεδίασης Λογισμικού Εξυπηρετητή

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

Βασικές συσκευές Ε/Ε. Είσοδος Έξοδος στον υπολογιστή. Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (IΙI) Μ.

Ενδεικτική περιγραφή μαθήματος

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

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

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

C: Από τη Θεωρία στην Εφαρμογή

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

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

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

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

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

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

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

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 4: Έλεγχος Ροής. Κ.

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Transcript:

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

Μπλοκάρισμα διεργασίας Μια διεργασία μπλοκάρει όταν καλεί λειτουργίες συστήματος που δεν μπορεί να ολοκληρωθούν άμεσα η ολοκλήρωση τους μπορεί να εξαρτάται από άλλες διεργασίες που μπορεί να αργήσουν να εκτελεστούν read: διάβασμα από άδειο αγωγό ή συσκευή που δεν έχει διαθέσιμα δεδομένα (πληκτρολόγιο τερματικού) write: γράψιμο σε γεμάτο αγωγό Το μπλοκάρισμα δεν είναι πάντα επιθυμητό Προγραμματισμός II 2 lalis@inf.uth.gr

Μη-ανασταλτικοί περιγραφείς αρχείων Ένας περιγραφέας αρχείου μπορεί να προσδιοριστεί ως «μη-ανασταλτικός» (non-blocking) Κατά την δημιουργία του περιγραφέα μέσω open, με την προσθήκη O_NONBLOCK στα flags Αφού δημιουργηθεί ο περιγραφέας, με την προσθήκη O_NONBLOCK στα flags μέσω fcntl / ioctl Αν η λειτουργία, η οποία κανονικά θα μπλόκαρε την διεργασία, δεν μπορεί να εκτελεστεί άμεσα, τότε αποτυγχάνει, και η errno παίρνει τιμή EAGAIN Προγραμματισμός II 3 lalis@inf.uth.gr

Προσδιορισμός ιδιοτήτων περιγραφέα int fcntl(int fd, int op,...) Η op καθορίζει την επιθυμητή λειτουργία στον fd Αντίστοιχα, δίνονται επιπλέον παράμετροι Για διάβασμα/λήψη flags: F_GETFL Για γράψιμο/αλλαγή flags: F_SETFL Συνήθως, πρώτα γίνεται λήψη, και στη συνέχεια επαναπροσδιορισμός των flags, συνδυάζοντας την ιδιότητα που επιθυμούμε με τις ήδη υπάρχουσες Προγραμματισμός II 4 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int flags,n; char str[ν]; flags = fcntl(stdin_fileno,f_getfl); fcntl(stdin_fileno,f_setfl,flags O_NONBLOCK); while (1) { n = read(stdin_fileno,str,ν-1); if (n > 0) { str[n] = '\0'; printf("read: %s\n",str); else if (n == 0) { printf("end of input\n"); break; else if (errno!= EAGAIN) { perror("read"); break; else { printf("no data, retrying\n"); sleep(3); return(0); Προγραμματισμός ΙΙ 5 lalis@inf.uth.gr

Χρήση πολλών περιγραφέων αρχείων Ένα πρόγραμμα μπορεί να επιθυμεί να διαβάζει ή/και να γράφει από/σε πολλούς περιγραφείς Μπορεί να μην είναι γνωστή η σειρά με την οποία, κατά την διάρκεια της εκτέλεσης, κάθε περιγραφέας θα είναι «έτοιμος» για την άμεση εκτέλεσης της επιθυμητής λειτουργίας Η διεργασία μπορεί να μπλοκάρει άκοπα πάνω σε έναν περιγραφέα, ενώ κάποιος άλλος είναι «έτοιμος» Χρειάζεται κάποια μορφή ευέλικτης πολυπλεξίας! Προγραμματισμός II 6 lalis@inf.uth.gr

Ρητός έλεγχος ενεργή αναμονή Προσδιορισμός των περιγραφέων αρχείων για μη-ανασταλτική πρόσβαση, έτσι ώστε οι λειτουργίες read και write να μην μπλοκάρουν στην περίπτωση που ο περιγραφέας δεν είναι έτοιμος Περιοδική προσπάθεια για διάβασμα / γράψιμο σε κάθε έναν περιγραφέα Έλεγχος και χειρισμός των τιμών επιστροφής των read και write για «αποτυχία» της λειτουργίας Προγραμματισμός II 7 lalis@inf.uth.gr

Παράδειγμα P1 access structure pipe διαβάζει από όποιον αγωγό «τυχαίνει» να είναι έτοιμος (να έχει δεδομένα) access structure P2 access structure pipe access structure P3 Προγραμματισμός ΙΙ 8 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n; char str[n]; writer fd = open(argv[1],o_wronly); /* open pipe write end */ if (fd < 0) { perror("client: open"); return(1); while (1) { scanf("%s",str); printf("write: %s\n",str); n=write(fd,str,strlen(str)); if (n <= 0) { perror("write"); return(1); return(0); Προγραμματισμός ΙΙ 9 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd[2],n,flags,i; char str[n]; reader mkfifo(argv[1],s_irwxu); mkfifo(argv[2],s_irwxu); fd[0]=open(argv[1],o_rdonly); /* open pipe read end */ fd[1]=open(argv[2],o_rdonly); /* open pipe read end */ flags = fcntl(fd[0],f_getfl); fcntl(fd[0],f_setfl,flags O_NONBLOCK); flags = fcntl(fd[1],f_getfl); fcntl(fd[1],f_setfl,flags O_NONBLOCK); while (1) { for (i = 0; i < 2; i++) { printf("trying pipe %d: ",i); n = read(fd[i],str,n-1); if (n > 0) { str[n] = '\0'; printf("%s\n",str); else if (n == 0) { printf("end of input\n"); return(0); else if (errno!= EAGAIN) { perror("read"); return(1); else { printf("no data, retrying later\n"); Προγραμματισμός ΙΙ 10 lalis@inf.uth.gr

Αποφυγή ενεργής αναμονής Ο περιοδικός έλεγχος (polling) μπορεί να καταναλώνει πόρους του συστήματος άσκοπα συχνές κλήσεις συστήματος που πιθανώς θα «αποτύχουν» λόγω μη ετοιμότητας των περιγραφέων Η άσκοπη ενεργή αναμονή μπορεί να αποφευχθεί αν ο έλεγχος ετοιμότητας ανατεθεί στο λειτουργικό που γνωρίζει την ετοιμότητα κάθε περιγραφέα Χρειάζεται κατάλληλη λειτουργία μέσω της οποίας να προσδιορίζονται οι περιγραφείς αρχείων προς έλεγχο και να μπλοκάρει την διεργασία μέχρι κάποιος από αυτούς να είναι έτοιμος Προγραμματισμός II 11 lalis@inf.uth.gr

Ταυτόχρονη αναμονή σε περιγραφείς int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *errorset, struct timeval *timeout); Μπλοκάρει μέχρι τουλάχιστον ένας από τους περιγραφείς αρχείων στα σύνολα readset, writeset ή errorset να είναι έτοιμος για ανάγνωση, γράψιμο ή να προκύψει λάθος ή να παρέλθει το χρονικό διάστημα timeout Η παράμετρος ndfs ισούται με τον μεγαλύτερο περιγραφέα που βρίσκεται σε αυτά τα σύνολα +1 Επιστρέφεται ο αριθμός των περιγραφέων αρχείων που είναι έτοιμοι τα σύνολα αλλάζουν έτσι ώστε να περιέχουν μόνο τους έτοιμους περιγραφείς Προγραμματισμός II 12 lalis@inf.uth.gr

Διαχείριση συνόλου περιγραφέων fd_set τύπος συνόλου περιγραφέων αρχείου int FD_ZERO(fd_set *s) μηδενισμός του συνόλου s (σε κενό σύνολο) int FD_SET(int fd, fd_set *s) προσθήκη του περιγραφέα fd στο σύνολο s int FD_CLR(int fd, fd_set *s) αφαίρεση του περιγραφέα fd από το σύνολο s int FD_ISSET(int fd, fd_set *s) ελέγχει αν ο περιγραφέας fd βρίσκεται στο σύνολο s Προγραμματισμός II 13 lalis@inf.uth.gr

Τύποι καταγραφής χρόνου time_t τύπος για την αποθήκευση δευτερολέπτων suseconds_t τύπος για την αποθήκευση μικροδευτερολέπτων (10-6 ) struct timeval { time_t tv_sec; suseconds_t tv_usec; ; σύνθετος τύπος, η τελική «τιμή» του οποίου είναι το άθροισμα των δευτερολέπτων και των μικροδευτερολέπτων των πεδίων tv_sec και tv_usec, αντίστοιχα Προγραμματισμός II 14 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd[2],n,i,maxfd; char str[n]; fd_set fds1,fds2; struct timeval t1,t2; mkfifo(argv[1],s_irwxu); mkfifo(argv[2],s_irwxu); fd[0]=open(argv[1],o_rdonly); /* open pipe read end */ fd[1]=open(argv[2],o_rdonly); /* open pipe read end */ FD_ZERO(&fds1); FD_SET(fd[0],&fds1); FD_SET(fd[1],&fds1); maxfd=(fd[0]>fd[1]?fd[0]:fd[1]); t1.tv_sec = 5; t1.tv_usec = 0; reader while (1) { fds2 = fds1; t2 = t1; printf("calling select\n"); n = select(maxfd+1,&fds2,null,null,&t2); if (n < 0) { perror("select"); return(1); if (n == 0) { printf("retrying\n"); continue; for (i=0; i<2; i++) { if (FD_ISSET(fd[i],&fds2)) { printf("trying pipe %d: ",i); n = read(fd[i],str,n-1); if (n > 0) { str[n] = '\0'; printf("%s\n",str); else if (n == 0) { printf("end of input\n"); return(0); else { perror("read"); return(1); Προγραμματισμός ΙΙ 15 lalis@inf.uth.gr

Εναλλακτικές λειτουργίες αναμονής int poll(struct pollfd fdinfo[], ndfs_t nfds, int timeout) Μπλοκάρει μέχρι τουλάχιστον ένας από τους περιγραφείς αρχείων στον πίνακα fdinfo να είναι έτοιμος για ανάγνωση, γράψιμο ή να προκύψει λάθος ή να παρέλθει το χρονικό διάστημα timeout Η παράμετρος ndfs ισούται με τον αριθμό των στοιχείων του πίνακα fdinfo Η timeout προσδιορίζει τον χρόνο αναμονής σε χιλιοστά του δευτερολέπτου Επιστρέφεται ο αριθμός των έτοιμων περιγραφέων Προγραμματισμός II 16 lalis@inf.uth.gr

Δομή προσδιορισμού περιγραφέων struct pollfd { int fd; short events; short revents; ; Το events προσδιορίζει τις ιδιότητες προς έλεγχο για τον περιγραφέα, στο revents επιστρέφονται οι ιδιότητες που όντως ανιχνεύθηκαν POLLIN/POLLOUT: ετοιμότητα περιγραφέα για διάβασμα/γράψιμο δεδομένων POLLERR/POLLHUP: προέκυψε λάθος κατά την προσπέλαση / προέκυψε τέλος δεδομένων POLLNVAL: άκυρος περιγραφέας αρχείου Προγραμματισμός II 17 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd[2],n,i; char str[n]; struct pollfd fdinfo[2]; mkfifo(argv[1],s_irwxu); mkfifo(argv[2],s_irwxu); fd[0]=open(argv[1],o_rdonly); /* open pipe read end */ fd[1]=open(argv[2],o_rdonly); /* open pipe read end */ fdinfo[0].fd = fd[0]; fdinfo[0].events = POLLIN POLLHUP; fdinfo[1].fd = fd[1]; fdinfo[1].events = POLLIN POLLHUP; reader while (1) { printf("calling poll\n"); n = poll(fdinfo,2,5*1000); if (n < 0) { perror("poll"); return(1); if (n == 0) { printf("retrying\n"); continue; for (i=0; i<2; i++) { if (fdinfo[i].revents & (POLLIN POLLHUP)) { printf("trying pipe %d: ",i); n = read(fd[i],str,n-1); if (n > 0) { str[n] = '\0'; printf("%s\n",str); else if (n == 0) { printf("end of input\n"); return(0); else { perror("read"); return(1); Προγραμματισμός ΙΙ 18 lalis@inf.uth.gr