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

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

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

Transcript

1 ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ & ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Εισαγωγή στην χρήση πρωτογενών κλήσεων του UNIX Γ. ΠΑΠΑΚΩΝΣΤΑΝΤΙΝΟΥ Π. ΤΣΑΝΑΚΑΣ

2 C.S.Lab, Copyright Επιμέλεια: Π. Θεοδωρόπουλος Σχήματα: Ι. Δροσίτης

3 ΠΕΡΙΕΧΟΜΕΝΑ ΠΕΡΙΕΧΟΜΕΝΑ... i I. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΠΡΩΤΟΓΕΝΕΙΣ ΚΛΗΣΕΙΣ ΤΟΥ UNIX Η ΕΝΝΟΙΑ ΤΩΝ ΠΡΩΤΟΓΕΝΩΝ KΛΗΣΕΩΝ ΠΡΩΤΟΓEΝΕΙΣ ΚΛΗΣΕΙΣ ΣΤΟ UNIX Χειρισμός Λαθών ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ Συνήθη Αρχεία Η κλήση creat Η κλήση open Η κλήση close Οι κλήσεις read και write Τυχαία προσπέλαση: Η κλήση lseek Η κλήση chmod Η κλήση stat Ένα ολοκληρωμένο παράδειγμα Κατάλογοι Η κλήση mkdir Η κλήση rmdir Η κλήση chdir Οι κλήσεις link/unlink ΣΥΣΤΗΜΑ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ Κλήσεις δημιουργίας και τερματισμού διεργασιών Η κλήση fork Οι κλήσεις execl/execv Οι κλήσεις wait & exit Διαχείριση μνήμης Συγχρονισμός και Επικοινωνία διεργασιών Τα σήματα (signals) Ένα ολοκληρωμένο πρόγραμμα Η ανεπάρκεια των σημάτων για το συγχρονισμό διεργασιών Επικοινωνία μεταξύ διεργασιών: Σωληνώσεις (pipes) ΣΗΜΑΤΟΦΟΡΕΙΣ ΣΤΟ UNIX Συναρτήσεις χειρισμού σηματοφορέων Υλοποιήσεις Σηματοφορέων Υλοποίηση δυαδικού σηματοφορέα με απασχόληση-αναμονή Υλοποίηση γενικών σηματοφορέων με τη χρήση σωληνώσεων Υλοποίηση γενικών σηματοφορέων με διεργασία-συντονιστή Παραδείγματα Εφαρμογών Δυο διεργασίες: Μοντέλο Παραγωγού - Καταναλωτή ΠΕΡΙΕΧΟΜΕΝΑ i

4 Πολλές διεργασίες: Παράλληλη εύρεση μεγίστου στοιχείου πίνακα II. ΑΠΛΟΠΟΙΗΜΕΝΕΣ ΣΥΝΑΡΤΗΣΕΙΣ ΧΕΙΡΙΣΜΟΥ IPC ΣΤΟ UNIX...35 III. ΒΙΒΛΙΟΓΡΑΦΙΑ ii ΠΕΡΙΕΧΟΜΕΝΑ

5 I. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΠΡΩΤΟΓΕΝΕΙΣ ΚΛΗΣΕΙΣ ΤΟΥ UNIX Στο κείμενο που ακολουθεί δίνουμε μια εισαγωγική παρουσίαση των πιο σημαντικών πρωτογενών κλήσεων (system calls) του λειτουργικού συστήματος UNIX. Αρχικά δίνεται η γενική έννοια των πρωτογενών κλήσεων σε ένα ΛΣ (παραγρ. 1) και μερικές γενικές πληροφορίες για τις πρωτογενείς κλήσεις του UNIX (παραγρ. 2). Παρουσιάζονται πρωτογενείς κλήσεις χειρισμού αρχείων, καταλόγων, εισόδου/εξόδου (παραγρ. 3&4), αλλά η έμφαση δίνεται στους μηχανισμούς και τις κλήσεις ελέγχου διεργασιών (παραγρ. 5). Με βάση τις κλήσεις που παρουσιάστηκαν, προτείνονται και συγκρίνονται στη συνέχεια διάφοροι τρόποι υλοποίησης σηματοφορέων στο UNIX (παραγρ. 6). Τελειώνουμε με σχολιασμένη βιβλιογραφία και παράρτημα των κλήσεων που παρουσιάστηκαν. 1. Η ΕΝΝΟΙΑ ΤΩΝ ΠΡΩΤΟΓΕΝΩΝ KΛΗΣΕΩΝ Όπως γνωρίζουμε, ένα Λειτουργικό Σύστημα αποτελεί ένα ενδιάμεσο στρώμα ανάμεσα στη γυμνή μηχανή (hardware) και στις διεργασίες/εφαρμογές των χρηστών (software) που από εδώ και στο εξής θα ονομάζουμε για συντομία εφαρμογές (Σχήμα 1). Για λόγους ασφαλείας, στις περισσότερες μηχανές κάθε εφαρμογή βλέπει ένα δικό της εικονικό χώρο διευθύνσεων και δεν έχει δυνατότητα προσπέλασης στο χώρο διευθύνσεων του ΛΣ. Με τον τρόπο αυτό δεν είναι λ.χ. δυνατό σε μια εφαρμογή να εκτελέσει μια εντολή της μορφής: JMP ρουτίνα_λειτουργικού_συστήματος γεγονός που θα της επέτρεπε να γίνει Λειτουργικό Σύστημα στη θέση του ΛΣ σφετεριζόμενη έτσι τις αυξημένες δικαιοδοσίες του ΛΣ πάνω στη μηχανή και θέτοντας σε κίνδυνο τις υπόλοιπες εφαρμογές που τρέχουν στο σύστημα. Στα περισσότερα ΛΣ, η επικοινωνία μιας εφαρμογής με το ΛΣ γίνεται μέσω αυστηρά τυποποιημένων πρωτογενών κλήσεων (primitive calls ή system calls). Όταν μια εφαρμογή ζητά οποιαδήποτε υπηρεσία από το ΛΣ (παραχώρηση περισσότερης μνήμης, άνοιγμα/κλείσιμο αρχείων, είσοδος/έξοδος δεδομένων, κλπ.), τότε η αίτηση αυτή διατυπώνεται δια μέσου της κατάλληλης κάθε φορά πρωτογενούς κλήσης. Το σύνολο των πρωτογενών κλήσεων είναι ο μοναδικός σύνδεσμος των εφαρμογών με το ΛΣ και για το λόγο αυτό ορίζουν το ΛΣ στο επίπεδο των εφαρμογών. Σε ένα καλά σχεδιασμένο ΛΣ, καμμιά εφαρμογή δεν πρέπει να είναι σε θέση να παρακάμψει, ακούσια ή εκούσια, το μηχανισμό των πρωτογενών κλήσεων και να καλέσει απ ευθείας κάποια ρουτίνα του ΛΣ. Στο επίπεδο κώδικα μηχανής οι πρωτογενείς κλήσεις υλοποιούνται με την εκτέλεση εντολών της μορφής: TRAP αριθμός_κλήσεως Η εντολή TRAP ανήκει στην κατηγορία εντολών που ονομάζονται παγίδες. Οι παγίδες είναι μια ειδική μορφή κλήσεως υπορουτίνας, κάτι σαν σήμα διακοπής προερχόμενο από το λογισμικό (software interrupt). Όταν η ΚΜΕ συναντήσει μια εντολή παγίδας, ο έλεγχος μεταφέρεται σε μια προκαθορισμένη διεύθυνση της μνήμης ενώ συγχρόνως η ΚΜΕ μεταφέρεται στο χώρο διευθύνσεων του ΛΣ. Η ρουτίνα εξυπηρέτησης παγίδων, η οποία ξεκινά από εκείνη τη διεύθυνση, αναγνωρίζει το είδος της πρωτογενούς κλήσεως που ζητάμε με βάση την παράμετρο της εντολής TRAP και μεταφέρει τον έλεγχο στο αντίστοιχο υποπρόγραμμα του ΛΣ. Οι πρωτογενείς κλήσεις ελέγχουν πρώτα αν η αίτηση του χρήστη είναι νόμιμη και ασφαλής για το σύστημα. Εφ όσον αυτό συμβαίνει, διεκπεραιώνεται η αιτούμενη υπηρεσία. Μετά το πέρας της εκτέλεσης μιας πρωτογενούς κλήσεως, ο έλεγχος μεταφέρεται συνήθως στο χρονοδρομολογητή (scheduler) ο οποίος αποφασίζει αν θα συνεχιστεί αμέσως η τρέχουσα διεργασία ή αν στη θέση της θα δρομολογηθεί κάποια άλλη. Η ΕΝΝΟΙΑ ΤΩΝ ΠΡΩΤΟΓΕΝΩΝ KΛΗΣΕΩΝ 1

6 ( The users ) Shells and commands Compilers and interpreters System libraries System call interface to the kernel Signals Terminal handling Character I/O system Terminal drivers File system Swapping Block I/O system Disk and tape drivers CPU scheduling Page replacement Demand paging Virtual memory Terminal controllers Terminals Kernel interface to the hardware Device controllers Disks and tapes Memory controllers Physical memory Σχήμα 1: Τα διάφορα στρώματα του ΛΣ UNIX Με το μηχανισμό των πρωτογενών κλήσεων οι εφαρμογές μπορούν να κάνουν χρήση όλων των υπηρεσιών του ΛΣ και ταυτόχρονα το ΛΣ να διατηρεί πλήρη έλεγχο επάνω τους. Το θέμα της υλοποίησης των πρωτογενών κλήσεων του UNIX σε επίπεδο μηχανής, αλλά και οι δομές δεδομένων του πυρήνα και η γενικότερη σχεδίαση του, εξετάζεται στο [BACH87]. 2 Η ΕΝΝΟΙΑ ΤΩΝ ΠΡΩΤΟΓΕΝΩΝ KΛΗΣΕΩΝ

7 2. ΠΡΩΤΟΓEΝΕΙΣ ΚΛΗΣΕΙΣ ΣΤΟ UNIX Εργαστήριο Λειτουργικών Συστημάτων Το ΛΣ UNIX είναι γραμμένο σχεδόν εξ ολοκλήρου στη γλώσσα υψηλού επιπέδου C. Κάθε χρήστης ο οποίος χρησιμοποιεί τη C για να γράψει τις εφαρμογές του, μπορεί να καλέσει οποιαδήποτε πρωτογενή κλήση του UNIX μέσα από το πρόγραμμά του σαν να ήταν αυτή ένα κοινό υποπρόγραμμα (συνάρτηση) της γλώσσας. Αυτό επιτυγχάνεται με τη χρήση ειδικής βιβλιοθήκης που για κάθε πρωτογενή κλήση του λειτουργικού περιέχει μια αντίστοιχη ρουτίνα. Κάθε τέτοια ρουτίνα το μόνο που έχει να κάνει είναι να περάσει τις παραμέτρους της στις σωστές διευθύνσεις και να ζητήσει με κατάλληλο τρόπο από το λειτουργικό σύστημα την εξυπηρέτηση της αντίστοιχης κλήσης. Με το τέχνασμα αυτό, στον προγραμματιστή φαίνεται ότι ο μεταγλωττιστής αυτόματα αναγνωρίζει τις κλήσεις συναρτήσεων που αναφέρονται σε πρωτογενείς κλήσεις και παράγει γι αυτές ιδιαίτερο κώδικα. Για παράδειγμα, προκειμένου να ανοίξουμε ένα αρχείο για διάβασμα θα εκτελούσαμε την πρωτογενή κλήση: fd = open( /usr/user/example, O_RDONLY); σαν να ήταν η κλήση open() μια κοινή συνάρτηση της C. Στις επόμενες παραγράφους θα παρουσιάσουμε ένα υποσύνολο των πιο σημαντικών πρωτογενών κλήσεων του UNIX όπως αυτές μπορούν να κληθούν μέσα από τη γλώσσα C. Η σύνταξη κάθε κλήσεως θα δίνεται σε συμφωνία με τη σύμβαση που ακολουθείται στο Unix Programmer s Manual (UPM). Για παράδειγμα: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int oflag, /* mode_t mode */...); Η παραπάνω κλήση open() δέχεται σαν παραμέτρους ένα δείκτη σε χαρακτήρες (συμβολοσειρά) path και έναν ακέραιο oflag, επιστρέφει δε ως αποτέλεσμα έναν ακέραιο αριθμό. Οι εντολές #include πριν από μια κλήση (όταν υπάρχουν) σημαίνουν ότι για να χρησιμοποιήσουμε τη συγκεκριμένη κλήση στο πρόγραμμά μας, θα πρέπει να τοποθετήσουμε τις εντολές #include στην κορυφή του πηγαίου αρχείου μας Χειρισμός Λαθών Στη διάρκεια μιας πρωτογενούς κλήσεως μπορεί να προκύψουν λάθη που εμποδίζουν την διεκπεραίωση της αιτουμένης υπηρεσίας από το ΛΣ. Για παράδειγμα, μια κλήση open() μπορεί να αποτύχει, είτε γιατί το ζητούμενο αρχείο δεν υπάρχει, είτε γιατί δεν επιτρέπεται η προσπέλαση του από την εφαρμογή μας, είτε τέλος γιατί υπάρχουν ήδη πάρα πολλά ανοικτά αρχεία (βλ. παραγρ ). Σε όλες τις περιπτώσεις σφάλματος, οι πρωτογενείς κλήσεις επιστρέφουν πίσω στην εφαρμογή την τιμή -1, ενώ θέτουν και στην μεταβλητή errno μια τιμή που αντιπροσωπεύει το είδος του σφάλματος που συνέβει. #include <errno.h> int errno; Οι τιμές αυτές περιγράφονται με συμβολικές σταθερές μέσω δηλώσεων #define στο αρχείο <errno.h>. Πρέπει να σημειώσουμε ότι η μεταβλητή errno αρχικοποιείται στην τιμή 0 όταν ξεκινά η εκτέλεση ενός προγράμματος και τίθεται (set) στην κατάλληλη τιμή σφάλματος όταν συμβεί κάποιο λάθος χωρίς όμως να μηδενίζεται (cleared) μετά από ακόλουθες επιτυχείς κλήσεις συστήματος. Δηλαδή, τελικά η μεταβλητή errno περιέχει τον κωδικό του τελευταίου λάθους που συνέβει, χωρίς αυτό να σημαίνει ότι αυτό αντιστοιχεί στην τελευταία πρωτογενή κλήση που έγινε στο πρόγραμμά μας. Στις περιπτώσεις που έχει συμβεί κάποιο λάθος ο χρήστης μπορεί να καλέσει τη συνάρτηση βιβλιοθήκης: #include <stdio.h> void perror(const char *s); ΠΡΩΤΟΓEΝΕΙΣ ΚΛΗΣΕΙΣ ΣΤΟ UNIX 3

