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

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

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

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

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

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

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

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

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

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

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΜΑΘΗΜΑ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΣΗΜΕΙΩΣΕΙΣ. Αρχεία και Μεταδεδομένα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

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

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

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

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

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

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

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

File Management και I/O στο UNIX

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

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

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

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

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

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

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

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

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

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

Εικονική Μνήμη (1/2)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αρχεία εδοµένων. Προγραµµατισµός Ι 1

Προγραμματισμός συστημάτων UNIX/POSIX. Σήματα (signals)

Συνέπεια μνήμης σε πολυπύρηνα/πολυεπεξεργαστικά συστήματα

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

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

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

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

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

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

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Αρχές Προγραμματισμού

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

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

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

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

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

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

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

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος Κανονική Εξέταση Λύσεις

Γλώσσα Προγραμματισμού C

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1

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

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

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

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

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

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

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

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

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Transcript:

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

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

Αρχεία «λουκέτα» (lock files) Όταν μια διεργασία επιθυμεί να χρησιμοποιήσει το αρχείο <fname> κατ αποκλειστικότητα, επιχειρεί προηγουμένως να δημιουργήσει ένα ξεχωριστό αρχείο-λουκέτο (συνήθως <fname>.lck) Το αρχείο-λουκέτο δημιουργείται με O_CREAT O_EXCL Αν το υπάρχει ήδη, η open θα αποτύχει (αυτό σημαίνει πως το αρχείο <fname> χρησιμοποιείται ήδη από μια άλλη διεργασία), και η προσπάθεια επαναλαμβάνεται Όταν μια διεργασία ολοκληρώσει την εργασία της με το αρχείο fname, «απελευθερώνει» την πρόσβαση, απομακρύνοντας το αρχείο λουκέτο fname.lck Προγραμματισμός II 3 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,fdlck,i,pid; pid = fork(); for (i = 0; i < N; i++) { while (1) { printf("%d: create lock file\n",getpid()); fdlck = open(argv[2],o_creat O_EXCL,S_IRWXU); if (fdlck > 0) { break; if (errno!= EEXIST) { perror("open"); return(1); printf("%d: retrying\n",getpid()); sleep(1); // retry in 1 sec printf("%d: success %d\n",getpid(),i); close(fdlck); fd = open(argv[1],o_rdwr O_CREAT,S_IRWXU); sleep(5); // do something with the file close(fd); printf("%d: unlocking\n",getpid()); unlink(argv[2]); // remove lock file sleep(1); // give other party a chance to lock if (pid > 0) { waitpid(pid,null,0); return(0); Προγραμματισμός ΙΙΙ 4 lalis@inf.uth.gr

Μειονεκτήματα Οι διεργασίες πραγματοποιούν ενεργή αναμονή Υπάρχει περίπτωση λιμοκτονίας μια διεργασία μπορεί να «προσπερνιέται» επ αόριστο Το αρχείο «κλειδώνεται» ολόκληρο Δεν γίνεται διαχωρισμός σχετικά με το αν μια διεργασία επιθυμεί να διαβάσει ή να γράψει Το αρχείο-λουκέτο μπορεί να μην σβηστεί ποτέ λάθος του προγραμματιστή, τερματισμός διεργασίας Η χρήση ενός αρχείου-λουκέτου αποτελεί μια σύμβαση καθαρά σε επίπεδο εφαρμογής ένα πρόγραμμα μπορεί να προσπελάσει ένα αρχείο, χωρίς να ελέγξει την ύπαρξη του αρχείου λουκέτου Προγραμματισμός II 5 lalis@inf.uth.gr

Κλείδωμα αρχείων μέσω του λειτουργικού Γίνεται διαφοροποίηση ανάμεσα σε κλείδωμα για ανάγνωση και κλείδωμα για γράψιμο πολλές διεργασίες μπορούν να διαβάζουν ταυτόχρονα μόνο μια διεργασία μπορεί να γράφει Το κλείδωμα μπορεί να γίνει τμηματικά γίνεται αυτόματη «συγχώνευση» ή «σπάσιμο» των τμημάτων που κλειδώνονται από την ίδια διεργασία Το κλείδωμα είναι «συμβουλευτικό» (σύμβαση) οποιοδήποτε πρόγραμμα/διεργασία μπορεί να παρακάμψει το κλείδωμα, απλά μη-κλειδώνοντας το αρχείο Υποστηρίζεται μέσω fcntl (αλλά και flock,lockf) Προγραμματισμός II 6 lalis@inf.uth.gr

Κλείδωμα με fcntl int fcntl(int fd, int op, ); Η op καθορίζει την επιθυμητή λειτουργία στον fd, από την οποία εξαρτάται ποιες επιπλέον παράμετροι πρέπει να περαστούν στην κλήση της fcntl F_SETLK: εκτέλεση της λειτουργίας (κλείδωμα/ξεκλείδωμα), με άμεση επιστροφή -1 (errno ίσο με EACCES/EAGAIN) αν η λειτουργία (κλείδωμα) δεν μπορεί να εκτελεσθεί άμεσα F_SETLKW: όπως F_SETLK, αλλά μπλοκάρει την διεργασία μέχρι να επιτευχθεί η ζητούμενη λειτουργία (κλείδωμα) F_GETLK: λήψη στοιχείων του πρώτου κλειδώματος που θα μπορούσε να προκαλέσει μπλοκάρισμα στην καθορισμένη λειτουργία (κλείδωμα) βλέπε εγχειρίδια Επιπλέον παράμετρος: δείκτης σε struct flock που περιέχει την επιθυμητή λειτουργία και τις παραμέτρους Προγραμματισμός II 7 lalis@inf.uth.gr

Δομή struct flock struct flock { short l_type; short l_whence; off_t l_start; off_t l_len; pid_t l_pid; ; Το l_type καθορίζει την ζητούμενη λειτουργία F_RDLCK (μόνο διάβασμα), F_WRLCK (γράψιμο και διάβασμα), F_UNLCK (ξεκλείδωμα) Το l_whence καθορίζει την ερμηνεία του l_start SEEK_SET, SEEK_CUR, SEEK_END (όπως στην lseek) Το l_start καθορίζει την αρχή του τμήματος για κλείδωμα/ξεκλείδωμα), και το l_len το μήκος του Προγραμματισμός II 8 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,i,pid; struct flock lck; lck.l_whence = SEEK_SET; lck.l_start=0; lck.l_len=0; pid = fork(); fd = open(argv[1],o_rdwr O_CREAT,S_IRWXU); for (i = 0; i < N; i++) { printf("%d: trying to lock\n",getpid()); lck.l_type=f_wrlck; fcntl(fd,f_setlkw,&lck); printf("%d: success %d\n",getpid(),i); sleep(5); // do something with the file printf("%d: unlocking\n",getpid()); lck.l_type = F_UNLCK; fcntl(fd,f_setlk,&lck); sleep(1); // give other party a chance to lock if (pid > 0) { waitpid(pid,null,0); return(0); Προγραμματισμός ΙΙΙ 9 lalis@inf.uth.gr

Αντιστοίχιση αρχείων στην μνήμη (memory-mapped files) Προγραμματισμός II 10 lalis@inf.uth.gr

Πρόσβαση σε αρχεία μέσω της μνήμης Η πρόσβαση των περιεχομένων ενός αρχείου μέσω περιγραφέων γίνεται «σειριακά» με read, write Μπορεί να γίνουν και «άλματα», με lseek Αυτά γίνονται με το κόστος μιας κλήσης συστήματος Εναλλακτικά, το αρχείο (ή ένας μέρος του) μπορεί να αντιστοιχηθεί στην μνήμη μιας διεργασίας Η πρόσβαση στα περιεχόμενα του αρχείου μπορεί να γίνει διαβάζοντας/γράφοντας τις αντίστοιχες θέσεις μνήμης της διεργασίας Χωρίς να πραγματοποιούνται κλήσεις συστήματος Προγραμματισμός ΙΙ 11 lalis@inf.uth.gr

Βασικές λειτουργίες void *mmap(void *p, long len, int prot, int flags, int fd, long off); Αντιστοιχίζει στην διεύθυνση p τα περιεχόμενα του αρχείου που αντιστοιχεί στον περιγραφέα fd από την θέση offset μέχρι τη θέση offset+len προστασία πρόσβασης μέσω prot, ρυθμίσεις μέσω flags int msync(void *p, long len, int flags); Ενημερώνει το αρχείο (στον δίσκο) μονιμοποίηση αλλαγών που έγιναν μέσω μνήμης int munmap(void *p, long len); Ακυρώνει την αντιστοίχιση πάνω στην διεύθυνση p γίνεται αυτόματα όταν τερματίζεται η διεργασία Προγραμματισμός ΙΙ 12 lalis@inf.uth.gr

memory P1 file memory mapped area Προγραμματισμός ΙΙ 13 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n,i,offset; char *p; struct stat sb; fd = open(argv[1],o_rdwr); offset = atoi(argv[2]); fstat(fd,&sb); n = sb.st_size; p = mmap(null,n,prot_read PROT_WRITE,MAP_SHARED,fd,0); if (p == ((void *)-1)) { perror("mmap"); return(1); close(fd); // file descriptor no longer required // read file contents, via memory for (i=0; i < n; i++) { printf("%c",p[i]); printf("\n"); // modify file contents, via memory for (i=0; i < n; i++) { p[i] = p[i] + offset; msync(p,n,ms_sync); // write changes on disk munmap(p,n); return(0); Προγραμματισμός ΙΙ 14 lalis@inf.uth.gr

Κοινή μνήμη μέσω memory mapped files Αν στα flags συμπεριληφθεί η τιμή MAP_SHARED Οι αλλαγές στην μνήμη περνιούνται στο αρχείο Είναι ορατές σε άλλες διεργασίες που έχουν αντιστοιχίσει το αρχείο στην μνήμη τους στο πνεύμα του shared memory Είναι ορατές σε όλους τους περιγραφείς που έχουν ανοιχτεί για το αρχείο (και το αντίστροφο) χωρίς να καλείται msync ή αντίστοιχα fsync Αν στα flags συμπεριληφθεί η τιμή MAP_PRIVATE Οι αλλαγές που γίνονται δεν είναι ορατές σε άλλες διεργασίες, ούτε περνιούνται στο ίδιο το αρχείο Προγραμματισμός ΙΙ 15 lalis@inf.uth.gr

ιδιωτική μνήμη κοινή μνήμη ιδιωτική μνήμη P1 P2 file memory mapped area Προγραμματισμός ΙΙ 16 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n,i,offset; char *p; struct stat sb; fd = open(argv[1],o_rdwr); fstat(fd,&sb); n = sb.st_size; p = mmap(null,n,prot_read PROT_WRITE,MAP_SHARED,fd,0); close(fd); if (!fork()) { offset = atoi(argv[2]); for (i=0; i < n; i++) { p[i] = p[i] + offset; munmap(p,n); return(0); wait(null); // wait for child to write for (i=0; i < n; i++) { printf("%c",p[i]); printf("\n"); munmap(p,n); return(0); Προγραμματισμός ΙΙ 17 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n,i,offset; char *p,s[n]; struct stat sb; fd = open(argv[1],o_rdwr); if (!fork()) { offset = atoi(argv[2]); fstat(fd,&sb); n = sb.st_size; p = mmap(null,n,prot_read PROT_WRITE,MAP_SHARED,fd,0); close(fd); for (i=0; i < n; i++) { p[i] = p[i] + offset; munmap(p,n); return(0); wait(null); // wait for child to write n = read(fd,s,n); s[n] = '\0'; printf("%s\n",s); return(0); Προγραμματισμός ΙΙ 18 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int fd,n,i,offset; char *p,s[n]; struct stat sb; fd = open(argv[1],o_rdwr); if (!fork()) { sleep(1); // wait for parent to mmap offset = atoi(argv[2]); n = read(fd,s,n); for (i=0; i < n; i++) { s[i] = s[i] + offset; lseek(fd,0,seek_set); write(fd,s,n); close(fd); return(0); fstat(fd,&sb); n = sb.st_size; p = mmap(null,n,prot_read PROT_WRITE,MAP_SHARED,fd,0); wait(null); // wait for child to write for (i=0; i < n; i++) { printf("%c",p[i]); printf("%s\n",s); munmap(p,n); return(0); Προγραμματισμός ΙΙ 19 lalis@inf.uth.gr