ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι
-
Upload
uriel-witt -
Category
Documents
-
view
29 -
download
4
description
Transcript of ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι
Διαχείριση εργασιών ◦ fork(), exit(), exec()
Επικοινωνία διεργασιών ◦ signals, sockets και client/server, shared memory
Συγχρονισμός διεργασιών◦ semaphores
Makefiles & bash scripting
- 2 -
Περιεχόμενα
Δημιουργία κοινής μνήμης από διεργασία ◦ shmget()
Προσκόλληση διεργασίας στης κοινή μνήμη ◦ shmat()
Αποκόλληση διεργασία; από κοινή μνήμη ◦ shmdt()
Έλεγχος κοινής μνήμης (περιλαμβάνει διαγραφή) ◦ shmctl()
man (shmget) man(shmat) man(shmdt) man(shmctl)
- 5 -
Δημιουργία και χρήση κοινής μνήμης System V IPC Shared Memory
Απαραίτητα αρχεία κεφαλίδων ◦ #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 -
Δημιουργία κοινής μνήμης 1/3
Πρώτη διεργασία (πριν τις κλήσεις fork())
- 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); }
Υπόλοιπες διεργασίες
- 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);
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 -
Περιεχόμενα
Δημιουργία - Άνοιγμα σημαφόρου ◦ sem_open()
Κλείδωμα σημαφόρου ◦ sem_wait()
Απελευθέρωση σημαφόρου ◦ sem_post()
Κλείσιμο σημαφόρου ◦ sem_close()
Διαγραφή σημαφόρου ◦ sem_unlink()
- 15 -
Δημιουργία και χρήση σημαφόρων: POSIX semaphores
Απαραίτητα αρχεία κεφαλίδων
Απαραίτητη κοινή μεταβλητή
Προαιρετικά: Ορισμός ονόματος σημαφόρου
- 16 -
Δημιουργία – Άνοιγμα σημαφόρου (1/2)
#include <semaphore.h> #include <fcntl.h> #include <sys/stat.h>
sem_t *my_sem;
#define SEM_NAME “my_semaphore_name”
Πρώτη διεργασία (πριν τις κλήσεις fork())
Κατά την κλήση της fork(), η μεταβλητή my_sem αντιγράφεται στην νέα διεργασία.
- 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); }
Για κάθε διεργασία που αλλάζει δεδομένα στην κοινή μνήμη, τα οποία μπορούν να αλλάξουν και οι υπόλοιπες διεργασίες:
sem_wait(): Μειώνει την τιμή του σεμαφόρου κατά 1.
Αν πάρει αρνητική τιμή, μπλοκάρει τη διεργασία εως ότου γίνει πάλι 0.
- 18 -
Κλείδωμα – Απελευθέρωση σεμαφόρου
sem_wait(my_sem); /* Εργασίες στην κοινή μνήμη */ sem_post(my_sem);
Όλες οι διεργαςίες: ◦ 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(s)
- 23 -
Παράδειγμα Makefilehello: hello.o main.o
gcc hello.o main.o -o hello.o
hello.o: hello.cgcc -Wall -c hello.c
main.o: main.cgcc -Wall -c main.c
Makefile
terminal$ makegcc -Wall -c hello.cgcc -Wall -c main.cgcc hello.o main.o -o hello$ makemake: `hello' is up to date.$ vi main.c$ makegcc -Wall -c main.cgcc hello.o main.o -o hello