8 η οποία τυπώνει τη συμβολοσειρά s ακολουθούμενη από άνω-κάτω τελεία : (colon), ένα κενό διάστημα (space), ένα επεξηγηματικό μήνυμα του συστήματος που περιγράφει ποιο ακριβώς σφάλμα συνέβει και έναν χαρακτήρα νέας γραμμής (newline). Σημειώνουμε ότι αν το μήνυμα είναι κενό ( ) ή δείκτης NULL τότε η άνω-κάτω τελεία και το κενό διάστημα δεν τυπώνονται. Στη συνέχεια δίνουμε μια μικρή συνάρτηση error η οποία καλείται από το χρήστη μετά την αποτυχημένη επιστροφή κάποιας πρωτογενούς κλήσης. Η συνάρτηση τυπώνει τις παραμέτρους της (ένα μήνυμα που παρέχεται από το χρήστη) και στη συνέχεια καλεί την perror() για να τυπωθεί και το είδος του σφάλματος που προκάλεσε την αποτυχία της πρωτογενούς κλήσεως. Συστήνουμε στους αναγνώστες τη χρήση της συνάρτησης error κατά τη διάρκεια των πειραματισμών τους με τις πρωτογενείς κλήσεις του UNIX. #include <stdio.h> error(char *s1, char *s2) fprintf(stderr, sl, s2); perror( Reason ); exit(-1); Η κλήση error θα μπορούσε να ενσωματωθεί σε ένα πρόγραμμα ως εξής: if ( (fd=open(filename, O_RDONLY)) == -1 ) error( Cannot open file %s, filename); και προκαλεί την εκτύπωση μηνυμάτων όπως: Cannot open file /etc/passwd Reason: Permission denied (μήνυμα χρήστη) (είδος σφάλματος) 4 ΠΡΩΤΟΓEΝΕΙΣ ΚΛΗΣΕΙΣ ΣΤΟ UNIX

9 3. ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ Το σύστημα αρχείων του UNIX υποστηρίζει 3 τύπους αρχείων: (i) Συνήθη αρχεία (ii) Καταλόγους (directories) και (iii) Ειδικά αρχεία ή αρχεία συσκευών (device files) Τα αρχεία συσκευών αποτελούν στη πραγματικότητα μια σύνδεση με τις περιφερειακές μονάδες του συστήματος. Για το λόγο αυτό θα τα εξετάσουμε στην παράγραφο 4. Στην παράγραφο αυτή θα παρουσιάσουμε τις σημαντικότερες πρωτογενείς κλήσεις χειρισμού συνηθισμένων αρχείων και καταλόγων. Η εσωτερική υλοποίηση του συστήματος αρχείων του UNIX περιγράφεται στα BACH[87], LEFF[89] Συνήθη Αρχεία Με τον όρο συνήθη αρχεία εννοούμε το σύνολο σχεδόν των αρχείων με τα οποία ερχόμαστε σε επαφή όταν εργαζόμαστε στο σύστημα. Τα αρχεία κειμένου που παράγει ένας επεξεργαστής κειμένου (editor), τα εκτελέσιμα αρχεία (executables) που παράγουν οι μεταγλωττιστές (compilers), τα αρχεία δεδομένων που παράγουν οι εφαρμογές, όλα αποτελούν για το UNIX τον ίδιο τύπο αρχείου. Τα αρχεία του UNIX είναι απλά μια μονοδιάστατη ακολουθία από bytes και δεν διακρίνονται σε αρχεία κειμένου (text files) και δυαδικά αρχεία (binary files) όπως σε άλλα λειτουργικά συστήματα. Δεν υπάρχει δόμηση σε εγγραφές και πεδία σε επίπεδο ΛΣ ούτε και υποστηρίζονται πολύπλοκες οργανώσεις αρχείων (π.χ. σειριακά με δείκτη). Οι σημαντικότερες πρωτογενείς κλήσεις χειρισμού κοινών αρχείων στο UNIX είναι: creat - Δημιουργεί ένα νέο αρχείο open - Ανοίγει ένα (ήδη υπάρχον) αρχείο close - Κλείνει ένα ανοικτό αρχείο read - Διάβασμα δεδομένων από ένα αρχείο write - Γράψιμο δεδομένων προς ένα αρχείο lseek - Μετακίνηση δείκτη ανάγνωσης/εγγραφής του αρχείου για τυχαία προσπέλαση chmod - Αλλάζει τα δικαιώματα προσπέλασης ενός αρχείου stat - Επιστρέφει πληροφορίες για ένα αρχείο Η κλήση creat #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat(const char *path, mode_t mode); Η κλήση creat() δημιουργεί ένα νέο αρχείο με όνομα path και ταυτόχρονα το ανοίγει για γράψιμο. Αν το αρχείο προϋπάρχει, τα προηγούμενα περιεχόμενά του καταστρέφονται. Η παράμετρος mode καθορίζει τα δικαιώματα προσπέλασης του νέου αρχείου και εξετάζεται παρακάτω, στην περιγραφή της κλήσης chmod() (παραγρ ). ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ 5

10 Παράδειγμα: fd=creat("newfile", 0644); Η κλήση open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int oflag, /* mode_t mode */...); Η κλήση open() ανοίγει το αρχείο με όνομα path, που πρέπει γενικά ήδη να προϋπάρχει. Η παράμετρος oflag καθορίζει τον τρόπο ανοίγματος και παίρνει τιμές: O_RDONLY (= 0x00) Άνοιγμα για διάβασμα μόνο O_WRONLY (= 0x01) Άνοιγμα για γράψιμο μόνο O_RDWR (= 0x02) Άνοιγμα για διάβασμα και γράψιμο Στο αρχείο <fcntl.h> ορίζονται αυτές και μερικές άλλες συμβολικές σταθερές οι οποίες μπορούν να συνδυαστούν με λογικό ή (OR) με τις παραπάνω και να περαστούν στη θέση της παραμέτρου oflag για να πετύχουμε και άλλους τρόπους ανοίγματος. Για παράδειγμα: O_APPEND (= 0x08) Άνοιγμα για γράψιμο στο τέλος του αρχείου πάντα O_CREAT (= 0x100) Το αρχείο δημιουργείται αν δεν υπάρχει και έχει ανοιχθεί για γράψιμο O_TRUNC (= 0x200) Το μέγεθος του αρχείου μηδενίζεται αν έχει ανοιχθεί για γράψιμο Παράδειγμα: fd = open( /tmp/scratch, O_WRONLY O_CREAT); Οι κλήσεις creat() και open() επιστρέφουν σαν αποτέλεσμα ένα μικρό θετικό ακέραιο fd (ή -1 σε περίπτωση σφάλματος). Ο ακέραιος αυτός ονομάζεται περιγραφητής του αρχείου (file descriptor) και χρησιμοποιείται σε όλες τις υπόλοιπες κλήσεις για αναφορά στο παραπάνω αρχείο. Στην πραγματικότητα ο περιγραφητής ενός αρχείου είναι ένας δείκτης στον πίνακα ανοικτών αρχείων που διατηρεί εσωτερικά κάθε διεργασία. Το μέγεθος του πίνακα αυτού είναι περιορισμένο για κάθε διεργασία και αποτελεί σταθερά του συστήματος. Έτσι κάθε διεργασία μπορεί να έχει ταυτόχρονα ανοικτά συγκεκριμένο αριθμό αρχείων, που στα σύγχρονα λειτουργικά συστήματα UNIX είναι συνήθως το πολύ μέχρι 32 ή 64 αρχεία. Όπως γνωρίζουμε, πριν ξεκινήσει την εκτέλεση μιας εφαρμογής, ο φλοιός του UNIX ανοίγει αυτόματα 3 αρχεία: το προκαθορισμένο αρχείο εισόδου (standard input, stdin), το προκαθορισμένο αρχείο εξόδου (standard output, stdout) και το προκαθορισμένο αρχείο διαγνωστικών μηνυμάτων (standard error, stderr). Τα αρχεία αυτά έχουν περιγραφητές, 0, 1 και 2 αντίστοιχα Η κλήση close #include <unistd.h> int close(int fd); Η κλήση close() κλείνει ένα αρχείο με περιγραφητή fd. 6 ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ

11 Οι κλήσεις read και write Αφού ανοίξουμε ένα αρχείο μπορούμε εύκολα να μεταφέρουμε δεδομένα από/προς αυτό με τη βοήθεια των κλήσεων: #include <unistd.h> ssize_t read(int fd, void *buf, size_t nbyte); ssize_t write(int fd, const void *buf, size_t nbyte); Στις παραπάνω κλήσεις η παράμετρος fd είναι ο περιγραφητής του αρχείου, nbyte είναι ο αριθμός των bytes που επιθυμούμε να μεταφερθούν και buf είναι η αρχική διεύθυνση της περιοχής όπου βρίσκονται αποθηκευμένα (ή όπου θα αποθηκευθούν) τα bytes αυτά. Οι κλήσεις read() και write() επιστρέφουν πίσω μια ακέραια τιμή η οποία δηλώνει πόσα bytes μεταφέρθηκαν στη πραγματικότητα. Ο αριθμός αυτός συχνά δεν είναι ίσος με nbyte. Στην περίπτωση της κλήσης read() αυτό συνήθως σημαίνει ότι φτάσαμε στο τέλος του αρχείου προτού διαβαστούν και τα nbyte καθορισμένα bytes. Στην περίπτωση της κλήσης write() πάλι, μια τέτοια ασυμφωνία δηλώνει κάποιο λάθος στο σύστημα εισόδου/εξόδου. Η κλήση read() επιστρέφει 0 αν επιχειρήσουμε να διαβάσουμε πέρα από το τέλος ενός αρχείου. Παράδειγμα: Το ακόλουθο τμήμα προγράμματος μεταφέρει τα περιεχόμενα του αρχείου example στο standard output (περιγραφητής 1): char buf[size]; int fd, n; : fd = open( example, 0); /* Ανοίγουμε το αρχείο για διάβασμα */ : while ( (n=read(fd, buf, sizeof buf)) > 0 ) write(1, buf, n); Τυχαία προσπέλαση: Η κλήση lseek Συσχετισμένος με κάθε ανοικτό αρχείο είναι ένας δείκτης (file pointer) ο οποίος περιέχει τον αύξοντα αριθμό του byte του αρχείου που θα διαβαστεί (θα γραφτεί) με την επόμενη κλήση read() (write()). Ο δείκτης αυτός ξεκινά από την τιμή 0 μόλις ανοίξουμε ένα αρχείο και αυξάνεται αυτόματα μετά από κάθε κλήση read() (write()). Με την κλήση lseek() μας δίνεται η δυνατότητα να δώσουμε στο δείκτη αυτό μια αυθαίρετη τιμή, αναγκάζοντας έτσι τις επόμενες εντολές read() (write()) να διαβάσουν (να γράψουν) δεδομένα στο επιθυμητό σημείο του αρχείου. Τονίζουμε ότι η κλήση lseek() δεν προκαλεί μεταφορά δεδομένων από ή προς το αρχείο. Η σύνταξη της κλήσης lseek() είναι: #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); όπου fd είναι ο περιγραφητής του αρχείου. Η παραπάνω κλήση lseek() μετακινεί το δείκτη του αρχείου κατά οffset bytes σε σχέση με τη θέση αναφοράς που καθορίζει η τρίτη παράμετρος whence. Η παράμετρος whence είναι ένας ακέραιος αριθμός που παίρνει τιμές: SEEK_SET SEEK_CUR SEEK_END (=0) Το offset λαμβάνεται σχετικά με την αρχή του αρχείου (=1) Το οffset λαμβάνεται σχετικά με την τρέχουσα θέση στο αρχείο (=2) Το οffset λαμβάνεται σχετικά με το τέλος του αρχείου ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ 7

