Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4. Λειτουργικά Συστήματα- Φροντιστήριο 2

Σχετικά έγγραφα
Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Προγραμματισμός συστημάτων UNIX/POSIX. Σήματα (signals)

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

Εργαστήριο 5 fork(), exec(), signals

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Εργαστήριο 7 fork(), exec(), signals

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Προγραμματισμός συστημάτων UNIX/POSIX

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

Λειτουργικά Συστήματα

Διάλεξη 14: Διεργασίες: Έλεγχος & Σήματα (Processes: Control & Signals)

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

4 η ιάλεξη: Signals UDP Sockets

UNIX System Programming

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

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

Χρονοδρομολογητής Κυκλικής Επαναφοράς

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος Κανονική Εξέταση Λύσεις

Διεργασίες και Νήματα (1/2)

Προγραμματισμός Διαχείρισης Συστημάτων ΙΙ

Λειτουργικά Συστήματα (Λ/Σ)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Περιγραφή και Έλεγχος ιεργασιών

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραµµατισµός 2 The shell

Παράλληλη Επεξεργασία

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Εισαγωγή στον Προγραμματισμό

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Λειτουργικά Συστήματα

Δομημένος Προγραμματισμός

Εργαστήριο Λειτουργικών Συστημάτων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

Η γλώσσα προγραμματισμού C

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Η γλώσσα προγραμματισμού C

Διάλεξη 5η: Εντολές Επανάληψης

Εγκατάσταση λογισμικού και αναβάθμιση συσκευής Device software installation and software upgrade

Διαδικασιακός Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Λειτουργικά Συστήματα (ΗΥ321)

Κεφάλαιο : Επαναλήψεις (for, do-while)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Παράλληλη Επεξεργασία

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Μεθόδων Επίλυσης Προβλημάτων

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Σήματα (Signals) Προγραμματισμός II 1

Προγραμματισμός Η/Υ (ΤΛ2007 )

Ανάπτυξη και Σχεδίαση Λογισμικού

Παράδειγµα χρήσης perror, errno (πρόγραµµα errors_demo.c)

Δομημένος Προγραμματισμός (ΤΛ1006)

Σήματα (Signals) Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Σήματα (Signals) Προγραμματισμός II 1

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Εργαστήριο Λειτουργικών Συστημάτων. Inside System Calls

Εισαγωγή στον Προγραμματισμό

scanf() scanf() stdin scanf() printf() int float double %lf float

Συναρτήσεις. Εισαγωγή

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Εργαστήριο Λειτουργικών Συστημάτων Ακ. Έτος Άσκηση 4. Πλήθος οπών <tab> Μέσο μέγεθος σε mb

Λειτουργικά Συστήματα

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

Κεφάλαιο 11 Διαχείριση Διεργασιών

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Διεργασίες - Σύνοψη. Διακοπές, προνομιούχος κατάσταση Κλήσεις συστήματος. Ορισμός, μεταβάσεις κατάστασης κύκλος ζωής

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Εισαγωγικά & Βασικές Έννοιες

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Μάθημα 1 ο ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΤΩΝ ΛΕΙΤΟΥΡΓΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Κεφάλαιο 1ο Πολυπρογραμματισμός Πολυδιεργασία Κατηγορίες Λειτουργικών Συστημάτων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Προγραμματισμός συστημάτων UNIX/POSIX

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Transcript:

Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4 Φροντιστήριο 2 1

Λειτουργικό Σύστημα -> Multitasking Κάθε διεργασία μπορεί να ειδωθεί σαν μία δέσμη στοιχείων που διατηρούνται από τον πυρήνα για να ελέγχει και να διαχειρίζεται όλα αυτά τα tasks Processes: Διαχείριση Επικοινωνία Συγχρονισμός Φροντιστήριο 2 2

Εργαλεία: fork() :create a child process exit(): causes normal process termination exec(): replaces the current process image Φροντιστήριο 2 3

Εργαλεία: signals: asynchronous notification sockets και client/server shared memory Φροντιστήριο 2 4

Εργαλεία: Semaphors: control access to a common resource Φροντιστήριο 2 5

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

#include <string.h> #include <stdio.h> main() { int pid = 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; Φροντιστήριο 2 7

#include <string.h> main() { int pid = 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); Φροντιστήριο 2 8

#include <string.h> main() { int i = 0; if (fork() == 0) { // Child process executes here i = 1; printf("my value:%d\n", i); exit(0); Φροντιστήριο 2 9

Το ΛΣ στέλνει ένα signal στη διεργασία για να την ενημερώσει για κάποιο γεγονός. 1) Εκτέλεση Διεργασίας 2) Γεγονός 3) Signal 4) Διακοπή Εκτέλεσης Διεργασίας 5) Signal Handler 6) Συνέχιση Εκτέλεσης Διεργασίας Φροντιστήριο 2 10

