Λειτουργικά Συστήματα Ντίρλης Νικόλαος- ΕΤΥ 1ο Φροντιστήριο Παρασκευή, 11/10/2013 Β4 Λειτουργικά Συστήματα- Φροντιστήριο
Φροντιστήριο Κάθε Παρασκευή 13:00- 15:00 Παραδόσεις: Δευτέρα 13:00- 16:00 Κύριος στόχος του Φροντιστηρίου είναι η βοήθεια σε πρακτικά θέματα που αφορούν (κυρίως!) τις ασκήσεις του μαθήματος. Λειτουργικά Συστήματα- Φροντιστήριο
Στόχος των Ασκήσεων Εξοικείωση με θεμελιώδεις έννοιες και μηχανισμούς που προσφέρει το λειτουργικό σύστημα UNIX και τα UNIX-like συστήματα ◦ δημιουργία/διαχείριση διεργασιών ◦ επικοινωνία διεργασιών Γλώσσα προγραμματισμού C Κλήση συστήματος fork Χρήση Sockets Μοντέλο Πελάτη- Εξυπηρέτη (Client-Server model) Χρήση Shared memory Χρήση Semaphores Χρήση Signals Λειτουργικά Συστήματα- Φροντιστήριο
Θεωρία στα… γρήγορα (1/3) Λειτουργικό Σύστημα: 1) Διαχείριση Πόρων 2) Μηχανή Αφαίρεσης: α) Διεργασίες β) Αρχεία Πυρήνας (Kernel) Λ.Σ: 1) Kύριο τμήμα του Λ.Σ 2) Yλοποιεί τις δύο βασικές οντότητες (processes και files) του Λ.Σ. Τρόποι Λειτουργίας: 1) User Mode 2) Kernel Mode (ο χρήστης δεν μπορεί να επέμβει) Λειτουργικά Συστήματα- Φροντιστήριο
Θεωρία στα… γρήγορα (2/3) Διεργασίες: Για να μπορέσει μια διεργασία χρήστη (user process) να χρησιμοποιήσει τους πόρους πρέπει να καλέσει τις κατάλληλες ρουτίνες του kernel. Αυτό επιτυγχάνεται μέσω system calls Το κάθε system call υλοποιείται μέσω μίας ρουτίνας η οποία βρίσκεται σε μία βιβλιοθήκη που συνδέεται (linked) με τον κώδικα της user process. Όλες οι ρουτίνες αυτής της βιβλιοθήκης εκτελούν μία ειδική εντολή, που ονομάζεται TRAP. Η εντολή TRAP είναι αυτή η οποία αλλάζει το σύστημα από user mode σε kernel mode H κάθε διεργασία αντιπροσωπεύει ένα εκτελούμενο πρόγραμμα. Οι διεργασίες μπορούν να έχουν και μία ιεραρχική σχέση. Συχνά χρειάζεται να κοινοποιήσει ο kernel σε ένα process πληροφορία. Αυτό επιτυγχάνεται με την χρήση των signals Λειτουργικά Συστήματα- Φροντιστήριο
Θεωρία στα…γρήγορα (3/3) Αρχεία: Τα αρχεία είναι οργανωμένα σε ομάδες που ονομάζονται κατάλογοι (directories). Ένας κατάλογος μπορεί να περιέχει έναν άλλο κατάλογο, και έτσι δημιουργείται ένα ιεραρχικό σύστημα διαχείρισης αρχείων (file system). Πέρα από την χρησιμοποίηση των αρχείων από τους χρήστες για μη-προσωρινά δεδομένα, τα αρχεία προσφέρουν και ένα τρόπο υψηλού-επιπέδου πρόσβασης σε περιφερειακές συσκευές Pipes: Χρησιμοποιείται ώστε δύο διεργασίες να ανταλλάξουν πληροφορίες Το «file» αποτελεί μια αφαίρεση (abstraction) για πολλά είδη I/O: με περιφερειακές συσκευές (π.χ., δίσκους, τερματικά) και με δια- διεργαστική επικοινωνία (interprocess communication). Λειτουργικά Συστήματα- Φροντιστήριο
Μονολιθικά ή Micro-kernels; (1/2) Μονολιθικά: Σε αυτά τα συστήματα δεν υπάρχει καμία δομή όσον αφορά την οργάνωση των ρουτινών του Λ.Σ Μικρο-πυρήνες: Αυτή η προσέγγιση βασίζεται στη φιλοσοφία ο πυρήνας του Λ.Σ. να είναι όσο τον δυνατόν μικρότερος. Ρουτίνες οι οποίες παραδοσιακά βρίσκονταν στον πυρήνα (kernel) τώρα βρίσκονται έξω απ’ αυτόν Λειτουργικά Συστήματα- Φροντιστήριο
Μονολιθικά ή Micro-kernels; (2/2) «The Tanenbaum-Torvalds debate was a debate between Andrew S. Tanenbaum and Linus Torvalds, regarding Linux and kernel architecture in general. Tanenbaum began the debate in 1992 on the Usenet discussion group comp.os.minix, arguing that microkernels are superior to monolithic kernels and therefore Linux was, even in 1992, obsolete.» Λειτουργικά Συστήματα- Φροντιστήριο
Τα Λειτουργικά Συστήματα σήμερα Android, BSD, iOS, Linux, OS X, QNX, Microsoft Windows,Windows Phone, IBM z/OS… Τα περισσότερα από τα παραπάνω (εκτός από τα Windows) έχουν τις ρίζες τους στο Unix Λειτουργικά Συστήματα- Φροντιστήριο
Από το Unix στο Linux (1/2) Δεκαετία του 60’: Το UNIX είναι Λ.Σ που αναπτύχθηκε κατά τις δεκαετίες του 1960 και του 1970 από ομάδα εργαζομένων των εργαστηρίων Bell Labs) της εταιρείας AT&T (την ίδια εταιρεία που ανέπτυξε τη γλώσσα προγραμματισμού C). Δεκαετία του 80’: Το MINIX είναι ένα Unix-like Λ.Σ. βασιζόμενο στη σχεδιαστική τεχνική των μικρο-πυρήνων που δημιουργήθηκε από τον Andrew S. Tanenbaum στο Vrije Universiteit του Amsterdam για εκπαιδευτικούς σκοπούς. Το 1987 μπορούσε κάποιος να χρησιμοποιήσει το MINIX αν είχε μια κόπια των 12,000 γραμμών κώδικα σε C (kernel, memory manager και file system του MINIX 1.0) σε ένα floppy disk της εποχής. Την ίδια δεκαετία αναπτύχθηκε και το GNU project από τον Richard Stallman. Λειτουργικά Συστήματα- Φροντιστήριο
Από το Unix στο Linux (2/2) Δεκαετία του 90’: Το 1991, ο Linus Torvalds φοιτητής στο University of Helsinki in Finland ξεκίνησε να πειραματίζεται σε ένα Unix-like Λ.Σ. Μετά από 6 μήνες δουλειάς αποφάσισε ότι η λειτουργικότητα του project του δεν ήταν η επιθυμητή και έτσι αποφάσισε να ανεβάσει τον κώδικά του στο διαδίκτυο. Σχετικά σύντομα αναπτύχθηκε μια κοινότητα 40.000 χρηστών και προγραμματιστών που δούλεψαν πάνω στο Linux κάτω από την GNU άδεια. Λειτουργικά Συστήματα- Φροντιστήριο
Εγκατάσταση Linux (1/2) Η πιο «trendy» λύση είναι το Virtualbox! Δίνει τη δυνατότητα να έχουμε στο ίδιο μηχάνημα πολλά λειτουργικά συστήματα ταυτόχρονα (το καθένα τρέχει στο δικό του sandbox). Για παράδειγμα πολλές διανομές του Linux ή ακόμα και να μπορούμε να «παίζουμε» από τα Windows μας με Mac OS! Μοναδικό μειονέκτημα: Απόδοση Υπάρχουν «άπειρα» χρηστικά tutorials στο διαδίκτυο. Ένας οδηγός για αυτούς που «βαριούνται» το διάβασμα: http://www.youtube.com/watch?v=VX5MhjT3qgY Μπορείτε να κατεβάσετε το Virtualbox από εδώ: https://www.virtualbox.org/wiki/Downloads Λειτουργικά Συστήματα- Φροντιστήριο
Εγκατάσταση Linux (2/2) Κατεβάστε την καινούργια έκδοση από εδώ: http://ubuntu-gr.org/ (επισκεφτείτε οπωσδήποτε και το εξαιρετικό Forum με πολλά tutorials ακόμα και με θέματα που δεν έχουν να κάνουν αναγκαστικά με Linux) Υπάρχει η δυνατότητα να κατεβάσετε έτοιμο στημένο σύστημα πχ από εδώ: http://virtualboxes.org/images/ubuntu/ αν και είναι σαφώς πιο «ψαγμένο» να ρυθμίσετε εσείς τις παραμέτρους της εικονικής μηχανής σας (υπάρχουν άπειρα online tutorials) Λειτουργικά Συστήματα- Φροντιστήριο
Στα Windows; Με τη βοήθεια της εφαρμογής DEV++ από την ιστοσελίδα της bloodshed: http://www.bloodshed.net/ Δεν το συνιστούμε όμως! Λειτουργικά Συστήματα- Φροντιστήριο
Το Τερματικό στο Ubuntu Αυτά που χρειάζεστε είναι ένα τερματικό και ένα editor της επιλογής σας. Τερματικό: Applications/Accessories/Terminal Εditor: gedit Applications/Accessories/text editor Λειτουργικά Συστήματα- Φροντιστήριο
Βασικές Εντολές Τερματικού cd : ◦cd .. (ανέβα ένα επίπεδο πάνω) ◦cd ~ (πήγαινέ με στο home dir μου) ◦pwd (που βρίσκομαι) ls ,mkdir, rmdir, mv, rm, cp …και φυσικά: man <όνομα> για να μάθουμε τι κάνουν όλα τα παραπάνω! Λειτουργικά Συστήματα- Φροντιστήριο
Compile & Run! (1/4) Πριν από οτιδήποτε άλλο μια συμβουλή: Φτιάξτε ευανάγνωστους κώδικες! Σωστή δομή, επαρκή σχόλια Επαρκή σχόλια = 60% των συνολικών γραμμών είναι σχόλια (∼ 1-2 γραμμές σχόλια για κάθε 1 γραμμή πηγαίου κώδικα) Σωστή χρήση tabs-spaces Σωστή δομή σε συναρτήσεις / υπο-αρχεία Λειτουργικά Συστήματα- Φροντιστήριο
Compile & Run! (2/4) Στην πραγματικότητα θα δείξουμε πως κάνουμε compile + link + run. Δημιουργία αρχείου helloworld.c στο getit gcc helloworld.c Δημιουργία αρχείου a.out στον ίδιο φάκελο (ελέγξτε με ls) ./a.out Λειτουργικά Συστήματα- Φροντιστήριο
Compile & Run! (3/4) gcc -Wall helloworld.c -o helloworld Σημαίνει: «κάνε compile και link το helloworld.c και φτιάξε το εκτελέσιμο helloworld» Για να «τρέξω» το helloworld γράφω: ./helloworld Λειτουργικά Συστήματα- Φροντιστήριο
Compile & Run! (4/4) gcc -Wall -c helloworld.c gcc helloworld.o -o helloworld Το τρέχω πάλι με: ./helloworld Σε κάθε βήμα κάνω ls για να δω τα αρχεία που δημιουργούνται. Λειτουργικά Συστήματα- Φροντιστήριο
Πολλά Αρχεία (1/2) main.c #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } hello.c void hello(const char *); int main(int argc, char **argv) hello("World"); return 0; Λειτουργικά Συστήματα- Φροντιστήριο
Πολλά Αρχεία (2/2) terminal $ gcc -Wall -c main.c $ gcc -Wall -c hello.c $ gcc main.o hello.o -o hello $ ./hello Hello World! Λειτουργικά Συστήματα- Φροντιστήριο
Headers Διεπαφή προς άλλα κομμάτια κώδικα (API) Περιέχουν πρότυπα και δηλώσεις ◦Συναρτήσεις ◦Καθολικές (global) μεταβλητές .h αρχεία preprocessor: #include "header.h" Λειτουργικά Συστήματα- Φροντιστήριο
Παράδειγμα hello.h void hello(const char *); hello.c #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } main.c #include "hello.h" int main(int argc, char **argv) hello("World"); return 0; Λειτουργικά Συστήματα- Φροντιστήριο
Ορίσματα (1/2) int main(int argc, char **argv) Παράδειγμα: αρχείο args.c #include <stdio.h> { int i; for (i=0; i<argc; i++) printf("%d %s\n", i, argv[i]); return 0; } Λειτουργικά Συστήματα- Φροντιστήριο
Ορίσματα (2/2) Στο Τερματικό: ./args arg1 arg2 0 ./args 1 arg1 2 arg2 Εναλλακτικά: gcc args.c ./a.out arg1 arg2 Λειτουργικά Συστήματα- Φροντιστήριο