12 Η παράμετρος offset είναι τύπου long και μπορεί να είναι είτε θετική είτε αρνητική (μετακίνηση δείκτη μπροστά ή πίσω αντίστοιχα). Η κλήση lseek() επιστρέφει σαν τιμή την νέα απόλυτη θέση του δείκτη του αρχείου. Παραδείγματα: /* Μετακίνηση στο τέλος του αρχείου */ lseek(fd, 0L, SEEK_END); /* Μετακίνηση στην αρχή - rewind */ lseek(fd, 0L, SEEK_SET); /* Οπισθοδρόμηση κατά ένα χαρακτήρα */ lseek(fd, -1L, SEEK_CUR); Η κλήση chmod #include <sys/types.h> #include <sys/stat.h> int chmod(const char *path, mode_t mode); Η κλήση chmod() (change mοde) αλλάζει τα δικαιώματα προσπέλασης (access mοde) του αρχείου με όνομα path σύμφωνα με την τιμή της παραμέτρου mοde. Mόνον ο ιδιοκτήτης ενός αρχείου μπορεί να εκτελέσει την κλήση chmod(). Τα δικαιώματα προσπέλασης ενός αρχείου καθορίζονται από έναν δυαδικό αριθμό 9 ψηφίων (έναν οκταδικό αριθμό 3 ψηφίων). Η σημασία των 9 δυαδικών ψηφίων είναι η ακόλουθη: Ψηφίο 8 : Δικαίωμα ανάγνωσης για τον ιδιοκτήτη (r) Ψηφίο 7 : Δικαίωμα εγγραφής για τον ιδιοκτήτη (w) Τριάδα Ψηφίο 6 : Δικαίωμα εκτέλεσης για τov ιδιοκτήτη (x) Ιδιοκτήτη Ψηφίο 5 : Δικαίωμα ανάγνωσης για την ομάδα (r) Ψηφίο 4 : Δικαίωμα εγγραφής για την ομάδα (w) Τριάδα Ψηφίο 3 : Δικαίωμα εκτέλεσης για την ομάδα (x) Ομάδας Ψηφίο 2 : Δικαίωμα ανάγνωσης για τους υπολοίπους (r) Ψηφίο 1 : Δικαίωμα εγγραφής για τους υπολοίπους (w) Τριάδα Ψηφίο 0 : Δικαίωμα εκτέλεσης για τους υπολοίπους (x) Υπολοίπων Έτσι, mοde=0644 (το αρχικό 0 δηλώνει στη C ότι πρόκειται για οκταδικό αριθμό) σημαίνει: δικαίωμα ανάγνωσης και εγγραφής (6) για τον ιδιοκτήτη και δικαίωμα μόνο ανάγνωσης (4) για την ομάδα του ιδιοκτήτη και τους υπόλοιπους χρήστες. Επίσης, mode=0777 σημαίνει δικαίωμα κάθε είδους προσπέλασης και για τις τρεις κατηγορίες χρηστών. Παράδειγμα: chmod( program.c, 0644); Για περισσότερη ευκολία, μπορούμε να αντικαταστήσουμε τα 9 bits με τα αντίστοιχα γράμματα αν π.χ. το bit της ανάγνωσης (εγγραφής, εκτέλεσης) για κάποια κατηγορία χρηστών είναι 1, στη θέση του βάζουμε το γράμμα r (w, x), ενώ αν είναι 0 βάζουμε μια παύλα (-). Η συμβολοσειρά που προκύπτει εκφράζει πολύ κατανοητά τα δικαιώματα πρόσβασης στο αρχείο. Για παράδειγμα τα δικαιώματα του διπλανού σχήματος γράφονται έτσι ως rwxr-x--x. Είναι προφανής πως αυτός ο συμβολισμός είναι ο πιο κατανοητός από όλους. R W X R W X R W X User Group Other Η κλήση stat Για κάθε αρχείο του συστήματος φυλάγονται σε μια ειδική περιοχή του δίσκου πληροφορίες όπως ο αριθμός ταυτότητας (user-id) του ιδιοκτήτη του αρχείου, τα δικαιώματα προσπέλασης του (access rights), το 8 ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ

13 μέγεθος του (file size), ο χρόνος δημιουργίας (creation time), τελευταίας χρησιμοποίησης (access time) και τελευταίας τροποποίησης (modification time), ο αριθμός των συνδέσμων (links) σ αυτό το αρχείο, το είδος του αρχείου (σύνηθες, κατάλογος, ειδικό αρχείο), οι πραγματικές διευθύνσεις των περιεχομένων του στο δίσκο, κλπ. Η περιοχή αυτή του δίσκου αποτελεί τov i-κόμβο (i-node) του αρχείου και τα περιεχόμενα της μπορούν να προσπελασθούν με την κλήση stat(): #include <sys/types.h> #include <sys/stat.h> int stat(const char *path, struct stat *stbuf); όπου path είναι το όνομα του αρχείου και stbuf ένας δείκτης σε μια δομή τύπου stat. Ο σύνθετος τύπος δεδομένων stat ορίζεται στο αρχείο <sys/stat.h> ως εξής: struct stat /* structure returned by stat */ mode_t st_mode; /* File mode (see mknod(2)) */ ino_t st_ino; /* i-node number */ dev_t st_dev; /* ID of device containing a directory entry for this file */ dev_t st_rdev; /* ID of device */ /* This entry is defined only for char special or block special files */ nlink_t st_nlink; /* Number of links to file */ uid_t st_uid; /* User ID of the file s owner */ gid_t st_gid; /* Group ID of the file s group */ off_t st_size; /* File size in bytes */ time_t st_atime; /* Time of last access */ time_t st_mtime; /* Time of last data modification */ time_t st_ctime; /* Time of last file status change */ /* Times measured in seconds since 00:00:00 UTC, Jan. 1, 1970 */ long st_blksize; /* Preferred I/O block size */ long st_blocks; /* Number of 512 byte blocks allocated*/ ; Παράδειγμα: Με τις επόμενες εντολές μπορούμε να μάθουμε το μέγεθος ενός αρχείου χωρίς να το ανοίξουμε. struct stat stbuf; : stat(filename, &stbuf); printf( File size: %ld bytes\n, stbuf.st_size); Ένα ολοκληρωμένο παράδειγμα Το επόμενο πρόγραμμα χρησιμοποιεί τις περισσότερες από τις πρωτογενείς κλήσεις που παρουσιάσαμε στις προηγούμενες παραγράφους. Το πρόγραμμα καλείται από το φλοιό με μια εντολή της μορφής: inv file1 [file2] και δημιουργεί ένα αρχείο file2 στο οποίο γράφει ένα αντεστραμμένο αντίγραφο του file1 (το τελευταίο byte του file1 γράφεται πρώτο, το προτελευταίο 2 ο κ.ο.κ.). Αν δεν παρέχεται η παράμετρος file2, το αποτέλεσμα γράφεται στο stdout. #include <stdio.h> #define MODE 0644 ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ 9

14 main( int argc, char *argv[] ) int fin, fout; long len; if ( argc == 1 ) /* Αν δεν δώθηκε καμμιά παράμετρος... Λάθος */ fprintf(stderr, Usage: %s file1 [file2]\n, argv[0]); exit(1); if ( (fin=open(argv[1], O_RDONLY)) < 0 ) /* Άνοιξε το αρχείο file1 */ error( Cannot open file %s, argv[1]); if ( argc == 2 ) /* Αν δεν δώθηκε παράμετρος file2 */ fout=1; /* τότε fout=stdout (1) */ else /* Αλλιώς δημιούργησε το αρχείο file2 */ if ( (fout=creat(argv[2], MODE)) < 0 ) error( Cannot create file %s, argv[2]); len=lseek(fin, -1L, SEEK_END); /* Πήγαινε στο τέλος της εισόδου */ fprintf(stderr, Input file length: %ld\n, len+2); do char c; /* Μετέφερε τον επόμενο χαρακτήρα... */ read(fin, &c, 1); /* Εδώ ο δείκτης του fin προχωρά κατά 1 */ write(fout, &c, 1); /* Η επόμενη κλήση lseek() οπισθοδρομεί το δείκτη του fin κατά 1 byte * σε σχέση με αυτό που γράφτηκε τελευταίο στο fout (γιατί;). * Η κλήση επιστρέφει -1 όταν ξεπεράσουμε την αρχή του fin. */ while ( lseek(fin, -2L, SEEK_CUR)!= -1 ) ; close(fin), close(fout); 3.2. Κατάλογοι Οι κατάλογοι στο UNIX στην πραγματικότητα δεν είναι παρά συνήθη αρχεία τα οποία περιέχουν τα ονόματα των αρχείων του καταλόγου και τις διευθύνσεις των i-κόμβων τους (παραγρ ) στο δίσκο (οι διευθύνσεις των περιεχομένων των αρχείων προσπελαύνονται, όπως αναφέρθηκε, μέσω των i-κόμβων). Οι κατάλογοι ωστόσο δημιουργούνται και επιτρέπεται να τροποποιηθούν μονάχα από το ΛΣ Η κλήση mkdir #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *path, mode_t mode); Η κλήση mkdir() (make directory) δημιουργεί έναν κενό κατάλογο με όνομα path και δικαιώματα προσπέλασης mode. Η παράμετρος mode έχει την ίδια σημασία με την ομώνυμη παράμετρο της κλήσης chmod(). Η έννοια των 3 δικαιωμάτων προσπέλασης στην περίπτωση ενός καταλόγου είναι: - Δικαίωμα ανάγνωσης του καταλόγου επιτρέπει την εκτέλεση της κλήσης stat() για να πάρουμε πληροφορίες γύρω από κάποια αρχεία του καταλόγου. 10 ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ

15 - Δικαίωμα εγγραφής του καταλόγου επιτρέπει την προσθήκη/διαγραφή αρχείων στον κατάλογο με τις κλήσεις creat()/link()/unlink(). - Δικαίωμα εκτέλεσης του καταλόγου επιτρέπει να μπούμε στον κατάλογο αυτό με chdir(). Έλλειψη αυτού του δικαιώματος καθιστά τον κατάλογο και όλους τους υποκαταλόγους του τελείως απροσπέλαστους για τους αντίστοιχους χρήστες Η κλήση rmdir #include <unistd.h> int rmdir(const char *path); Η κλήση rmdir() (remove directory) σβήνει τον κατάλογο με όνομα path. Ο κατάλογος αυτός θα πρέπει προηγουμένως να έχει αδειασθεί από όλα του τα περιεχόμενα (αρχεία και υποκαταλόγους) Η κλήση chdir #include <unistd.h> int chdir(const char *path); Με την κλήση chdir() (change directory) κάνουμε τον κατάλογο path τρέχοντα κατάλογο (working directory) της διεργασίας μας Οι κλήσεις link/unlink #include <unistd.h> int link(const char *existing, const char *new); int unlink(const char *path); Η κλήση link() δημιουργεί ένα σύνδεσμο με το ήδη υπάρχον αρχείο existing. Με την κλήση αυτή δημιουργείται ένα φαινομενικά νέο αρχείο new και προστίθεται το όνομά του στον κατάλληλο κατάλογο. Το νέο αυτό αρχείο, ωστόσο, δείχνει προς τον ίδιο i-κόμβο, άρα και στα ίδια δεδομένα με το αρχικό. Έτσι και τα δύο ονόματα αντιστοιχούν στα ίδια ακριβώς περιεχόμενα πάνω στο δίσκο του συστήματος. Παράδειγμα: Η κλήση: link( /usr/john/message, messg2 ); προσθέτει ένα νέο όνομα messg2 στον τρέχοντα κατάλογο της διεργασίας μας. Στην πραγματικότητα, το όνομα messg2 είναι ένα δεύτερο όνομα για το αρχείο /usr/john/message που βρίσκεται ήδη αποθηκευμένο σε κάποια θέση του δίσκου. Η αντίστροφη κλήση unlink(), διαγράφει το αρχείο path από το σύστημα των αρχείων. Τονίζουμε ότι μόνο το όνομα του αρχείου σβήνεται από τον κατάλληλο κατάλογο. Τα περιεχόμενα του αρχείου στο δίσκο διατηρούνται εφ όσον υπάρχουν και άλλοι σύνδεσμοι με το αρχείο αυτό και καταστρέφονται μόνον αφού σπάσουν όλοι οι σύνδεσμοι που δημιουργήθηκαν με κλήσεις link(), εκτελώντας τον αντίστοιχο αριθμό κλήσεων unlink(). Στην απλή περίπτωση των αρχείων με τα οποία δεν έχουν δημιουργηθεί άλλοι σύνδεσμοι, η κλήση unlink() είναι ισοδύναμη με τις πιο συμβατικές κλήσεις erase ή delete άλλων ΛΣ. ΣΥΣΤΗΜΑ ΑΡΧΕΙΩΝ 11