Kill l: list signal names Tα πιο βασικά signals μπορούμε να τα στείλουμε με το πληκτρολόγιο CTRL-C -> SIGINT =Terminate CTRL-Z -> SIGTSTP = Suspend execution CTRL-\ -> SIGABRT = Abort Επίσης έχουμε: SIGCHLD: sent to the parent of a child process when it exits, is interrupted, or resumes after being interrupted. By default the signal is simply ignored. One common usage of the signal is to instruct the operating system to clean up the resources used by a child process after its termination without an explicit call to the wait system call (βλ handler για zombie processes). SIGCONT (πχ με fg από το terminal): signal instructs the operating system to continue (restart) a process previously paused by the SIGSTOP or SIGTSTP signal SIGSEGV: sent to a process when it makes an invalid virtual memory reference. Φροντιστήριο 2 11

Μπορούμε να στείλουμε όλα τα signals από τη γραμμή εντολών kill -<signal> PID π.χ. kill -SIGINT 2115 στέλνει ένα SIGINT signal στη διεργαςία με PID 2115 Προγραμματιστικά μπορούμε να στείλουμε signals με την κληση του συστήματος kill(...) pid_t my_pid = getpid(); kill(my_pid, SIGSTOP); Φροντιστήριο 2 12

Ολα τα signals μπορούµε να τα χειριστούµε, εκτός από τα SIGKILL signal -- Η διεργασία τερµατίζει SIGSTOP signal -- Η διεργασία σταµατάει Προκαθορισμένοι signal handlers Αν δεν ορίσουµε έναν συγκεκριµένο handler για κάποιο τύπου signal το σύστηµα χρησιµοποιεί τους προκαθορισµένους π.χ. όταν έρθει ένα TERM signal -- ο προκαθορισµένος handler κάνει exit(...) Ορίζουµε handlers µε την κλήση του συστήματος signal(...) Πρώτη παράμετρος ο τύπος του signal εύτερη παράμετρος η συνάρτηση του handle Φροντιστήριο 2 13

void catch_int(int sig_num) { printf("don t do that\n");... signal(sigint, catch_int); Οταν ο χρήστης πατήσει CTRL-C ϑα κληθεί η catch_int() και ϑα τυπώσει "Don t do that" Προσοχη: Αµέσως µετά, το σύστηµα ϑα αφαιρέσει την catch_int() από το signal SIGINT Αν ϑέλουµε η catch_int() να χειρίζεται όλα τα signals τύπου SIGINT πρέπει να το ϑέσουµε ξεκάθαρα Μέσα στην catch_int() ϑα πρέπει να καλέσουµε ξανά την signal(sigint, catch_int); Φροντιστήριο 2 14

Αν ϑέλουµε η catch_int() να χειρίζεται όλα τα signals τύπου SIGINT πρέπει να το θέσουµε ξεκάθαρα: void catch_int(int sig_num) { signal(sigint, catch_int); printf("don t do that\n"); Δηλαδή, κάθε φορά που καλείται η συνάρτηση του handler ορίζει ότι την επόμενη φορά θα καλείται ο ίδιος ο handler. Το σύστηµα προσφέρει 2 έτοιµους signal handlers SIG_IGN - Αγνοεί το signal -δηλ. ο handler δεν κάνει τίποτα signal(sigint, SIG_IGN); SIG_DFL -- Επαναφέρει τον προκαθορισμένο handler signal(sigtstp, SIG_DFL); Φροντιστήριο 2 15

#include <stdio.h> #include <unistd.h> #include <signal.h> void sigint_handler (int signum) { printf("got SIGINT\n"); signal(sigint, sigint_handler); //make sure that next time SIGINT will be handled by this handler. int main(void) { signal(sigint, sigint_handler); printf("pid is %d\n", getpid()); while (1) sleep(1); Έστω signal.c το παραπάνω στο getit. Κάντε gcc -Wall -o signal signal.c και μετά./signal. Τι εμφανίζει; Μετά πατήστε ctrl-c και μετά ctrl-z. Τώρα; Μετά, ανοίξτε ένα άλλο terminal window και πληκτρολογήστε kill -SIGINT <PID> και έπειτα στο άλλο τερματικό fg. Τι συμβαίνει; Τέλος πληκτρολογούμε ctrl-\. Μπορείτε να κατανοήσετε ποια signals «έπαιξαν» στην παραπάνω περίπτωση; Φροντιστήριο 2 16

Υλοποιούµε έναν signal handler Θέτουµε signal( SIGCHLD, sig_chld ); /* Avoid "zombie" child-proccesses */ void sig_chld(int signo){ signal( SIGCHLD, sig_chld ); pid_t pid; int stat; while( (pid=waitpid(-1,&stat,wnohang)) > 0){ printf( "Child %d terminated.\n", pid ); Αυτός ο handler μπορεί να χρησιμοποιηθεί σαν black box (κυκλοφορεί στην βιβλιογραφία) Μας κάνει να είμαστε σίγουροι πως ο γονιός δεν θα πεθάνει νωρίτερα από τα παιδιά του έτσι ώστε να τα αφήσει στο σύστημά μας σαν zombies. Φροντιστήριο 2 17