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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

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

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

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

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

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

Προγραμματισμός σε C. Αρχεία κειμένου (Text files)

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

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

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

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

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

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

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

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

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

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

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

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

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

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

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

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

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

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

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Έλεγχος συγχρονικότητας Μέρος 1 Βάσεις Δεδομένων Διδάσκων: Μαρία Χαλκίδη

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

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

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

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

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

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

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

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ ΜΑΘΗΜΑ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

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

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; char lockfname[64]; } strcpy(lockfname,argv[1]); strcat(lockfname,".lck"); for (i = 0; i < N; i++) { while (1) { // try to exclusively create the lock file fdlck = open(lockfname,o_creat O_EXCL,S_IRWXU); if (fdlck > 0) { break; } // done if (errno!= EEXIST) { perror("open"); return(1); } sleep(1); // lock file exists, retry in 1 sec } close(fdlck); // no need to keep this open fd = open(argv[1],o_rdwr O_CREAT,S_IRWXU); // do something with the target file close(fd); // remove lock file, so someone else can lock unlink(lockfname); sleep(1); // give other party a chance to lock } return(0); lock logic unlock logic Προγραμματισμός ΙΙΙ 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; struct flock lck; lck.l_whence = SEEK_SET; // set so that operation lck.l_start=0; lck.l_len=0; // refers to the entire file fd = open(argv[1],o_rdwr O_CREAT,S_IRWXU); for (i = 0; i < N; i++) { // trying to lock lck.l_type=f_wrlck; fcntl(fd,f_setlkw,&lck); lock logic // do something with the locked file // unlock lck.l_type = F_UNLCK; fcntl(fd,f_setlk,&lck); unlock logic sleep(1); // give other party a chance to lock } } 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; // get file 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