1 / 14

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

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

binah
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ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 11 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4

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

  3. Διαχείριση ∆ιεργασιών • Ο µοναδικός τρόπος να δηµιουργηθεί µια νέα διεργασία στο UNIXείναι µε την κλήση του συστήµατοςfork • Η διεργασία που καλεί την forkονοµάζεταιγονέας • Η νέα διεργασία ονοµάζεταιπαιδί • Σύνταξη της κλήσης του συστήµατοςfork • pid = fork(); • Οταν επιστρέψει η κλήση της fork • Η δύο διεργασίες έχουν ολόιδια αντίγραφα του χώρου µνήµης (σεεπίπεδο χρήστη) • Εκτός από την τιµή της µεταβλητήςpid • Για την διεργασία-γονέας η pid είναι η ταυτότητα (ID) τηςδιεργασίας-παιδί • Για την διεργασία-παιδί η pid = 0 • Πώς ξεχωρίζουμε στον κώδικα ποια διεργασία είναι παιδί και ποια πατέρας?

  4. Αρχείο simplefork1.c #include <string.h> main() { intpid = 0; printf("hello world\n"); pid = fork(); if (pid == 0) { // Child process executes here printf("this is the child\n"); } else { // parent process executes here printf("this is the parent\n"); } printf("bye\n"); return 0; } Τι θα δείξει η εκτέλεση του προγράμματος?

  5. Αρχείο simplefork2.c #include <string.h> main() { intpid = 0; printf("hello world\n"); pid = fork(); if (pid == 0) { // Child process executes here printf("this is the child\n"); exit(0); } // only the parent process executes this printf("this is the parent\n"); exit(0); }

  6. Αρχείο simplefork3.c #include <string.h> main() { inti = 0; if (fork() == 0) { // Child process executes here i = 1; } printf("My value:%d\n", i); exit(); } Η διεργασία-γονέας εμφανίζει 0 Η διεργασία-παιδί εμφανίζει 1

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

  8. Signals -Εισαγωγή • Ένα signal είναι µια σύντοµη ανακοίνωση που στέλνεται στην διεργασία • Ενηµερώνει για την εµφάνιση ενός ‘σηµαντικού’ γεγονότος Μοιάζει µε τα interrupts • Το στέλνει το ΛΣ (και όχι το υλικό όπως στα interrupts) • Όταν ‘έρθει’ ένα νέο signal • Η ϱοή εκτέλεσης του κώδικα διακόπτεται • Εκτελείται ο signal handler -- χειρίζεται το signal • Επιστρέφει η ϱοή στο σηµείο που έγινε η διακοπή • Υπάρχουν πολλών ειδών signals • Η εντολή kill -lεμφανίζει όλη την λίστα • π.χ. ο diogenisυποστηρίζει: HUP INT QUIT ILL TRAP ABRT BUS FPE KILLUSR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOUURG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS RTMIN RTMIN+1RTMIN+2 RTMIN+3 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX

  9. Βασικά Signals pid_tmy_pid = getpid(); kill(my_pid, SIGSTOP); • Τα πιο βασικά signals µπορούµε να τα στείλουµε µε το πληκτρολογιο • CTRL-C -- ∆ηµιουργεί ένα SIGINT signal • CTRL-Z -- ∆ηµιουργεί ένα SIGTSTP signal • CTRL-\ -- ∆ηµιουργεί ένα SIGABRT signal • Μπορούµε να στείλουµε όλα τα signals από τη γραµµή εντολών • kill -<signal> PID • π.χ. kill -INT 2115στέλνει ένα SIGINT signal στη διεργασία µε PID 2115 • Προγραµµατιστικά µπορούµε να στείλουµεsignals µε την κληση • του συστήµατοςkill(...)

  10. Signal Handlers • Ολα τα signals µπορούµε να τα χειριστούµε, εκτός από τα • KILLsignal -- Η διεργασία τερµατίζει • STOPsignal -- Η διεργασία σταµατάει • Προκαθορισµένοιsignalhandlers • Αν δεν ορίσουµε έναν συγκεκριµένοhandler για κάποιο τύπουsignal το σύστηµαχρησιµοποιεί τους προκαθορισµένους • π.χ. όταν έρθει ένα TERMsignal -- ο προκαθορισµένοςhandlerκάνει exit(...) • Ορίζουµεhandlers µε την κλήση του συστήματος signal(...) • Πρώτη παράμετρος – ο τύπος του signal • ∆εύτερη παράμετρος – η συνάρτηση του handle

  11. Ένας απλός Signal Handler 1/2 void catch_int(intsig_num) { printf("Don’t do that\n"); } ... signal(SIGINT, catch_int); • Οταν ο χρήστης πατήσει CTRL-Cϑα κληθεί η catch_int()και ϑα τυπώσει "Don’tdothat" • Προσοχη: – Αµέσως µετά, το σύστηµαϑα αφαιρέσει τηνcatch_int() από το signal SIGINT • Αν ϑέλουµε η catch_int() να χειρίζεται όλα τα signals τύπουSIGINT πρέπει να το ϑέσουµε ξεκάθαρα • Μέσα στην catch_int()ϑα πρέπει νακαλέσουµε ξανά τηνsignal(SIGINT, catch_int);

  12. Ενας απλός Signal handler 2/2 void catch_int(intsig_num) { signal(SIGINT, catch_int); // re-set for next signal printf("Don’t do that\n"); } • Αν ϑέλουµε η catch_int() να χειρίζεται όλα τα signals τύπουSIGINT πρέπει να το θέσουµε ξεκάθαρα: • Το σύστηµα προσφέρει 2 έτοιµουςsignal handlers • SIG_IGN - Αγνοεί το signal -δηλ. ο handler δεν κάνει τίποτα • signal(SIGINT, SIG_IGN); • SIG_DFL -- Επαναφέρει τον προκαθορισμένο handler • signal(SIGTSTP, SIG_DFL);

  13. Αποφυγή zombie processes /* Avoid "zombie" child-proccesses */ void sig_chld(intsigno){ signal( SIGCHLD, sig_chld ); pid_tpid; int stat; while( (pid=waitpid(-1,&stat,WNOHANG)) > 0){ printf( "Child %d terminated.\n", pid ); } } Υλοποιούµε έναν signal handler Θέτουµεsignal( SIGCHLD, sig_chld );

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

More Related