16 4. ΣΥΣΤΗΜΑ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ Ένα από τα πρωτοποριακά χαρακτηριστικά του ΛΣ UNIX είναι το γεγονός ότι το σύστημα εισόδου/εξόδου του είναι, στο επίπεδο των εφαρμογών, εξ ολοκλήρου ενσωματωμένο μέσα στο σύστημα αρχείων. Πραγματικά, όλες οι περιφερειακές συσκευές μιας εγκατάστασης UNIX είναι υλοποιημένες σαν ειδικά αρχεία ή αρχεία συσκευών (device files) στον κατάλογο /dev. Για παράδειγμα, τα ειδικά αρχεία με ονόματα /dev/ttyxx αντιστοιχούν στα τερματικά της εγκατάστασης, τα αρχεία με ονόματα /dev/mtxx σε μονάδες ταινιών, τα αρχεία με ονόματα /dev/hdxx ή /dev/fdxx σε μονάδες σκληρών δίσκων ή δισκέττας αντίστοιχα, κλπ. Προκειμένου να προσπελάσουμε κάποια περιφερειακή συσκευή μέσα από κάποια εφαρμογή, ο μόνος τρόπος είναι να ανοίξουμε το αντίστοιχο ειδικό αρχείο του καταλόγου /dev και να εκτελέσουμε είσοδο/έξοδο δεδομένων με τις κλήσεις read()/write(), σαν να επικοινωνούσαμε με ένα κοινό αρχείο. Επίσης, ο καθορισμός των δικαιωμάτων προσπέλασης σε μια συσκευή καθορίζεται με την κλήση chmod() (παραγρ ), αλλάζοντας τα δικαιώματα προστασίας του αντίστοιχου ειδικού αρχείου. Φυσικά, η παραπάνω εξομοίωση συσκευών μέσω αρχείων είναι μονάχα εικονική και σκοπός της είναι να παρέχει έναν ομοιόμορφο τρόπο σύνδεσης, προσπέλασης και προστασίας όλων των αγαθών του συστήματος. Στην πραγματικότητα τα ειδικά αρχεία δεν περιέχουν δεδομένα. Κάθε ειδικό αρχείο έχει κανονικά συσχετισμένο μαζί του έναν i-κόμβο (παραγρ ), όπου αποθηκεύονται όπως συνήθως διάφορες πληροφορίες σχετικά με αυτό (κωδικός ιδιοκτήτη, δικαιώματα προστασίας, χρόνοι προσπέλασης, κλπ.). Στις θέσεις ωστόσο, όπου στα συνήθη αρχεία αποθηκεύονται οι διευθύνσεις των δεδομένων τους, υπάρχουν στα ειδικά αρχεία μονάχα δυο αριθμοί: ο κύριος και ο δευτερεύων αριθμός συσκευής (major and minor device number). Ο κύριος αριθμός συσκευής είναι ένας δείκτης σε έναν εσωτερικό πίνακα του ΛΣ και δείχνει προς την διεύθυνση του προγράμματος-οδηγού (device driver) της αντίστοιχης συσκευής. Ο δευτερεύων αριθμός συσκευής περνιέται σαν παράμετρος στο πρόγραμμα-οδηγό που καθορίζεται από τον κύριο αριθμό. Συνήθως ορίζει ποια από όλες τις συσκευές του ιδίου τύπου που υπάρχουν στο σύστημα (π.χ. ποιο από όλα τα τερματικά) θα χειριστεί το σύστημα. Έτσι π.χ. παρατηρούμε ότι όλα τα τερματικά - αρχεία /dev/ttyxx - έχουν τον ίδιο κύριο, αλλά διαφορετικούς δευτερεύοντες αριθμούς συσκευής. Με τον παραπάνω μηχανισμό, προσπέλαση σε ένα ειδικό αρχείο στην πραγματικότητα σημαίνει ενεργοποίηση του αντίστοιχου προγράμματος-οδηγού συσκευής. Οι συσκευές εισόδου/εξόδου του UNIX υποδιαιρούνται σε δυο κατηγορίες: (i) Συσκευές ομαδικής Ε/Ε (Block I/O devices) στις οποίες η είσοδος και η έξοδος δεδομένων γίνεται πάντα ασύγχρονα σε ομάδες (blocks) καθορισμένου αριθμού χαρακτήρων με την παρεμβολή μηχανισμού απομονωτών (buffering). Τέτοιες συσκευές είναι οι δίσκοι και οι μαγνητικές ταινίες. (ii) Συσκευές Ε/Ε χαρακτήρων (Character I/O devices) όπου η μεταφορά δεδομένων γίνεται χαρακτήρα-χαρακτήρα με μεθόδους οι οποίες διαφέρουν από συσκευή σε συσκευή. Τέτοιες συσκευές είναι όλες οι υπόλοιπες (τερματικά, εκτυπωτές, γραμμές σύνδεσης σε δίκτυα, κλπ.). π.χ. : Για να συνδεθούμε με μια υπάρχουσα συσκευή εισόδου/εξόδου εκτελούμε τη γνωστή κλήση open(), fd=open( /dev/tty05, O_WRONLY); Στη συνέχεια, επικοινωνία δεδομένων μπορεί να επιτευχθεί με τις κλήσεις read()/write() σαν να επρόκειτο για κοινό αρχείο: write(fd, bυf, sizeof buf); 12 ΣΥΣΤΗΜΑ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ

17 5. ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ Με τον όρο διεργασία στο UNIX εννοούμε τη δυναμική πράξη της εκτέλεσης ενός προγράμματος από κάποιο χρήστη. Στα συστήματα UNIX κάθε διεργασία βλέπει τον δικό της εικονικό χώρο διευθύνσεων, ο οποίος στα μάτια κάθε διεργασίας ξεκινά από το 0 (Σχήμα 2) και στα περισσότερα συστήματα UNIX περιλαμβάνει διευθύνσεις των 32 bits. ΧΩΡΟΣ ΔΙΕΥΘΥΝΣΕΩΝ ΧΡΗΣΤΩΝ ΧΩΡΟΣ ΔΙΕΥΘΥΝΣΕΩΝ ΠΥΡΗΝΑ ΕΙΚΟΝΙΚΟΣ ΧΩΡΟΣ ΔΙΕΥΘΥΝΣΕΩΝ ΔΙΕΡΓΑΣΙΑΣ 1 ΕΙΚΟΝΙΚΕΣ ΔΙΕΥΘΥΝΣΕΙΣ 0x xFFFFFFFF ΕΙΚΟΝΙΚΟΣ ΧΩΡΟΣ ΔΙΕΥΘΥΝΣΕΩΝ ΔΙΕΡΓΑΣΙΑΣ 2 ΕΙΚΟΝΙΚΕΣ ΔΙΕΥΘΥΝΣΕΙΣ 0 x xFFFFFFFF ΚΩΔΙΚΑΣ ΠΥΡΗΝΑ ΛΣ ΠΙΝΑΚΕΣ ΤΟΥ ΛΣ ΑΠΟΜΟΝΩΤΕΣ (Buffers) 0xFFFFFF ΠΡΑΓΜΑΤΙΚΕΣ ΔΙΕΥΘΥΝΣΕΙΣ 0x Σχήμα 2: Χώρος διευθύνσεων υποθετικής μηχανής UNIX Ο χώρος διευθύνσεων μιας διεργασίας υποδιαιρείται σε 3 τμήματα (Σχήμα 3): (i) Το τμήμα κειμένου (text segment) περιέχει τον κώδικα του προγράμματος που εκτελεί εκείνη τη στιγμή η διεργασία και ξεκινά από τη διεύθυνση 0 του εικονικού χώρου διευθύνσεων. Τα περιεχόμενα του τμήματος κειμένου δεν μπορούν να τροποποιηθούν από τη διεργασία (read-only segment). (ii) Το τμήμα δεδομένων (data segment) όπου αποθηκεύονται τα στατικά δεδομένα της διεργασίας (παγκόσμιες μεταβλητές, πίνακες, κλπ.). Το αρχικό μέγεθος του τμήματος αυτού καθορίζεται στο χρόνο μετάφρασης και μπορεί να μεταβληθεί μέσα από το πρόγραμμα, αν προκύψει ανάγκη κατά τη διάρκεια της εκτέλεσής του, με την κλήση sbrk() (παραγρ. 5.2). (iii) Το τμήμα στοίβας (stack segment) χρησιμοποιείται για τη στοίβα της διεργασίας. Εκεί φυλάγονται διευθύνσεις επιστροφής, τοπικές μεταβλητές, κλπ. Το τμήμα στοίβας ξεκινά από την ψηλότερη θέση του εικονικού χώρου διευθύνσεων και μετακινείται προς τα κάτω. Το μέγεθος του αυξάνεται αυτόματα από το σύστημα. Σε περίπτωση που περισσότερες διεργασίες εκτελούν ταυτόχρονα το ίδιο πρόγραμμα (όπως συμβαίνει λ.χ. όταν περισσότεροι χρήστες χρησιμοποιούν ταυτόχρονα διαφορετικά αντίγραφα του ίδιου φλοιού), το τμήμα κειμένου αποθηκεύεται μονάχα μια φορά στην πραγματική μνήμη και μοιράζεται σε όλες τις διεργασίες (shared text). Με τον τρόπο αυτό επιτυγχάνεται οικονομία μνήμης και λιγότερες προσπελάσεις στο δίσκο κατά το φόρτωμα/ανταλλαγή (swapping) διεργασιών. ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ 13

18 ΕΙΚΟΝΙΚΟΣ ΧΩΡΟΣ ΔΙΕΥΘΥΝΣΕΩΝ ΔΙΕΡΓΑΣΙΑΣ ΤΜΗΜΑ ΣΤΟΙΒΑΣ ΑΝΥΠΑΡΚΤΗ ΜΝΗΜΗ * ΤΜΗΜΑ ΔΕΔΟΜΕΝΩΝ ΑΝΥΠΑΡΚΤΗ ΜΝΗΜΗ * ΤΜΗΜΑ ΚΕΙΜΕΝΟΥ 0xFFFFFFFF ΕΙΚΟΝΙΚΕΣ ΔΙΕΥΘΥΝΣΕΙΣ 0x * ΕΙΚΟΝΙΚΕΣ ΔΙΕΥΘΥΝΣΕΙΣ ΣΤΙΣ ΟΠΟΙΕΣ ΔΕΝ ΕΧΕΙ ΠΑΡΑΧΩΡΗΘΕΙ ΠΡΑΓΜΑΤΙΚΗ ΜΝΗΜΗ Σχήμα 3: Χώρος διευθύνσεων διεργασίας στο UNIX Οι διεργασίες στο UNIX είναι οργανωμένες σε ένα δένδρο διεργασιών. Όταν μια διεργασία δ 1 δημιουργεί μια άλλη διεργασία δ 2, η δ 2 γίνεται διεργασία-παιδί της δ 1 στο δένδρο, και η δ 1 είναι η διεργασία-γονέας (parent process) της δ 2. Στη ρίζα του δένδρου αυτού βρίσκεται η διεργασία με όνομα init, η οποία είναι ουσιαστικά η αρχική διεργασία του ΛΣ. Αυτό οδηγεί σε μια ιεραρχική οργάνωση του συνόλου των διεργασιών που εκτελούνται στο UNIX. Όταν μια διεργασία τερματίζεται, τότε οι τυχόν διεργασίες-παιδιά που αυτή είχε δημιουργήσει στη διάρκεια της εκτέλεσής της, δεν κληρονομούνται από την διεργασία-γονέα της εκλειπούσας, όπως ίσως θα περιμέναμε, αλλά από την διεργασία init. Κάθε διεργασία έχει συσχετισμένο μαζί της έναν εγγυημένα μοναδικό αριθμό ταυτότητας διεργασίας (process-id, pid) που παρέχεται δυναμικά από το σύστημα. Ο αριθμός αυτός μπορεί να περαστεί σαν παράμετρος σε ορισμένες πρωτογενείς κλήσεις προκειμένου να αναφερθούμε σε κάποια διεργασία μέσα από κάποια άλλη. Μια διεργασία μπορεί να μάθει τον αριθμό ταυτότητάς της εκτελώντας την κλήση: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); διεργασία παιδί Κάθε διεργασία μπορεί να έχει ταυτόχρονα ανοικτά περιορισμένο αριθμό αρχείων (συνήθως 32 ή 64) ανεξάρτητα από τις υπόλοιπες. Περισσότερες διεργασίες μπορούν ταυτόχρονα να διαβάζουν αλλά και να γράφουν το ίδιο αρχείο. Στην τελευταία περίπτωση οι ίδιες οι διεργασίες θα πρέπει να λάβουν πρόνοια να συγχρονίσουν τις προσπελάσεις τους για να εξασφαλίσουν ορθότητα δεδομένων. Το UNIX καθ εαυτό δεν επιβάλλει κανένα μηχανισμό κλειδώματος και συγχρονισμού προσπέλασης σε αρχεία από διαφορετικές διεργασίες, παρόλου που κάτι τέτοιο μπορεί να υλοποιηθεί στο επίπεδο των εφαρμογών μέσω των κλήσεων flock(), lockf() και fcntl() που παρέχει. Η χρονοδρομολόγηση διεργασιών γίνεται με βάση την προτεραιότητα τους, η οποία μεταβάλλεται αυτόματα με το χρόνο ή κυκλικά (round robin) στην περίπτωση περισσοτέρων διεργασιών της ίδιας init δ 1 δ 2 διεργασία πατέρας 14 ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ

