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

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

Upload: uriel-witt

Post on 01-Jan-2016

31 views

Category:

Documents


4 download

DESCRIPTION

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

TRANSCRIPT

1

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

ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ2ο ΦΡΟΝΤΙΣΤΗΡΙΟ

ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012ΑΙΘΟΥΣΑ Β4

Διαχείριση εργασιών ◦ 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 -

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

Περιεχόμενα

- 14 -

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

Δημιουργία - Άνοιγμα σημαφόρου ◦ 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);

- 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(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