230 likes | 298 Views
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι. ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2 ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4. Περιεχόμενα. Διαχείριση εργασιών fork() , exit(), exec() Επικοινωνία διεργασιών signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών semaphores
E N D
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4
Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting
Δημιουργία και χρήση κοινής μνήμης System V IPC Shared Memory • Δημιουργία κοινής μνήμης από διεργασία • shmget() • Προσκόλληση διεργασίας στης κοινή μνήμη • shmat() • Αποκόλληση διεργασία; από κοινή μνήμη • shmdt() • Έλεγχος κοινής μνήμης (περιλαμβάνει διαγραφή) • shmctl() • man (shmget) man(shmat) man(shmdt) man(shmctl)
Δημιουργία κοινής μνήμης 1/3 • Απαραίτητα αρχεία κεφαλίδων • #include <sys/types.h> • #include <sys/ipc.h> • #include <sys/shm.h> • Απαραίτητες μεταβλητές • intshm_id, error; • char *data; • Προαιρετικά: Ορισμός «κλειδιού» και μεγέθους κοινής μνήμης • #define SHM_KEY “our_group_id” • #define SHM_SIZE 1024
Δημιουργία κοινής μνήμης 2/3 shm_id = shmget(SHM_KEY, SHM_SIZE, 0600 |IPC_CREAT); if (shm_id< 0) { printf("Could not create shared memory!\n"); exit(1); } Πρώτη διεργασία (πριν τις κλήσεις fork())
Δημιουργία κοινής μνήμης 3/3 shm_id = shmget(SHM_KEY, SHM_SIZE, 0600); if (shm_id< 0) { printf("Could not create shared memory!\n"); exit(1); } Υπόλοιπες διεργασίες
Προσκόλληση διεργασίας στην κοινή μνήμη data = shmat(shm_id, NULL, 0); if (data == (char *)-1) { printf(“Could not attach to shared memory!\n”); exit(1); } • data: Δείκτης προς την αρχή της κοινής μνήμης Όλες οι διεργασίες
Αποκόλληση διεργασίας από την κοινή μνήμη error = shmdt(data); if (error == -1) { printf(“Could not detach from shared memory!\n”); exit(1); } Όλες οι διεργασίες
Διαγραφή κοινής μνήμης shmctl(shm_id, IPC_RMID, NULL); Μία μόνο διεργασία ΠΡΟΣΟΧΗ: Η αποκόλληση από και η διαγραφή μιας περιοχής κοινής μνήμης είναι απαραίτητες ενέργειες! Διαφορετικά το κλειδί και η περιοχή κοινής μνήμης παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση του συστήματος!
Παραδείγματα http://netcins.ceid.upatras.gr/OpSys-I/project/SharedMemory.htm
Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting
Δημιουργία και χρήση σημαφόρων: POSIX semaphores • Δημιουργία - Άνοιγμα σημαφόρου • sem_open() • Κλείδωμα σημαφόρου • sem_wait() • Απελευθέρωση σημαφόρου • sem_post() • Κλείσιμο σημαφόρου • sem_close() • Διαγραφή σημαφόρου • sem_unlink()
Δημιουργία – Άνοιγμα σημαφόρου (1/2) #include <semaphore.h> #include <fcntl.h> #include <sys/stat.h> sem_t *my_sem; #define SEM_NAME “my_semaphore_name” Απαραίτητα αρχεία κεφαλίδων Απαραίτητη κοινή μεταβλητή Προαιρετικά: Ορισμός ονόματος σημαφόρου
Δημιουργία – Άνοιγμα σημαφόρου (2/2) my_sem = sem_open(SEM_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, 1); if (my_sem == SEM_FAILED) { printf("Could not open semaphore!\n"); exit(1); } Πρώτη διεργασία (πριν τις κλήσεις fork()) Κατά την κλήση της fork(), η μεταβλητή my_semαντιγράφεται στην νέα διεργασία.
Κλείδωμα – Απελευθέρωση σεμαφόρου sem_wait(my_sem); /* Εργασίες στην κοινή μνήμη */ sem_post(my_sem); Για κάθε διεργασία που αλλάζει δεδομένα στην κοινή μνήμη, τα οποία μπορούν να αλλάξουν και οι υπόλοιπες διεργασίες: sem_wait(): Μειώνει την τιμή του σεμαφόρου κατά 1. Αν πάρει αρνητική τιμή, μπλοκάρει τη διεργασία εως ότου γίνει πάλι 0.
Κλείσιμο-διαγραφή σεμαφόρου • Όλες οι διεργαςίες: • sem_close(my_sem); • Μια μόνο διεργασία: • sem_unlink(SEM_NAME); • ΠΡΟΣΟΧΗ: • Το κλείσιμο και η διαγραφή ενός σημαφόρου είναι • απαραίτητες ενέργειες! • Διαφορετικά το όνομα και η μνήμη που χρησιμοποιεί ένας σημαφόρος παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση!
Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting
Makefile(s) • Eφαρμογήmake • Xρήση για την αυτόματη δημιουργία προγραμμάτων απόαρχεία κώδικα. • Διαδικασία: • Συγγραφή αρχείου Makefile που περιέχει κανόνες • Κλήση εντολής make για την παραγωγή του προγράμματος • Κανόνες: • Αρχείο-στόχος (target) • Αρχεία-απαιτήσεις (prerequisites) • Εντολή παραγωγής στόχου απο απαιτούμενα αρχεία • Παράδειγμα: target : prerequisites command
Παράδειγμα Makefile Makefile hello: hello.omain.o gcchello.omain.o -o hello.o hello.o: hello.c gcc -Wall -c hello.c main.o: main.c gcc -Wall -c main.c terminal $ make gcc -Wall -c hello.c gcc -Wall -c main.c gcchello.omain.o -o hello $ make make: `hello' is up to date. $ vi main.c $ make gcc -Wall -c main.c gcchello.omain.o -o hello