19 προτεραιότητας. Δεν υπάρχει δυνατότητα καθορισμού διεργασιών χρηστών με μόνιμα μεγαλύτερη προτεραιότητα από τις άλλες, γεγονός που καθιστά το UNIX ακατάλληλο για εφαρμογές πραγματικού χρόνου (real-time), όπως συστήματα on-line τραπεζών, αεροδρομίων κλπ. Πληροφορίες για τις διεργασίες που εκτελούνται στο σύστημα παίρνουμε εκτελώντας από το φλοιό την εντολή ps (process status). Τα στοιχεία που δίνει η εντολή ps και οι ρυθμίσεις που δέχεται διαφέρουν αρκετά μεταξύ των διαφόρων παραλλαγών του UNIX. Συνήθως όμως η έξοδος της εντολής ps, θα μοιάζει με την ακόλουθη: % ps PID TTY TIME CMD pts/2 0:01 tcsh pts/2 0:00 ps pts/2 0:10 netscape αναγνωριστικό της διεργασίας τερματικό με το οποίο συνδέεται η διεργααία διάρκεια εκτέλεσης της διεργασίας εντολή με την οποία δημιουργήθηκε η διεργασία Η εντολή ps εμφανίζει μόνο τις διεργασίες που ανήκουν στο χρήστη, και μάλιστα επιλέγει από αυτές τις πιο ενδιαφέρουσες. Για να δούμε και διεργασίες άλλων χρηστών, προσθέτουμε την παράμετρο -a. % ps -a PID TTY TIME CMD pts/2 0:01 tcsh pts/3 0:01 tcsh pts/2 0:00 ps pts/2 0:10 netscape pts/3 0:02 vi test.txt Οι δυο αυτές διεργασίες ανήκουν σε άλλο χρήστη, ο οποίος χρησιμοποιεί άλλο τερματικό, τρέχει τον δικό του φλοιό και τον εκδότη κειμένου (text editor) vi Αν θέλουμε να δούμε το δένδρο των διεργασιών, πρέπει να δώσουμε στην εντολή ps τις κατάλληλες παραμέτρους (options) με τις οποίες θα εμφανίζει: όλες τις διεργασίες των χρηστών και του συστήματος κάθε διεργασία με το αναγνωριστικό της καθώς και το αναγνωριστικό της διεργασίας-πατέρα της. Έχοντας αυτές τις πληροφορίες μπορούμε να σχεδιάσουμε το δένδρο των διεργασιών. Οι παράμετροι που παρουσιάζουν όλες τις διεργασίες, όπως αναφέραμε, είναι διαφορετικές για τους διάφορους τύπους του UNIX. Το εγχειρίδιο της εντολής ps, που εμφανίζεται με man ps, περιγράφει τις διαθέσιμες παραμέτρους της εντολής στο συγκεκριμένο σύστημα Κλήσεις δημιουργίας και τερματισμού διεργασιών Όπως ήδη αναφέραμε παραπάνω, το UNIX υποστηρίζει ιεραρχική δημιουργία νέων διεργασιών. Αυτό σημαίνει ότι νέες διεργασίες μπορούν να γεννηθούν μονάχα σαν διεργασίες-παιδιά (child processes) άλλων, ήδη εκτελουμένων διεργασιών. Ο πατέρας όλων των διεργασιών στο UNIX είναι ο χρονοδρομολογητής (scheduler ή swapper) με αριθμό ταυτότητας (pid) 0. Ο χρονοδρομολογητής γεννά τη διεργασία init με pid=1. Η διεργασία init με τη σειρά της γεννά από μια διεργασία getty για κάθε τερματικό του συστήματος. Στη συνέχεια πέφτει σε λήθαργο περιμένοντας την αποσύνδεση (logout) κάποιου χρήστη. Όταν κάποιος χρήστης επιχειρεί να κάνει login σε κάποιο τερματικό, η αντίστοιχη διεργασία getty εκτελεί το πρόγραμμα login, το οποίο ελέγχει κωδικό και σύνθημα χρήστη. Σε περίπτωση που αυτά είναι ορθά, το πρόγραμμα login εκτελεί το πρόγραμμα του φλοιού. Ο φλοιός δέχεται τις εντολές του χρήστη και γεννάει νέες διεργασίες που εκτελούν τις αντίστοιχες εφαρμογές. Όταν ένας χρήστης κάνει logout, τερματίζεται η διεργασία του φλοιού η οποία, σημειώνουμε, είναι η ίδια διεργασία που είχε ξεκινήσει με το πρόγραμμα getty. Στη θέση της, ο πατέρας της (διεργασία init) δημιουργεί μια νέα διεργασία getty κ.ο.κ. (Σχήμα 4). ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ 15

20 exec init init pid 1 fork init pid 1 fork init pid 1 fork init pid 1 wait init pid 1 init pid 7623 init pid 8235 init pid 1095 exec getty exec getty exec getty zombie pid 1095 getty pid 7623 getty pid 8235 getty pid 1095 exec login exec login exit login pid 7623 login pid 1095 login pid 1095 exec login shell pid 1095 δείτε παρακάτω Σχήμα 4: Βασικές διεργασίες του συστήματος Η γέννηση μιας διεργασίας στο UNIX είναι διαδικασία δυο βημάτων: Πρώτα η διεργασία-πατέρας δημιουργεί μια νέα διεργασία-παιδί, πιστό αντίγραφο του εαυτού της (κλήση fork()). Στη συνέχεια, η διεργασία-παιδί που προέκυψε αντικαθιστά το πρόγραμμα που εκτελεί (αρχικά ίδιο με του πατέρα) με το νέο πρόγραμμα (κλήση exec()). Η διαδικασία αυτή καθιστά ιδιαίτερα σαφή τη διάκριση ανάμεσα στις έννοιες πρόγραμμα και διεργασία. Προαιρετικά, ο πατέρας μπορεί να περιμένει μέχρι τον τερματισμό κάποιας διεργασίας-παιδιού του (κλήση wait()). Ο οικειοθελής τερματισμός μιας διεργασίας μπορεί να γίνει με την κλήση exit() (Σχήμα 5). shell process fork parent process wait shell process exec command command executes exit Σχήμα 5: Κύκλος ζωής διεργασίας στο UNIX Η κλήση fork Η κλήση fork() (=διακλάδωση, διχάλα) δημιουργεί μια νέα διεργασία, πιστό αντίγραφο της διεργασίας-γονέα και έχει τη μορφή: #include <sys/types.h> #include <unistd.h> pid_t fork(void); Οι δυο διεργασίες μοιράζονται το ίδιο τμήμα κειμένου, ενώ το τμήμα δεδομένων της νέας διεργασίας αποτελεί πιστό αντίγραφο του τμήματος δεδομένων της διεργασίας-γονέα. Επίσης, η νέα διεργασία μοιράζεται όλα τα 16 ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ

21 ανοικτά αρχεία και σωληνώσεις (παραγρ ) του γονέα. Η μόνη διαφορά ανάμεσα στις δυο διεργασίες είναι η τιμή pid που επιστρέφει η κλήση fork(). Συγκεκριμένα: - στη διεργασία-παιδί επιστρέφεται η τιμή 0, ενώ - στη διεργασία-γονέα επιστρέφεται ο αριθμός ταυτότητας της διεργασίας-παιδί (είναι πάντα μεγαλύτερος από το 0) Οι μετέπειτα εντολές του προγράμματος μπορούν να ελέγξουν την τιμή pid προκειμένου να διαπιστώσουν σε ποια από τις δυο διεργασίες ανήκουν: if ( fork() == 0 ) /* Διεργασία-παιδί */ εντολές που εκτελούνται μόνο στη διεργασία-παιδί else /* Διεργασία-γονέας */ εντολές που εκτελούνται μόνο στη διεργασία-γονέα Με τον παραπάνω μηχανισμό, μια διεργασία-παιδί μπορεί να διαφοροποιήσει το πεπρωμένο της από εκείνο της διεργασίας-γονέα που την δημιούργησε. Παράδειγμα: if ( (pid=fork() == 0 ) /* Διεργασία-παιδί */ for (i=1; i<=n; i++) printf( Hello from the child (%d)\n, i); else /* Διεργασία-γονέας */ printf( Child pid: %d\n, pid); for (i=1; i<=n ; i++) printf( Greetings from the parent (%d)\n, i); Οι κλήσεις execl/execv #include <unistd.h> int execl(const char *path, const char *arg0,..., const char *argn, char * /*NULL*/); int execv(const char *path, char *const argv[]); Η κλήση execl() προκαλεί την εκτέλεση ενός νέου προγράμματος το οποίο αντικαθιστά τα τμήματα κειμένου, δεδομένων και στοίβας του καλούντος προγράμματος. Έτσι το αρχικό (καλούν) πρόγραμμα χάνεται οριστικά από τη μνήμη και η ίδια διεργασία συνεχίζεται με την εκτέλεση ενός νέου προγράμματος. Τα αρχεία που είχε ανοίξει το αρχικό πρόγραμμα παραμένουν ανοικτά και κατά την εκτέλεση του νέου προγράμματος. Η παράμετρος path της κλήσης execl() είναι το πλήρες όνομα του εκτελέσιμου αρχείου όπου βρίσκεται το καλούμενο πρόγραμμα. Οι επόμενες παράμετροι arg0, arg1,, argn είναι οι παράμετροι που περνιούνται στο πρόγραμμα αυτό. Κατά σύμβαση η παράμετρος arg0 είναι το όνομα του προγράμματος. Η τελευταία παράμετρος της κλήσης είναι πάντα ένας μηδενικός δείκτης τύπου (char *). ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ 17

22 Παραδείγματα: execl( /bin/ls, ls, -l, (char *)0); execl( /bin/cc, cc, -o, prog, prog.c, (char *)0); Η κλήση execv() λειτουργεί ανάλογα και χρησιμοποιείται στην περίπτωση που ο αριθμός των παραμέτρων είναι μεταβλητός. Η παράμετρος argv είναι ένας πίνακας δεικτών σε χαρακτήρες, ουσιαστικά ένας πίνακας συμβολοσειρών. Το κάθε στοιχείο του πίνακα περιέχει την αρχική διεύθυνση της αντίστοιχης παραμέτρου ενώ το τελευταίο στοιχείο του πίνακα έχει την ειδική τιμή (char *)0 και δηλώνει το τέλος των παραμέτρων. Παράδειγμα: char *pv[] = cc, -o, prog, prog.c, (char *)0 ; : execv( /bin/cc, pv); Οι κλήσεις wait & exit Όπως αναφέραμε, για να ξεκινήσουμε μια νέα ανεξάρτητη διεργασία ακολουθούμε μια διαδικασία δυο βημάτων: 1. Δημιουργούμε μια νέα διεργασία-παιδί πανομοιότυπη της αρχικής (κλήση fork()) και 2. Αντικαθιστούμε το πρόγραμμα που εκτελεί η διεργασία-παιδί με το πρόγραμμα που επιθυμούμε (κλήση execl() ή execv()). Μια διεργασία μπορεί να αντικαταστήσει το πρόγραμμα που εκτελεί περισσότερες φορές στη διάρκεια ζωής της. Ένα παράδειγμα αποτελεί η διαδικασία getty-login-shell που εκτελείται σε κάθε τερματικό (Σχήμα 4). Τα παραπάνω δυο βήματα θα μπορούσαν να υλοποιηθούν χονδρικά στη C ως εξής: : αρχική διεργασία : if ( fork() == 0 ) execl( νέο_πρόγραμμα, παράμετροι,..., (char *)0 ); : συνέχεια αρχικής διεργασίας Οι παραπάνω εντολές προκαλούν την ταυτόχρονη εκτέλεση δυο διεργασιών. Στην πράξη, η διεργασίαγονέας συνήθως περιμένει να ολοκληρωθεί η διεργασία-παιδί προτού συνεχίσει την εκτέλεσή της. Αυτό πετυχαίνεται με την κλήση: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); Η κλήση wait() αναστέλλει την εκτέλεση του καλούντος προγράμματος μέχρις ότου τερματισθεί (ομαλά ή ανώμαλα) η εκτέλεση κάποιας από τις διεργασίες-παιδιά του. Αν κάποια διεργασία-παιδί έχει ήδη τερματιστεί, τότε η κλήση επιστρέφει αμέσως -1. Η κλήση wait() επιστρέφει έναν αριθμό στην μεταβλητή status. Σε περίπτωση που η διεργασία-παιδί τερματίστηκε ομαλά με την κλήση exit(), τα 8 σημαντικότερα ψηφία του αριθμού αυτού παρέχουν την κατάσταση τερματισμού (exit status) της διεργασίαςπαιδί: exit status = status >> 8; Σε περίπτωση πάλι που η διεργασία-παιδί τερματίστηκε ανώμαλα (έλαβε κάποιο σήμα - παραγρ ), τα 8 λιγότερο σημαντικά ψηφία του αριθμού δίνουν τον κωδικό του σήματος: signal_type = status & 0xFF; 18 ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ

23 Κάθε διεργασία κατά τον τερματισμό της επιστρέφει έναν κωδικό εξόδου (exit code) ώστε να μπορεί να διαπιστωθεί ο λόγος και ο τρόπος τερματισμού της. Ο οικειοθελής τερματισμός μιας διεργασίας μπορεί να γίνει με την κλήση exit(): #include <unistd.h> void exit(int status); Η κατάσταση τερματισμού status είναι κατά σύμβαση 0 όταν η διεργασία τερματίζει κανονικά ή διάφορη του 0 όταν προέκυψε κάποιο λάθος. Η κλήση exit() κλείνει αυτόματα όλα τα ανοικτά αρχεία της διεργασίας και απελευθερώνει όλα τα τμήματα μνήμης που είχε δεσμέσει κατά τη διάρκεια εκτέλεσής της. Σημειώνουμε ωστόσο ότι όταν μια διεργασία τερματιστεί, δεν καταστρέφεται ολοκληρωτικά αλλά παραμένει στην τερματισμένη κατάσταση (zombie state). Όταν ο πατέρας εκτελέσει την κλήση wait() και συλλέξει τον κωδικό εξόδου, η διεργασία καταστρέφεται ολοκληρωτικά, ελευθερώνοντας και την εγγραφή του πίνακα διεργασιών που κατείχε. Παράδειγμα: Χρησιμοποιώντας τις κλήσεις fork(), execl() και wait() είναι εύκολο να δούμε περίπου πως έχουν υλοποιηθεί στα προγράμματα του UNIX χαρακτηριστικά όπως λ.χ. η δυνατότητα εκτέλεσης εντολών του φλοιού μέσα από τους editors (εντολή! του ed ή :! του νi) ή μέσα από τη γλώσσα C (συνάρτηση βιβλιοθήκης system()). Πραγματικά, η εντολή! του ed έχει σαν αποτέλεσμα τη δημιουργία μιας νέας διεργασίας-παιδί του ed, η οποία με τη σειρά της εκτελεί το πρόγραμμα sh (shell - φλοιός) με παράμετρο τη γραμμή εντολών που τυπώσαμε μετά το!. Ο ίδιος ο ed περιμένει, όπως γνωρίζουμε, να τερματίσει το sh (άρα και η διεργασία-παιδί) προτού δεχθεί νέες εντολές μας. Η υλοποίηση έχει σε γενικές γραμμές ως εξής: : if ( commandline[0] ==! ) if ( fork() == 0 ) execl( /bin/sh, sh, -c, &cοmmandline[1], (char *)0); error( execl /bin/sh falled ); else wait(&status); : 5.2. Διαχείριση μνήμης Όπως αναφέραμε, μια διεργασία έχει το δικαίωμα να ζητήσει την επέκταση του τμήματος δεδομένων της, προκειμένου να υλοποιήσει δυναμικές δομές δεδομένων (λίστες, δέντρα, κλπ.). Η αίτηση αυτή διατυπώνεται μέσω της κλήσεως: #include <unistd.h> void *sbrk(int incr); Η κλήση sbrk() (Set BReaK) αυξάνει το μέγεθος του τμήματος δεδομένων της διεργασίας κατά incr bytes και επιστρέφει έναν δείκτη προς το πρώτο byte της νέας περιοχής, ή -1 αν η επέκταση δεν ήταν δυνατή. Οι συναρτήσεις βιβλιοθήκης malloc(), calloc() κλπ. με τις οποίες πετυχαίνουμε δυναμική παραχώρηση μνήμης στη C σ αυτήν ακριβώς την πρωτογενή κλήση στηρίζονται Συγχρονισμός και Επικοινωνία διεργασιών Τα σήματα (signals) ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ 19

