1 / 23

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι. ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2 ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4. Περιεχόμενα. Διαχείριση εργασιών fork() , exit(), exec() Επικοινωνία διεργασιών signals, sockets και client/server, shared memory Συγχρονισμός διεργασιών semaphores

uriel-witt
Download Presentation

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4

  2. Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting

  3. Χώρος διευθύνσεων διεργασιών

  4. «Κοινή μνήμη» μεταξύ διεργασιών

  5. Δημιουργία και χρήση κοινής μνήμης System V IPC Shared Memory • Δημιουργία κοινής μνήμης από διεργασία • shmget() • Προσκόλληση διεργασίας στης κοινή μνήμη • shmat() • Αποκόλληση διεργασία; από κοινή μνήμη • shmdt() • Έλεγχος κοινής μνήμης (περιλαμβάνει διαγραφή) • shmctl() • man (shmget) man(shmat) man(shmdt) man(shmctl)

  6. Δημιουργία κοινής μνήμης 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

  7. Δημιουργία κοινής μνήμης 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())

  8. Δημιουργία κοινής μνήμης 3/3 shm_id = shmget(SHM_KEY, SHM_SIZE, 0600); if (shm_id< 0) { printf("Could not create shared memory!\n"); exit(1); } Υπόλοιπες διεργασίες

  9. Προσκόλληση διεργασίας στην κοινή μνήμη data = shmat(shm_id, NULL, 0); if (data == (char *)-1) { printf(“Could not attach to shared memory!\n”); exit(1); } • data: Δείκτης προς την αρχή της κοινής μνήμης Όλες οι διεργασίες

  10. Αποκόλληση διεργασίας από την κοινή μνήμη error = shmdt(data); if (error == -1) { printf(“Could not detach from shared memory!\n”); exit(1); } Όλες οι διεργασίες

  11. Διαγραφή κοινής μνήμης shmctl(shm_id, IPC_RMID, NULL); Μία μόνο διεργασία ΠΡΟΣΟΧΗ:  Η αποκόλληση από και η διαγραφή μιας περιοχής κοινής μνήμης είναι απαραίτητες ενέργειες! Διαφορετικά το κλειδί και η περιοχή κοινής μνήμης παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση του συστήματος!

  12. Παραδείγματα http://netcins.ceid.upatras.gr/OpSys-I/project/SharedMemory.htm

  13. Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting

  14. Ανάγκη για συγχρονισμό

  15. Δημιουργία και χρήση σημαφόρων: POSIX semaphores • Δημιουργία - Άνοιγμα σημαφόρου • sem_open() • Κλείδωμα σημαφόρου • sem_wait() • Απελευθέρωση σημαφόρου • sem_post() • Κλείσιμο σημαφόρου • sem_close() • Διαγραφή σημαφόρου • sem_unlink()

  16. Δημιουργία – Άνοιγμα σημαφόρου (1/2) #include <semaphore.h> #include <fcntl.h> #include <sys/stat.h> sem_t *my_sem; #define SEM_NAME “my_semaphore_name” Απαραίτητα αρχεία κεφαλίδων Απαραίτητη κοινή μεταβλητή Προαιρετικά: Ορισμός ονόματος σημαφόρου

  17. Δημιουργία – Άνοιγμα σημαφόρου (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αντιγράφεται στην νέα διεργασία.

  18. Κλείδωμα – Απελευθέρωση σεμαφόρου sem_wait(my_sem); /* Εργασίες στην κοινή μνήμη */ sem_post(my_sem); Για κάθε διεργασία που αλλάζει δεδομένα στην κοινή μνήμη, τα οποία μπορούν να αλλάξουν και οι υπόλοιπες διεργασίες: sem_wait(): Μειώνει την τιμή του σεμαφόρου κατά 1. Αν πάρει αρνητική τιμή, μπλοκάρει τη διεργασία εως ότου γίνει πάλι 0.

  19. Η λύση στο παράδειγμά μας

  20. Κλείσιμο-διαγραφή σεμαφόρου • Όλες οι διεργαςίες: • sem_close(my_sem); • Μια μόνο διεργασία: • sem_unlink(SEM_NAME); • ΠΡΟΣΟΧΗ: • Το κλείσιμο και η διαγραφή ενός σημαφόρου είναι • απαραίτητες ενέργειες! •  Διαφορετικά το όνομα και η μνήμη που χρησιμοποιεί ένας σημαφόρος παραμένουν ενεργά στο σύστημα εώς την επόμενη επανεκκίνηση!

  21. Περιεχόμενα • Διαχείριση εργασιών • fork(), exit(), exec() • Επικοινωνία διεργασιών • signals,sockets και client/server, shared memory • Συγχρονισμός διεργασιών • semaphores • Makefiles & bash scripting

  22. Makefile(s) • Eφαρμογήmake • Xρήση για την αυτόματη δημιουργία προγραμμάτων απόαρχεία κώδικα. • Διαδικασία: • Συγγραφή αρχείου Makefile που περιέχει κανόνες • Κλήση εντολής make για την παραγωγή του προγράμματος • Κανόνες: • Αρχείο-στόχος (target) • Αρχεία-απαιτήσεις (prerequisites) • Εντολή παραγωγής στόχου απο απαιτούμενα αρχεία • Παράδειγμα: target : prerequisites command

  23. Παράδειγμα 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

More Related