260 likes | 341 Views
Λειτουργικά Συστήματα. Ντίρλης Νικόλαος- ΕΤΥ 1 ο Φροντιστήριο Παρασκευή, 11/10/2013 Β4. Φροντιστήριο. Κάθε Παρασκευή 13:00- 15:00 Παραδόσεις: Δευτέρα 13:00- 16:00 Κύριος στόχος του Φροντιστηρίου είναι η βοήθεια σε πρακτικά θέματα που αφορούν (κυρίως!) τις ασκήσεις του μαθήματος . .
E N D
Λειτουργικά Συστήματα Ντίρλης Νικόλαος- ΕΤΥ 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) Διεργασίες: • Για να μπορέσει μια διεργασία χρήστη (userprocess) να χρησιμοποιήσει τους πόρους πρέπει να καλέσει τις κατάλληλες ρουτίνες του kernel. • Αυτό επιτυγχάνεται μέσω systemcalls • Το κάθε systemcall υλοποιείται μέσω μίας ρουτίνας η οποία βρίσκεται σε μία βιβλιοθήκη που συνδέεται (linked) με τον κώδικα της userprocess. • Όλες οι ρουτίνες αυτής της βιβλιοθήκης εκτελούν μία ειδική εντολή, που ονομάζεται TRAP. Η εντολή TRAP είναι αυτή η οποία αλλάζει το σύστημα από usermode σε kernelmode • H κάθε διεργασία αντιπροσωπεύει ένα εκτελούμενο πρόγραμμα. • Οι διεργασίες μπορούν να έχουν και μία ιεραρχική σχέση. • Συχνά χρειάζεται να κοινοποιήσει ο kernel σε ένα process πληροφορία. Αυτό επιτυγχάνεται με την χρήση των signals Λειτουργικά Συστήματα- Φροντιστήριο
Θεωρία στα…γρήγορα (3/3) Αρχεία: • Τα αρχεία είναι οργανωμένα σε ομάδες που ονομάζονται κατάλογοι (directories). • Ένας κατάλογος μπορεί να περιέχει έναν άλλο κατάλογο, και έτσι δημιουργείται ένα ιεραρχικό σύστημα διαχείρισης αρχείων (filesystem). • Πέρα από την χρησιμοποίηση των αρχείων από τους χρήστες για μη-προσωρινά δεδομένα, τα αρχεία προσφέρουν και ένα τρόπο υψηλού-επιπέδου πρόσβασης σε περιφερειακές συσκευές • Pipes: Χρησιμοποιείται ώστε δύο διεργασίες να ανταλλάξουν πληροφορίες • Το «file» αποτελεί μια αφαίρεση (abstraction) για πολλά είδη I/O: με περιφερειακές συσκευές (π.χ., δίσκους, τερματικά) και με δια-διεργαστική επικοινωνία (interprocesscommunication). Λειτουργικά Συστήματα- Φροντιστήριο
Μονολιθικά ή Micro-kernels; (1/2) • Μονολιθικά: Σε αυτά τα συστήματα δεν υπάρχει καμία δομή όσον αφορά την οργάνωση των ρουτινών του Λ.Σ • Μικρο-πυρήνες: Αυτή η προσέγγιση βασίζεται στη φιλοσοφία ο πυρήνας του Λ.Σ. να είναι όσο τον δυνατόν μικρότερος. Ρουτίνες οι οποίες παραδοσιακά βρίσκονταν στον πυρήνα (kernel) τώρα βρίσκονται έξω απ’ αυτόν Λειτουργικά Συστήματα- Φροντιστήριο
Μονολιθικά ή Micro-kernels; (2/2) «The Tanenbaum-Torvalds debate was a debate between Andrew S. Tanenbaum and LinusTorvalds, 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 από ομάδα εργαζομένων των εργαστηρίων BellLabs) της εταιρείας AT&T (την ίδια εταιρεία που ανέπτυξε τη γλώσσα προγραμματισμού C). • Δεκαετία του 80’: Το MINIX είναι ένα Unix-like Λ.Σ. βασιζόμενο στη σχεδιαστική τεχνική των μικρο-πυρήνων που δημιουργήθηκε από τον Andrew S. TanenbaumστοVrijeUniversiteitτου 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, ο LinusTorvaldsφοιτητής στο 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 • Τι χρειάζομαι για να προγραμματίσω στα Ubuntu; • Αυτά που χρειάζεστε είναι ένα τερματικό και ένα editor της επιλογής σας. • Τερματικό: Applications/Accessories/Terminal • Εditor:gedit Applications/Accessories/text editor Λειτουργικά Συστήματα- Φροντιστήριο
Βασικές Εντολές Τερματικού cd: ◦cd .. (ανέβα ένα επίπεδο πάνω) ◦cd ~ (πήγαινέ με στο homedir μου) ◦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 • gcchelloworld.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 • gcchelloworld.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(intargc, char **argv) { hello("World"); return 0; } Λειτουργικά Συστήματα- Φροντιστήριο
Πολλά Αρχεία (2/2) terminal $ gcc -Wall -c main.c $ gcc -Wall -c hello.c $ gccmain.ohello.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(intargc, char **argv) { hello("World"); return 0; } Λειτουργικά Συστήματα- Φροντιστήριο
Ορίσματα (1/2) intmain(intargc, char **argv) ◦argc: Αριθμός ορισμάτων προγράμματος ◦argv: Πίνακας με τα ορίσματα ◦argv[0]: Το όνομα του προγράμματος Παράδειγμα: αρχείο args.c #include <stdio.h> int main(intargc, char **argv) { inti; 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 Εναλλακτικά: gccargs.c ./a.out arg1 arg2 Λειτουργικά Συστήματα- Φροντιστήριο