24 Οι διεργασίες στο UNIX δεν αποτελούν κλειστά συστήματα, ξεκομμένα και ανεπηρέαστα από την εξέλιξη των υπολοίπων διεργασιών του συστήματος. Αντίθετα κάθε διεργασία επηρεάζει και επηρεάζεται από τις υπόλοιπες διεργασίες με διάφορους τρόπους. Μια διεργασία λ.χ. που έχει ζητήσει να διαβάσει δεδομένα από το δίσκο, αφού πρώτα περάσει τις κατάλληλες παραμέτρους στο πρόγραμμα-οδηγό του δίσκου (disk driver), αναστέλλει την λειτουργία της περιμένοντας να γίνουν διαθέσιμα τα δεδομένα. Μόλις το πρόγραμμα-οδηγός του δίσκου μεταφέρει τα δεδομένα από το δίσκο στη μνήμη θα στείλει ένα σήμα (signal) στην αρχική διεργασία το οποίο θα τη θέσει πάλι σε ενέργεια, ειδοποιώντας την ότι τα δεδομένα είναι διαθέσιμα. Ένα άλλο παράδειγμα αλληλεπίδρασης διεργασιών έχουμε ήδη εξετάσει. Όταν μια διεργασία δημιουργεί διεργασίες-παιδιά και στη συνέχεια εκτελέσει την κλήση: wait(&status); τότε η διεργασία-γονέας αναστέλλει τη λειτουργία της μέχρις ότου κάποιο από τα παιδιά της τερματίσει. Στην περίπτωση αυτή, το ΛΣ στέλνει ένα σήμα (SIGCHLD) στη διεργασία-γονέα, το οποίο την ξυπνάει από το λήθαργο ώστε να συνεχίσει την εκτέλεσή της. Τέλος, όταν επιθυμούμε να διακόψουμε ή να τερματίσουμε πρόωρα ένα πρόγραμμα που εκτελούμε από τον φλοιό, πατούμε τα πλήκτρα <CTRL>Ζ ή <CTRL>C αντίστοιχα. Αυτό έχει σαν αποτέλεσμα να στείλει ο φλοιός στις αντίστοιχες διεργασίες τα σήματα SIGTSTP ή SIGTERM αντίστοιχα, τα οποία τις αναγκάζουν να διακόψουν ή να τερματίσουν τη λειτουργία τους. Από τα παραπάνω παραδείγματα έγινε φανερό ότι στο UNIX μια μέθοδος αλληλεπίδρασης ανάμεσα σε διεργασίες είναι με τη βοήθεια του μηχανισμού των σημάτων. Τα σήματα είναι, όπως θα δούμε, κάτι σαν ένα σήμα διακοπής προερχόμενο από άλλες διεργασίες και δεν επαρκούν για πραγματική επικοινωνία διεργασιών. Στο αρχείο <signal.h> βρίσκονται οι ορισμοί των διαφόρων ειδών σημάτων. Τα σήματα αναπαρίστανται με τη βοήθεια μικρών ακεραίων. Στην πράξη ωστόσο χρησιμοποιούμε πάντα τις αντίστοιχες συμβολικές ονομασίες τους. Τα πιο χρήσιμα σήματα δίνονται στον ακόλουθο πίνακα: Κωδικός Συμβολισμός Κατηγορία Πότε στέλνεται / Σημασία 1 SIGHUP Exit Διακοπή της γραμμής επικοινωνίας με το τερματικό 2 SIGINT Exit Διακοπή του προγράμματος (πλήκτρο DEL) 3 SIGQUIT Core Πρόωρος τερματισμός διεργασίας (πλήκτρα <CTRL>\) 4 SIGILL Core Παράνομη εντολή προγράμματος (illegal instruction) 5 SIGTRAP Core Παγίδευση εκτέλεσης για έλεγχο του προγράμματος 6 SIGABRT Core Διακοπή εκτέλεσης του προγράμματος 7 SIGEMT Core Παγίδευση εξομοίωσης 8 SIGFPE Core Λάθος σε πράξη κινητής υποδιαστολής 9 SIGKILL Exit Άμεσος τερματισμός διεργασίας 10 SIGBUS Core Γενικό σφάλμα προγράμματος 11 SIGSEGV Core Παράνομη αναφορά σε τμήμα μνήμης 12 SIGSYS Core Αναφορά σε ανύπαρκτη πρωτογενή κλήση 13 SIGPIPE Exit Προσπάθεια εγγραφής σε κλεισμένη σωλήνωση 14 SIGALRM Exit Λήξη κάποιου προκαθορισμένου χρονικού διαστήματος 15 SIGTERM Exit Τερματισμός διεργασίας (πλήκτρα <CTRL>C) 16 SIGUSR1 Exit Σήμα (αριθμός 1) οριζόμενο από το χρήστη 17 SIGUSR2 Exit Σήμα (αριθμός 2) οριζόμενο από το χρήστη 18 SIGCHLD Ignore Τερματισμός ή διακοπή κάποιας διεργασίας-παιδί 19 SIGPWR Ignore Κατάσταση επανεκκίνησης συστήματος 20 SIGWINCH Ignore Αλλαγή μεγέθους παραθύρου 21 SIGURG Ignore Επείγουσα κατάσταση για κάποιο socket 22 SIGIO Exit Eπιτρέπεται Ε/Ε σε κάποια περιφερειακή μονάδα 23 SIGSTOP Stop Άμεση αναστολή εκτέλεσης διεργασίας με σήμα 24 SIGTSTP Stop Αναστολή εκτέλεσης διεργασίας από χρήστη (πλ. <CTRL>Ζ) 25 SIGCONT Ignore Συνέχιση διεργασίας που έχει διακοπεί 20 ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ

25 Αν σε ένα πρόγραμμα C επιθυμούμε να κάνουμε χρήση των πρωτογενών κλήσεων που θα παρουσιάσουμε σ αυτή την παράγραφο, τοποθετούμε στην κορυφή του πηγαίου αρχείου μας την εντολή: #include <signal.h> Προκειμένου να στείλουμε ένα σήμα σε κάποια διεργασία χρησιμοποιούμε την κλήση kill(): #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); όπου pid είναι ο αριθμός ταυτότητας της επιθυμητής διεργασίας και sig είναι ο κωδικός ή η συμβολική ονομασία του σήματος που θέλουμε να στείλουμε. Σημειώνουμε ότι το όνομα της κλήσης kill() είναι λίγο παραπλανητικό καθώς η αποστολή ενός σήματος σε μια διεργασία δε σημαίνει αυτόματα και τον τερματισμό της διεργασίας αυτής. Όπως είναι λογικό, η κλήση kill() επιτρέπεται να στείλει σήματα μόνον σε άλλες διεργασίες του ιδίου χρήστη. Μια διεργασία επιτρέπεται να στείλει σήμα και στον εαυτό της. Παράδειγμα: Η κλήση kill(pid, SIGSTOP); διακόπτει τη διεργασία pid. Η συμπληρωματική κλήση της kill() είναι η κλήση: #include <unistd.h> int pause(void); Με την κλήση pause() μια διεργασία αναστέλλει τη λειτουργία της μέχρις ότου λάβει κάποιο σήμα. Κάθε διεργασία που περιμένει να λάβει σήματα, έχει τη δυνατότητα να καθορίσει κάποια συνάρτηση της C η οποία θα εκτελεστεί μόλις ληφθεί το σήμα. Με την παραλαβή κάποιου σήματος, το πρόγραμμα εγκαταλείπει την κανονική ροή του και εκτελεί την καθορισμένη συνάρτηση χειρισμού του σήματος. Κατά τη διάρκεια της εκτέλεσης της συνάρτησης αυτής, μπλοκάρεται η παραλαβή δεύτερου σήματος όμοιου με το αρχικό. Αν η συνάρτηση χειρισμού επιστρέφει κανονικά, τότε η εκτέλεση του κυρίως προγράμματος συνεχίζεται από το σημείο που διακόπηκε. Η όλη διαδικασία θυμίζει έντονα τη διαδικασία εξυπηρέτησης διακοπών με τη διαφορά ότι: (i) τα σήματα προέρχονται συνήθως από άλλες διεργασίες και όχι από εξωτερικές συσκευές και (ii) ο χειρισμός τους γίνεται σε επίπεδο γλώσσας υψηλού επιπέδου. Παράδειγμα: Με την κλήση: int sigtype; int (*previous)(), handler(); previous = signal(sigtype, handler); καθορίζουμε ώστε η συνάρτηση handler να εκτελεστεί μόλις ληφθεί το σήμα sigtype από την καλούσα διεργασία. Η τιμή previous που επιστρέφει η κλήση signal() είναι ένας δείκτης προς την προηγούμενα καθορισμένη συνάρτηση χειρισμού του σήματος αυτού (χρήσιμη για πιθανό μετέπειτα restore). Στο αρχείο <signal.h> υπάρχουν τα συμβολικά ονόματα μερικών προκαθορισμένων συναρτήσεων χειρισμού σημάτων. Αυτά είναι: ΕΛΕΓΧΟΣ ΔΙΕΡΓΑΣΙΩΝ 21

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact: nifantop@unipi.gr Περιεχόμενα ενότητας Διεργασίες Κλήσεις δημιουργίας και τερματισμού διεργασιών Επικοινωνία διεργασιών μέσω

Διαβάστε περισσότερα

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ IΙ Λύβας Χρήστος chrislibas@ssl-unipi.gr Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος >_ ΔΙΕΡΓΑΣΙΕΣ +- Με τον όρο διεργασία στο UNIX εννοούμε τη δυναμικη πράξη της

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα (Λ/Σ) Λειτουργικά Συστήματα (Λ/Σ) Βασικές Έννοιες Λειτουργικών Συστημάτων Βασίλης Σακκάς 13/11/2013 1 ΒασικέςΈννοιεςΛ/Σ Η επικοινωνία μεταξύ Λ/Σ και των προγραμμάτων του χρήστη γίνεται μέσω του συνόλου των «εκτεταμένων

Διαβάστε περισσότερα

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections)

Προγραμματισμός συστημάτων UNIX/POSIX. Ανακατευθύνσεις (redirections) Προγραμματισμός συστημάτων UNIX/POSIX Ανακατευθύνσεις (redirections) Shell & ανακατεύθυνση εισόδου Κατά την εκτέλεση ενός προγράμματος, η είσοδος και η έξοδος ενός προγράμματος μπορούν να ανακατευθυνθούν

Διαβάστε περισσότερα

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος 2009-2010. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος 2009-2010. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Είσοδος/Έξοδος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2009-2010 Είσοδος/Έξοδος Μέχρι τώρα όποτε θέλαμε να διαβάσουμε χρησιμοποιούσαμε πάντα

Διαβάστε περισσότερα

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

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Το επίπεδο προτεραιότητας µιας διεργασίας µπορεί να αλλάξει µε χρήση της συνάρτησης nice. Κάθε διεργασία διαθέτει µια τιµή που καλείται

Διαβάστε περισσότερα

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1 Δημιουργία & Τερματισμός Διεργασιών Προγραμματισμός II 1 lalis@inf.uth.gr Δημιουργία νέας διεργασίας pid_t fork() Η fork δεν έχει παραμέτρους Δημιουργεί μια νέα διεργασία που είναι ένα αντίγραφο της διεργασίας

Διαβάστε περισσότερα

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1 Δημιουργία & Τερματισμός Διεργασιών Προγραμματισμός II 1 lalis@inf.uth.gr Δημιουργία νέας διεργασίας pid_t fork() Η fork δεν έχει παραμέτρους Δημιουργεί μια νέα διεργασία που είναι ένα αντίγραφο της διεργασίας

