140 likes | 239 Views
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι. Ντίρλης Νικόλαος- ΕΤΥ 3 ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 201 3 ΑΙΘΟΥΣΑ Β4. Διεργασίες. Διαχείριση εργασιών fork() , exit(), exec() (βλ 2 ο Φροντ.) Επικοινωνία διεργασιών s ignals ( βλ 2 ο Φροντ.) sockets και client/server, shared memory
E N D
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4
Διεργασίες • Διαχείριση εργασιών • fork(), exit(), exec()(βλ 2ο Φροντ.) • Επικοινωνία διεργασιών • signals(βλ 2ο Φροντ.) • sockets και client/server,shared memory • Συγχρονισμός διεργασιών • semaphores
Σχήµα Επικοινωνίας request-reply • Θεωρούµε ότι: • Μία διεργασία διαχειρίζεται τις κοινές πληροφορίες – τηνονοµάζουµε εξυπηρετητή (server) • Μια διεργασία ϑέλει να αποκτήσει πρόσβαση στις πληροφορίες –την ονοµάζουµε πελάτη(client) • Όταν ο πελάτης ζητάει µια πληροφορία από τον εξυπηρετητήλέµε ότι κάνει µια αίτηση • Μια διεργασία-πελάτης µπορεί να κάνει αιτήσεις σε διαφορετικές διεργασίες-εξυπηρετητές • Μια διεργασία-εξυπηρετητής µπορεί να δέχεται αιτήσεις από διαφορετικές διεργασίες-πελάτες • Μια διεργασία µπορεί να είναι ταυτόχρονα πελάτης και εξυπηρέτητής • Το σχήµα µας επιτρέπει να υλοποιήσουµε ένα µεγάλο εύρος λειτουργιών • Απόδοση/ Ευελιξία • Αφαιρετικότητα
Γενικά ΘέµαταSockets • Ο καθιερωµένος τρόπος επικοινωνίας είναι µε µηνύµατα • Ορίστηκε αρχικά για τα συστήµατα UNIX (Xerox PARC- 70s) αλλά πλέον υποστηρίζεται από όλα τα λειτουργικά συστήµατα (εφαρμογές: WWW, Email, Network printing κτλ) • Μοιάζει µε τον χειρισµό αρχείων – ένα κανάλι επικοινωνίας λειτουργεί σαν ένα αρχείο στο δίσκο • Μια ενέργεια write µετατρέπεται σε send • Μια ενέργεια read µετατρέπεται σε receive • Μπορεί να υλοποιήσει είτε σύγχρονες είτε ασύγχρονες µεταφορέςδεδοµένων • Υποστηρίζει TCP και UDP • UDP -- σαν ταχυδροµείο (σύντομα μυνήματα, ασύγχρονη επικοινωνία, μη αξιόπιστο, datagram sockets) • TCP -- σαν κλήση σε τηλέφωνο (σύγχρονη και αξιόπιστη επικοινωνία, stream sockets)
∆ιευθυνσιοδότηση και ∆ροµολόγηση • ∆ύο διεργασίες που εκτελούνται στην ίδια υπολογιστική µονάδα µπορούν να χρησιµοποιήσουν µια απλουστευµένη έκδοση των sockets, γνωστά και ως pipes • Εύκολα µπορούµε να τα µετατρέψουµε σε socket που λειτουργούν σε TCP/IP δίκτυα • Το socket αποκτά την µορφή ενός εικονικού αρχείου • ΄Ενα socket name µπορεί να ‘ελέγχεται’ από το πολύ µια διεργασία • Μια διεργασία µπορεί να ‘ελέγχει’ πολλά socket names • Οι αποστολείς πρέπει να ξέρουν το όνοµα του socket στο οποίο ‘ακούει’ ο παραλήπτης • ΄Οποια διεργασία γνωρίζει το όνοµα του socket µπορεί να στείλει µηνύµατα • Συνήθως είναι γνωστό εκ των προτέρων
Χρήση ενός Socket -- Πελάτης • Για να χειριστούµε ένα socket δουλεύουµε µε socket descriptors(σε αντιστοιχία με τα files descriptors) • Η αρχικοποίηση ενός socket descriptor (sd) γίνεται ως εξής: sd = socket(format, type, protocol); • ∆ηµιουργεί ένα νέο sd, format: AF_UNIX (local socket) ή AF_INET(6) για network sockets με υποστήριξη ή όχι IPv6. type: πχ stream, datagram ή raw, protocol: πχ TCP ή UDP • Ο πελάτης για να ‘συνδεθεί’ µε τον εξυπηρέτηχρησιµοποιεί την κλήση συστήµατοςconnect connect(sd, address, length); • Η αποστολή µηνυµάτων γίνεται µε την χρήση της write write(sd, "hello", 5); • Ουσιαστικά δηλαδή συμπεριφερόμαστε στα sockets σαν κανονικά αρχεία.
Χρήση ενός Socket -- Εξυπηρέτης • Ο εξυπηρέτης πρέπει να ‘συνδέσει’ το sd µε ένα localport του ΛΣ ως εξής: bind(sd, address, length); • Το πεδίο address ορίζει το localport που ‘ακούει’ η διεργασία – δηλαδή το όνοµα του εικονικού αρχείου • Το πεδίο length είναι το µήκος του πεδίου address • Για να δεχθεί µια νέα σύνδεση χρησιµοποιεί την κλήση συστήµατοςlisten ως εξής: listen(sd, qlength); • Ο εξυπηρέτης δέχεται τις κλήσεις σειριακά – άρα οι κλήσεις τοποθετούνται σε µία ουρά έως ότου η διεργασία τις εξυπηρετήσει • Η παράµετροςqlength ορίζει το µέγεθος της ουράς
Αρχείο simpleserver.c (1/2) #include <sys/types.h> #include <sys/socket.h> main() { intsd, ns, fromlen; structsockaddrsockaddr; char buf[256]; sd = socket(AF_UNIX, SOCK_STREAM, 0); // bind name -- don’t include null char bind(sd, "sockname", sizeof("sockname")-1); // listen for new connections (blocks) listen(sd, 1); ...
Αρχείο simpleserver.c (2/2) ... for(;;) { // new connection established ns = accept(sd, &sockaddr, &fromlen); // wait for message (blocks) read(ns, buf, sizeof(buf)); printf("server read ’%s’\n, buf); // send message write(ns, "OK", 2); // close connection & wait for next close(ns); } }
Αρχείο simpleclient.c (1/2) #include <sys/types.h> #include <sys/socket.h> main() { intsd; char buf[256]; sd = socket(AF_UNIX, SOCK_STREAM, 0); // connect to name -- don’t include null char connect(sd, "sockname", sizeof("sockname")-1); ...
Αρχείο simpleclient.c (2/2) ... // send message write(sd, "hello", 5); // wait for message (blocks) read(sd, buf, sizeof(buf)); printf("client read ’%s’\n, buf); // close connection close(sd); exit(0); }
Γνωστά Ports και εφαρμογές 20 & 21: FTP 22: SSH 23: Telnet 25: SMTP(Email) 53: DNS 80: HTTP (WWW) 110: POP3 κτλ «A port number is a 16-bit unsigned integer, thus ranging from 1 to 65535 (port number 0 is reserved and can't be used). A process associates its input or output channels via sockets (transport protocol, a port number and an address) . This process is known as binding, and enables sending and receiving data via the network. The OS’s networking software has the task of transmitting outgoing data from all application ports onto the network, and forwarding arriving network packets to a process by matching the packet's IP address and port number. Only one process may bind to a specific IP address and port combination using the same transport protocol.
Ανάγκη για συγχρονισμό Πρόβλημα του δείπνου των Φιλοσόφων (Dijkstra, 1965) Deadlock Starvation Λύσεις: Resource hierarchy solution (Dijkstra’s original solution), Arbitary solutions (semaphors, Dijkstra 1965) Δυαδικός semaphor=mutex