ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11
Διαχείριση εργασιών ◦ 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 Απαραίτητες μεταβλητές ◦ 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); exit(1);}
Υπόλοιπες διεργασίες shm_id = shmget(SHM_KEY, SHM_SIZE, 0600); if (shm_id < 0) { printf("Could not create shared memory!\n"); printf("Could not create shared memory!\n"); exit(1); exit(1);}
Όλες οι διεργασίες data = shmat(shm_id, NULL, 0); if (data == (char *)-1) { printf(“Could not attach to shared memory!\n”); printf(“Could not attach to shared memory!\n”); exit(1); exit(1);} data: Δείκτης προς την αρχή της κοινής μνήμης
Όλες οι διεργασίες error = shmdt(data); if (error == -1) { printf(“Could not detach from shared memory!\n”); printf(“Could not detach from shared memory!\n”); exit(1); exit(1);}
Μία μόνο διεργασία ΠΡΟΣΟΧΗ: Η αποκόλληση από και η διαγραφή μιας περιοχής κοινής μνήμης είναι απαραίτητες ενέργειες! Διαφορετικά το κλειδί και η περιοχή κοινής μνήμης παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση του συστήματος! shmctl(shm_id, IPC_RMID, NULL);
Διαχείριση εργασιών ◦ fork(), exit(), exec() Επικοινωνία διεργασιών ◦ signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών ◦ semaphores Makefiles & bash scripting
Δημιουργία - Άνοιγμα σημαφόρου ◦ sem_open() Κλείδωμα σημαφόρου ◦ sem_wait() Απελευθέρωση σημαφόρου ◦ sem_post() Κλείσιμο σημαφόρου ◦ sem_close() Διαγραφή σημαφόρου ◦ sem_unlink()
Απαραίτητα αρχεία κεφαλίδων Απαραίτητη κοινή μεταβλητή Προαιρετικά: Ορισμός ονόματος σημαφόρου #include #include sem_t *my_sem; #define SEM_NAME “my_semaphore_name”
Πρώτη διεργασία (πριν τις κλήσεις fork()) Κατά την κλήση της fork(), η μεταβλητή my_sem αντιγράφεται στην νέα διεργασία. 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"); printf("Could not open semaphore!\n"); exit(1); exit(1);}
Για κάθε διεργασία που αλλάζει δεδομένα στην κοινή μνήμη, τα οποία μπορούν να αλλάξουν και οι υπόλοιπες διεργασίες: sem_wait(): Μειώνει την τιμή του σεμαφόρου κατά 1. Αν πάρει αρνητική τιμή, μπλοκάρει τη διεργασία εως ότου γίνει πάλι 0. sem_wait(my_sem); /* Εργασίες στην κοινή μνήμη */ sem_post(my_sem);
Όλες οι διεργαςίες: ◦ sem_close(my_sem); Μια μόνο διεργασία: ◦ sem_unlink(SEM_NAME); ΠΡΟΣΟΧΗ: Το κλείσιμο και η διαγραφή ενός σημαφόρου είναι απαραίτητες ενέργειες! Διαφορετικά το όνομα και η μνήμη που χρησιμοποιεί ένας σημαφόρος παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση!
Διαχείριση εργασιών ◦ fork(), exit(), exec() Επικοινωνία διεργασιών ◦ signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών ◦ semaphores Makefiles & bash scripting
Eφαρμογή make Xρήση για την αυτόματη δημιουργία προγραμμάτων από αρχεία κώδικα. Διαδικασία: ◦ Συγγραφή αρχείου Makefile που περιέχει κανόνες ◦ Κλήση εντολής make για την παραγωγή του προγράμματος Κανόνες: ◦ Αρχείο-στόχος (target) ◦ Αρχεία-απαιτήσεις (prerequisites) ◦ Εντολή παραγωγής στόχου απο απαιτούμενα αρχεία Παράδειγμα: target : prerequisites command
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 Makefile 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