Διαβάστε περισσότερα

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals Δρ. Απόστολος Γκάμας Διδάσκων 407/80 gkamas@uop.gr Δίκτυα Επικοινωνιών ΙΙ Διαφάνεια 1 1 UDP vs TCP Το UDP είναι ένα connectionless, μη αξιόπιστο,

Διαβάστε περισσότερα

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

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ Εισαγωγή Σκοπός τόσο αυτού του εργαστηρίου, όσο και των εργαστηρίων που ακολουθούν, είναι να γνωρίσουμε τους τρόπους δημιουργίας και διαχείρισης των διεργασιών (processes)

Διαβάστε περισσότερα

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

Χρονοδρομολογητής Κυκλικής Επαναφοράς Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων 4 η Εργαστηριακή Άσκηση: Χρονοδρομολογητής Κυκλικής Επαναφοράς Λειτουργικά Συστήματα Υπολογιστών

Διαβάστε περισσότερα

Διάλεξη 18η: Διαχείρηση Αρχείων

Διάλεξη 18η: Διαχείρηση Αρχείων Διάλεξη 18η: Διαχείρηση Αρχείων Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Πρατικάκης (CSD) Αρχεία CS100, 2015-2016 1 / 24 Η βιβλιοθήκη Εισόδου/Εξόδου Στο stdioh

Διαβάστε περισσότερα

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

Προγραμματισμός συστημάτων UNIX/POSIX Προγραμματισμός συστημάτων UNIX/POSIX Προχωρημένη διαδιεργασιακή επικοινωνία: επώνυμοι αγωγοί (FIFOs) ουρές μηνυμάτων (message queues) κοινόχρηστη μνήμη (shared memory) σήματα (signals) Ανάγκη Ότι είδαμε

Διαβάστε περισσότερα

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ IΙ Λύβας Χρήστος chrislibas@ssl-unipi.gr Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος >_ FILE SYSTEM >_ ΔΙΚΑΙΩΜΑΤΑ >_ ΔΙΚΑΙΩΜΑΤΑ? >_ ΜΕΤΑΒΟΛΗ ΔΙΚΑΙΩΜΑΤΩΝ +- chmod

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής ΕΥ311-Διαδικτυακός και Ταυτόχρονος Προγραμματισμός Εργαστήριο: Παραδείγματα δημιουργίας διεργασιών στο Linux Ένα πρόγραμμα (το στιγμιότυπο της εκτέλεσης του οποίου

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ KΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ http://www.cslab.ece.ntua.gr Λειτουργικά

Διαβάστε περισσότερα

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

Προγραμματισμός συστημάτων UNIX/POSIX. Σήματα (signals) Προγραμματισμός συστημάτων UNIX/POSIX Σήματα (signals) Σήματα (signals) Τα σήματα είναι «διακοπές» λογισμικού (software interrupts) οι οποίες διακόπτουν την κανονική λειτουργία μίας διεργασίας. Προκαλούνται

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ KΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ http://www.cslab.ece.ntua.gr Λειτουργικά

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα (Λ/Σ) Λειτουργικά Συστήματα (Λ/Σ) Διαχείριση Αρχείων Βασίλης Σακκάς 11/12/2013 1 Διαχείριση Αρχείων 1 Μακρόχρονη αποθήκευση πληροφοριών 1. Αποθήκευση μεγάλου όγκου δεδομένων 2. Οι αποθηκευμένες πληροφορίες πρέπει

Διαβάστε περισσότερα

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2015-16 Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Λειτουργικό Σύστημα:

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

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

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων 2 η Εργαστηριακή Άσκηση: Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία Λειτουργικά

Διαβάστε περισσότερα

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

Προγραμματισμός συστημάτων UNIX/POSIX Προγραμματισμός συστημάτων UNIX/POSIX Προχωρημένη διαδιεργασιακή επικοινωνία: επώνυμοι αγωγοί (FIFOs) ουρές μηνυμάτων (message queues) κοινόχρηστη μνήμη (shared memory) Ανάγκη Ότι είδαμε μέχρι τώρα μπορεί

Διαβάστε περισσότερα

Αρχεία. Προγραμματισμός II 1

Αρχεία. Προγραμματισμός II 1 Αρχεία Προγραμματισμός II 1 ais@inf.uth.gr Αποθήκευση δεδομένων Οι μεταβλητές και δομές δεδομένων ενός προγράμματος υπάρχουν στην μνήμη του Η/Υ Χάνονται όταν τερματιστεί το πρόγραμμα ή σβήσει ο Η/Υ (πιθανώς

Διαβάστε περισσότερα

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

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες» 1. Εισαγωγή Λειτουργικά Συστήματα Η/Υ Κεφάλαιο 3 «Διεργασίες» Διδάσκων: Δ Λιαροκάπης Διαφάνειες: Π. Χατζηδούκας Η έννοια της διεργασίας (process) είναι θεμελιώδης για την κατανόηση του τρόπου με τον οποίο

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Αρχεία. Προγραμματισμός II 1

Αρχεία. Προγραμματισμός II 1 Αρχεία Προγραμματισμός II 1 ais@inf.uth.gr Μόνιμη αποθήκευση δεδομένων Οι μεταβλητές και δομές δεδομένων ενός προγράμματος υπάρχουν στην μνήμη του Η/Υ Χάνονται όταν τερματιστεί το πρόγραμμα ή σβήσει ο

Διαβάστε περισσότερα

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2018-19 Λειτουργικό Σύστημα: διαχείριση πόρων Εισαγωγή Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) Επικοινωνία με χρήστη

Διαβάστε περισσότερα

[11] Υπολογιστικά συστήματα: Στρώματα. Περιεχόμενα. Εισαγωγή. επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό

[11] Υπολογιστικά συστήματα: Στρώματα. Περιεχόμενα. Εισαγωγή. επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό Υπολογιστικά συστήματα: Στρώματα 1 ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗς ΠΛΗΡΟΦΟΡΙΚΗΣ επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό δεδομένα Εισαγωγή στο Unix Περιεχόμενα Εισαγωγή 2 Εισαγωγή

Διαβάστε περισσότερα

Λειτουργικό Σύστημα: διαχείριση πόρων. Διαχείριση αρχείων. Τι είναι ένα αρχείο ; Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Λειτουργικό Σύστημα: διαχείριση πόρων. Διαχείριση αρχείων. Τι είναι ένα αρχείο ; Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2015-16 Λειτουργικό Σύστημα: διαχείριση πόρων Εισαγωγή Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων) Επικοινωνία με χρήστη

Διαβάστε περισσότερα

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

Εργαστήριο 5 fork(), exec(), signals Εργαστήριο 5 fork(), exec(), signals Στο εργαστήριο θα μελετηθούν: Παραδείγματα χρήσης των συναρτήσεων fork και exec Συνάρτηση waitpid Συνάρτηση WIFEXITED Συνάρτηση WEXITSTATUS Παράδειγμα χρήσης σημάτων

Διαβάστε περισσότερα

Λιβανός Γιώργος Εξάμηνο 2017Β

Λιβανός Γιώργος Εξάμηνο 2017Β Λιβανός Γιώργος Εξάμηνο 2017Β Υπολογιστικό σύστημα Υλικό (hardware) Λογισμικό (Software) Ολοκληρωμένα κυκλώματα, δίσκοι, οθόνη, κλπ. Λογισμικό συστήματος Προγράμματα εφαρμογών Χρειάζονται ένα συντονιστή!!!

Διαβάστε περισσότερα

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

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στα Πολυεπεξεργαστικά Συστήματα Διερασίες και Νήματα σε Πολυεπεξεργαστικά Συστήματα Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed

Διαβάστε περισσότερα

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Βιβλιοθήκη stdio. Προγραμματισμός II 1 Βιβλιοθήκη 1 lalis@inf.uth.gr Δεδομένα και ερμηνεία (ξανά) Τα δεδομένα στον Η/Υ έχουν δυαδική μορφή (bytes) Η ερμηνεία των bytes εξαρτάται από το πρόγραμμα που παράγει/καταναλώνει τα δεδομένα Μια δημοφιλής

Διαβάστε περισσότερα

Unix: Εντολές, οργάνωση και χειρισµός αρχείων, διεργασίες

Unix: Εντολές, οργάνωση και χειρισµός αρχείων, διεργασίες Unix: Εντολές, οργάνωση και χειρισµός αρχείων, διεργασίες Σύνταξη εντολών Περιεχόµενα Οργάνωση και χειρισµός αρχείων Μπαλαντέρ ικαιώµατα χρήσης αρχείων και οµάδες χρηστών Έλεγχος διεργασιών Σύνταξη εντολών

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ KΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ http://www.cslab.ece.ntua.gr Λειτουργικά

Διαβάστε περισσότερα

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

Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4. Λειτουργικά Συστήματα- Φροντιστήριο 2 Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4 Φροντιστήριο 2 1 Λειτουργικό Σύστημα -> Multitasking Κάθε διεργασία μπορεί να ειδωθεί σαν μία δέσμη στοιχείων που διατηρούνται από τον πυρήνα

Διαβάστε περισσότερα

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15) (Κεφάλαιο 2.7 και 12) Αρχεία στην C (Διάλεξη 15) 14-1 Επανάληψη στην Αποθήκευση (Storage) Για να αποθηκεύσουμε δεδομένα από ένα πρόγραμμα, πρέπει να χρησιμοποιήσουμε την Δευτερεύουσα Μνήμη 14-2 Επανάληψη

Διαβάστε περισσότερα

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

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes) Προγραμματισμός συστημάτων UNIX/POSIX Διεργασίες (processes) Δομή αρχείου προγράμματος Πρόγραμμα (program) ονομάζεται το εκτελέσιμο αρχείο που βρίσκεται αποθηκευμένο στο δίσκο (π.χ. το a.out, ή το ls ή

Διαβάστε περισσότερα

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον

Διαβάστε περισσότερα

File Management και I/O στο UNIX

File Management και I/O στο UNIX File Management και I/O στο UNIX Λειτουργικά Συστήματα Ντίρλης Νικόλαος- ΕΤΥ Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πάτρας Συστήματα 2013-2014 1 Εισαγωγή Ένα από τα βασικά στοιχεία της επιστήμης της Πληροφορικής

Διαβάστε περισσότερα

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor Προηγμένοι Μικροεπεξεργαστές Εργαστήριο 4 - Editor Περιγραφή Υλοποίηση ενός υποτυπώδους editor που θα: Διαβάζει ένα προκαθορισμένο αρχείο Θα το απεικονίζει στην οθόνη Θα κάνει highlight με έναν ελεγχόμενο

Διαβάστε περισσότερα

Εργαστήριο 9: Αρχεία

Εργαστήριο 9: Αρχεία Εργαστήριο 9: Αρχεία Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Αρχεία, Είσοδος/Έξοδος από/προς αρχεία - Δυαδικά αρχεία - Παραδείγματα ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ.

Διαβάστε περισσότερα

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 lalis@inf.uth.gr Κλείδωμα αρχείων Οι διεργασίες που προσπελάζουν ένα αρχείο μέσω ξεχωριστών περιγραφέων, μπορούν να γράψουν / διαβάσουν τα περιεχόμενα

Διαβάστε περισσότερα

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input). Κ24: Προγραμματισμός Συστήματος 2η Εργασία Εαρινό Εξάμηνο 2017 Προθεσμία Υποβολής: Κυριακή 30 Απριλίου 2017 Ωρα 23:59 Εισαγωγή στην Εργασία: Ο στόχος της εργασίας αυτής είναι να εξοικειωθείτε με την δημιουργία

Διαβάστε περισσότερα

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

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες 0x375 - Thessaloniki Tech Talks Sessions Event 0x2 19 Μαρτίου 2010 Περιεχόμενα 1 Εισαγωγή 2 Η κλήση συστήματος ptrace 3 Νήματα 4 Το πρόγραμμα εισαγωγής κώδικα prez 5 Επίλογος Γιατί; Πολλές φορές θέλουμε

Διαβάστε περισσότερα

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

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Δέκατη-τρίτη (13 η ) τρίωρη διάλεξη. Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/

