ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 1
Διαχείριση εργασιών fork(), exit(), exec() Επικοινωνία διεργασιών signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών semaphores Makefiles & bash scripting - 2 -
- 3 -
- 4 -
Δημιουργία κοινής μνήμης από διεργασία shmget() Προσκόλληση διεργασίας στης κοινή μνήμη shmat() Αποκόλληση διεργασία; από κοινή μνήμη shmdt() Έλεγχος κοινής μνήμης (περιλαμβάνει διαγραφή) shmctl() man (shmget) man(shmat) man(shmdt) man(shmctl) - 5 -
Απαραίτητα αρχεία κεφαλίδων #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> Απαραίτητες μεταβλητές int shm_id, error; char *data; Προαιρετικά: Ορισμός «κλειδιού» και μεγέθους κοινής μνήμης #define SHM_KEY our_group_id #define SHM_SIZE 1024-6 -
Πρώτη διεργασία (πριν τις κλήσεις fork()) shm_id = shmget(shm_key, SHM_SIZE, 0600 IPC_CREAT); if (shm_id < 0) { printf("could not create shared memory!\n"); exit(1); } - 7 -
Υπόλοιπες διεργασίες shm_id = shmget(shm_key, SHM_SIZE, 0600); if (shm_id < 0) { printf("could not create shared memory!\n"); exit(1); } - 8 -
Όλες οι διεργασίες data = shmat(shm_id, NULL, 0); if (data == (char *)-1) { printf( Could not attach to shared memory!\n ); exit(1); } data: Δείκτης προς την αρχή της κοινής μνήμης - 9 -
Όλες οι διεργασίες error = shmdt(data); if (error == -1) { printf( Could not detach from shared memory!\n ); exit(1); } - 10 -
Μία μόνο διεργασία shmctl(shm_id, IPC_RMID, NULL); ΠΡΟΣΟΧΗ: Η αποκόλληση από και η διαγραφή μιας περιοχής κοινής μνήμης είναι απαραίτητες ενέργειες! Διαφορετικά το κλειδί και η περιοχή κοινής μνήμης παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση του συστήματος! - 11 -
http://netcins.ceid.upatras.gr/opsys-i/project/sharedmemory.htm - 12 -
Διαχείριση εργασιών fork(), exit(), exec() Επικοινωνία διεργασιών signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών semaphores Makefiles & bash scripting - 13 -
- 14 -
Δημιουργία - Άνοιγμα σημαφόρου sem_open() Κλείδωμα σημαφόρου sem_wait() Απελευθέρωση σημαφόρου sem_post() Κλείσιμο σημαφόρου sem_close() Διαγραφή σημαφόρου sem_unlink() - 15 -
Απαραίτητα αρχεία κεφαλίδων #include <semaphore.h> #include <fcntl.h> #include <sys/stat.h> Απαραίτητη κοινή μεταβλητή sem_t *my_sem; Προαιρετικά: Ορισμός ονόματος σημαφόρου #define SEM_NAME my_semaphore_name - 16 -
Πρώτη διεργασία (πριν τις κλήσεις fork()) 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(), η μεταβλητή my_sem αντιγράφεται στην νέα διεργασία. - 17 -
Για κάθε διεργασία που αλλάζει δεδομένα στην κοινή μνήμη, τα οποία μπορούν να αλλάξουν και οι υπόλοιπες διεργασίες: sem_wait(my_sem); /* Εργασίες στην κοινή μνήμη */ sem_post(my_sem); sem_wait(): Μειώνει την τιμή του σεμαφόρου κατά 1. Αν πάρει αρνητική τιμή, μπλοκάρει τη διεργασία εως ότου γίνει πάλι 0. - 18 -
- 19 -
Όλες οι διεργαςίες: sem_close(my_sem); Μια μόνο διεργασία: sem_unlink(sem_name); ΠΡΟΣΟΧΗ: Το κλείσιμο και η διαγραφή ενός σημαφόρου είναι απαραίτητες ενέργειες! Διαφορετικά το όνομα και η μνήμη που χρησιμοποιεί ένας σημαφόρος παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση! - 20 -
Διαχείριση εργασιών fork(), exit(), exec() Επικοινωνία διεργασιών signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών semaphores Makefiles & bash scripting - 21 -
Eφαρμογή make Xρήση για την αυτόματη δημιουργία προγραμμάτων από αρχεία κώδικα. Διαδικασία: Συγγραφή αρχείου Makefile που περιέχει κανόνες Κλήση εντολής make για την παραγωγή του προγράμματος Κανόνες: Αρχείο-στόχος (target) Αρχεία-απαιτήσεις (prerequisites) Εντολή παραγωγής στόχου απο απαιτούμενα αρχεία Παράδειγμα: target : prerequisites command - 22 -
Makefile hello: hello.o main.o gcc hello.o main.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 gcc hello.o main.o -o hello $ make make: `hello' is up to date. $ vi main.c $ make gcc -Wall -c main.c gcc hello.o main.o -o hello - 23 -