Διαβάστε περισσότερα

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1

Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων. Προγραμματισμός II 1 Βασικές λειτουργίες συστήματος πάνω σε αρχεία δεδομένων 1 ais@inf.uth.gr Βασικές λειτουργίες (1) int pen(cnst char *path, int fags, mde_t perms) ανοίγει το αρχείο με όνομα path (αν συμπεριλαμβάνεται ένα

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα Λειτουργικά Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:09 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Λειτουργικά Συστήματα Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Στέργιος Παλαμάς, Υλικό Μαθήματος «Λειτουργικά Συστήματα», 2015-2016 Κεφάλαιο 4: Διεργασίες Πρόγραμμα Πρόγραμμα 1 Πρόγραμμα

Διαβάστε περισσότερα

Εικονική Μνήμη (Virtual Μemory)

Εικονική Μνήμη (Virtual Μemory) ΗΥ 431 Αρχιτεκτονική Παραλλήλων Συστημάτων Διάλεξη 16 Εικονική Μνήμη (Virtual Μemory) Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ Απλό πείραμα int *data = malloc((1

Διαβάστε περισσότερα

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1 Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1 lalis@inf.uth.gr Συνεργασία ανάμεσα σε διεργασίες Για ασφάλεια/ανεξαρτησία, το ΛΣ εξασφαλίζει πλήρη απομόνωση ανάμεσα στις

Διαβάστε περισσότερα

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ. Εισαγωγή στο Unix

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ. Εισαγωγή στο Unix ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Εισαγωγή στο Unix Υπολογιστικά συστήματα: Στρώματα 1 επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό δεδομένα Περιεχόμενα 2 Εισαγωγή

Διαβάστε περισσότερα

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013

Τµήµα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σεπτέµβριος 2013 Γράψτε όλες τις απαντήσεις σας σε αυτό το φυλλάδιο Οδηγίες για Α: Διαβάστε προσεκτικά όλες τις επιλογές σηµειώστε µε Χ (το πολύ) µια από αυτές. Μην επιλέγετε «στην τύχη» οι λανθασµένες απαντήσεις βαθµολογούνται

Διαβάστε περισσότερα

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

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων 2 η Εργαστηριακή Άσκηση: Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία Λειτουργικά

Διαβάστε περισσότερα

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX Ύλη του Μαθήµατος Μάθηµα: Λειτουργικά Συστήµατα ΙΙ UNIX Βιβλίο Μαθήµατος: α) Tanenbaum, A.:ΣύγχροναΛειτουργικάΣυστήµατα, 2ηΈκδοση, Εκδόσεις Κλειδάριθµος. β) Wrightson, K.,

Διαβάστε περισσότερα

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

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1 Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1 lalis@inf.uth.gr Μνήμη και επικοινωνία διεργασιών Κάθε διεργασία έχει δική της ιδιωτική μνήμη Μια διεργασία δεν μπορεί να γράψει/διαβάσει από/σε θέσεις

Διαβάστε περισσότερα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX. Συστήματα Αρχείων. Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης Δρ. Α. Γαλάνη

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX. Συστήματα Αρχείων. Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης Δρ. Α. Γαλάνη ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - UNIX Μάθημα: Λειτουργικά Συστήματα Συστήματα Αρχείων Διδάσκoντες: Καθ. Κ. Λαμπρινουδάκης (clam@unipi.gr) Δρ. Α. Γαλάνη (agalani@unipi.gr) Λειτουργικά Συστήματα 1 Μακροχρόνια

Διαβάστε περισσότερα

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2015-16 Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, και Ε/Ε) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι

Διαβάστε περισσότερα

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, και Ε/Ε) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι

Διαβάστε περισσότερα

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Βιβλιοθήκη stdio. Προγραμματισμός II 1 Βιβλιοθήκη 1 lalis@inf.uth.gr Σύνοψη Ορίστηκε από τον Dennis Ritchie το 1975 Μέρος του προτύπου ANSI C Λειτουργίες εισόδου/εξόδου υψηλού επίπεδου και ανεξάρτητες λειτουργικού συστήματος Υποστήριξη για

Διαβάστε περισσότερα

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

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1 Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1 lalis@inf.uth.gr Ο κώδικας δεν εκτελείται «μόνος του» Ο εκτελέσιμος κώδικας αποθηκεύεται σε ένα αρχείο Το αρχείο είναι μια «παθητική» οντότητα

Διαβάστε περισσότερα

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Το λειτουργικό σύστημα. Προγραμματισμός II 1 Το λειτουργικό σύστημα Προγραμματισμός II 1 lalis@inf.uth.gr Συστήματα υπολογιστών Ειδικού σκοπού συστήματα για μια συγκεκριμένη εφαρμογή η εφαρμογή είναι γνωστή εκ των προτέρων περιορισμένοι υπολογιστικοί

Διαβάστε περισσότερα

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου

Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου 1 Εισαγωγή στο περιβάλλον προγραμματισμού του εργαστηρίου Λειτουργικά Συστήματα 7ο εξάμηνο ΣΗΜΜΥ ακ έτος 2015-2016 http://wwwcslabecentuagr/courses/os CSLab National Technical University of Athens Εργαστήριο

Διαβάστε περισσότερα

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) Αρχείο είναι μια συλλογή δεδομένων του ίδιου τύπου. Ενα αρχείο αποθηκεύεται στην περιφερειακή μνήμη (σκληρό δίσκο, δισκέττα). Τα αρχεία είναι μόνιμα. Τα δεδομένα

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις Υλικό από: Modern Operating Systems Laboratory Exercises, Shrivakan Mishra Σύνθεση Κ.Γ. Μαργαρίτης, Τμήμα Εφαρμοσμένης Πληροφορικής, Πανεπιστήμιο

Διαβάστε περισσότερα

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

Διεργασίες και Νήματα (1/2) Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Διεργασίες και Νήματα (1/2) Λειτουργικά Συστήματα Υπολογιστών 7ο Εξάμηνο, 2016-2017 Διεργασίες

Διαβάστε περισσότερα

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

Μεθόδων Επίλυσης Προβλημάτων ΕΠΛ 032.3: 3: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 10 Αρχεία στην C Επανάληψη στην Αποθήκευση (Storage)

Διαβάστε περισσότερα

Εργαστήριο ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ UNIX

Εργαστήριο ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ UNIX Εργαστήριο ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ UNIX Εισαγωγή Ξεκινάμε την εργαστηριακή μελέτη των Λειτουργικών Συστημάτων των Υπολογιστικών Συστημάτων εξετάζοντας αρχικά το λειτουργικό σύστημα Unix. Σκοπός του εργαστηρίου

Διαβάστε περισσότερα

Εικονική Μνήμη (1/2)

Εικονική Μνήμη (1/2) Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Εικονική Μνήμη (1/2) Λειτουργικά Συστήματα Υπολογιστών 7ο Εξάμηνο, 2016-2017 Εικονική Μνήμη

Διαβάστε περισσότερα

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ)

ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ) ΣΥΣΚΕΥΕΣ ΑΠΟΘΗΚΕΥΣΗΣ (ΜΝΗΜΗ) Συσκευές αποθήκευσης Ένας υπολογιστής προκειµένου να αποθηκεύσει δεδοµένα χρησιµοποιεί δύο τρόπους αποθήκευσης: Την Κύρια Μνήµη Τις συσκευές µόνιµης αποθήκευσης (δευτερεύουσα

Διαβάστε περισσότερα

UNIX System Programming

UNIX System Programming UNIX System Programming Processes Objectives look at how to program UNIX processes fork( ), wait( ) Overview 1. What is a Process? 2. fork() 3. wait() 4. Process Data 1. What is a Process? A process is

Διαβάστε περισσότερα

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

Εργαστήριο ΔΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ & ΚΑΤΑΛΟΓΩΝ ΣΤΟ UNIX. Εισαγωγή

Εργαστήριο ΔΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ & ΚΑΤΑΛΟΓΩΝ ΣΤΟ UNIX. Εισαγωγή Εισαγωγή Εργαστήριο 2 ΔΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ & ΚΑΤΑΛΟΓΩΝ ΣΤΟ UNIX Συνεχίζουμε την εργαστηριακή μελέτη των Λειτουργικών Συστημάτων εξετάζοντας τις δομές των αρχείων και καταλόγων και τη διαχείρισή τους στο

Διαβάστε περισσότερα

Εισαγωγή στην Επιστήμη της Πληροφορικής Εργαστήριο. UNIX Μέρος 1

Εισαγωγή στην Επιστήμη της Πληροφορικής Εργαστήριο. UNIX Μέρος 1 Πανεπιστήμιο Κύπρου Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη της Πληροφορικής και Πληροφοριακά Συστήματα Εργαστήριο - ΕΠΛ003 Εισαγωγή στην Επιστήμη της Πληροφορικής Εργαστήριο UNIX Μέρος 1 Παναγιώτης

Διαβάστε περισσότερα

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προχωρημένα Θέματα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ανακατεύθυνση Εισόδου/Εξόδου Συνήθως η τυπική είσοδος ενός προγράμματος (stdin) προέρχεται

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων Δομημένος Προγραμματισμός Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr 2 Διαχείριση

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο 2018-2019 Άσκηση 1 Φροντιστήριο: 05/10/2018 Παράδοση: 18/10/2018 Υλοποίηση Linux C Shell ΤΑ : shevtsov(shevtsov@csd.uoc.gr) Ώρες Γραφείου : Δευτέρα 14:00-16:00

Διαβάστε περισσότερα

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

Εισαγωγή στα Λειτουργικά Συστήματα Εισαγωγή στα Λειτουργικά Συστήματα Ενότητα 8: Αρχεία Ι Γεώργιος Φ. Φραγκούλης Τμήμα Ηλεκτρολόγων Μηχανικών Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 lalis@inf.uth.gr Κλείδωμα αρχείων Οι διεργασίες που προσπελάζουν ένα αρχείο μέσω ξεχωριστών περιγραφέων, μπορούν να γράψουν / διαβάσουν τα περιεχόμενα

Διαβάστε περισσότερα

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στο Λ.Σ. UNIX

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στο Λ.Σ. UNIX Εισαγωγή στην Επιστήμη Υπολογιστών Εισαγωγή στο Λ.Σ. UNIX Εργαστηριακές Σημειώσεις Εισαγωγή στο UNIX Αρμοδιότητες των Λ.Σ. Διαχείριση πόρων o o Συσκευές I/O (disk, keyboard, mouse, terminal) Μνήμη Διαχείριση

Διαβάστε περισσότερα

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων. Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων. Έως τώρα σε ένα πρόγραμμα έχουμε μάθει να εισάγουμε δεδομένα από το πληκτρολόγιο χρησιμοποιώντας την συνάρτηση scanf() και να εκτυπώνουμε δεδομένα

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

Διαβάστε περισσότερα

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

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1 Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1 lalis@inf.uth.gr Μνήμη και επικοινωνία διεργασιών Κάθε διεργασία έχει δική της ιδιωτική μνήμη Μια διεργασία δεν μπορεί να γράψει/διαβάσει από/σε θέσεις

Διαβάστε περισσότερα

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

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr Η έννοια της διεργασίας ιεργασία (process) είναι ο µηχανισµός εκτέλεσης ενός προγράµµατος σε ένα λειτουργικό σύστηµα. Η διεργασία είναι µια ενεργή

Διαβάστε περισσότερα

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο 2010 2011 Δ. Γουνόπουλος Ι. Ιωαννίδης Άσκηση 2: Υλοποίηση Ευρετηρίου Β+ Δένδρου Προθεσμία: 6 Ιουνίου 2011, 11:59μμ

Διαβάστε περισσότερα

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Επικοινωνία με περιφερειακά Αρτηρία εισόδου-εξόδου, διευθύνσεις, εγγραφές αναγνώσεις Διαδικασία εξόδου έλεγχος κατάστασης περιφερειακού περίμενε

Διαβάστε περισσότερα

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1 Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1 lalis@inf.uth.gr Τι είναι ένας αγωγός; Μηχανισμός/συσκευή επικοινωνίας διεργασιών Μετάδοση μιας ροής από bytes (μονής κατεύθυνσης) First-in-first-out (FIFO):

Διαβάστε περισσότερα

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης Η συνάρτηση printf() Η συνάρτηση printf() χρησιμοποιείται για την εμφάνιση δεδομένων στο αρχείο εξόδου stdout (standard output stream), το οποίο εξ ορισμού συνδέεται με την οθόνη Η συνάρτηση printf() δέχεται

Διαβάστε περισσότερα

Κεφάλαιο 3. Διδακτικοί Στόχοι

Κεφάλαιο 3. Διδακτικοί Στόχοι Κεφάλαιο 3 Σε ένα υπολογιστικό σύστημα η Κεντρική Μονάδα Επεξεργασίας (ΚΜΕ) εκτελεί τις εντολές που βρίσκονται στην κύρια μνήμη του. Οι εντολές αυτές ανήκουν σε προγράμματα τα οποία, όταν εκτελούνται,

Διαβάστε περισσότερα

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

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 15 η Αρχεία Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης Χριστοδούλου

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα Λειτουργικά Συστήματα Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:07 Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής Υπολογιστών

Διαβάστε περισσότερα

2ο Εργαστήριο. Εισαγωγική στο Λ.Σ. LINUX Γενικές εντολές συστήματος και χρηστών

2ο Εργαστήριο. Εισαγωγική στο Λ.Σ. LINUX Γενικές εντολές συστήματος και χρηστών ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Τμήμα Μηχανικών Πληροφορικής ΤΕ Λειτουργικά Συστήματα (Εργαστήριο) Διδάσκων: I. Τσακνάκης 2ο Εργαστήριο Εισαγωγική στο Λ.Σ. LINUX Γενικές εντολές συστήματος και χρηστών Πίνακας Εντολών

Διαβάστε περισσότερα

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct) Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct) Αρχεία Το γενικό πλαίσιο: data stream (ρεύμα δεδομένων). stdin, stdout, stderr data stream ως προς τα δεδομένα βάσει προσπέλασης

Διαβάστε περισσότερα

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

Παράδειγµα χρήσης perror, errno (πρόγραµµα errors_demo.c) Χειρισµός Λαθών 1 Παράδειγµα χρήσης perror, errno (πρόγραµµα errors_demo.c) 2 Είσοδος/Έξοδος Χαµηλού Επιπέδου 3 Είσοδος/Έξοδος Χαµηλού Επιπέδου (συν.) Αυτό αργότερα στο εξάµηνο 4 Κλήση συστήµατος open

Διαβάστε περισσότερα

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & Άνοιγμα αρχείου μέσα από τo SPIM, διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη (Διάλεξη 3) 1 Μετατροπή χαρακτήρων ASCII σε ακέραιο Ο πιο κάτω κώδικας

Διαβάστε περισσότερα

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 2: Δομή ενός προγράμματος C Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Εισαγωγή στην Πληροφορική Αστροφυσικός Αναπλ. Καθηγητής ΕΜΠ romylos@survey.ntua.gr Λειτουργικά συστήµατα, διεργασίες και δροµολόγηση Σύνδεση

Διαβάστε περισσότερα