Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4 1
Διαχείριση εργασιών ◦ fork(), exit(), exec() (βλ 2 ο Φροντ.) Επικοινωνία διεργασιών ◦ signals (βλ 2 ο Φροντ.) ◦ sockets και client/server, shared memory Συγχρονισμός διεργασιών ◦ semaphores - 2 -
Θεωρούµε ότι: ◦ Μία διεργασία διαχειρίζεται τις κοινές πληροφορίες – την ονοµάζουµε εξυπηρετητή (server) ◦ Μια διεργασία ϑέλει να αποκτήσει πρόσβαση στις πληροφορίες – την ονοµάζουµε πελάτη (client) ◦ Όταν ο πελάτης ζητάει µια πληροφορία από τον εξυπηρετητή λέµε ότι κάνει µια αίτηση Μια διεργασία-πελάτης µπορεί να κάνει αιτήσεις σε διαφορετικές διεργασίες-εξυπηρετητές Μια διεργασία-εξυπηρετητής µπορεί να δέχεται αιτήσεις από διαφορετικές διεργασίες-πελάτες Μια διεργασία µπορεί να είναι ταυτόχρονα πελάτης και εξυπηρέτητής Το σχήµα µας επιτρέπει να υλοποιήσουµε ένα µεγάλο εύρος λειτουργιών Απόδοση/ Ευελιξία Αφαιρετικότητα - 3 -
Ο καθιερωµένος τρόπος επικοινωνίας είναι µε µηνύµατα Ορίστηκε αρχικά για τα συστήµατα UNIX (Xerox PARC- 70s) αλλά πλέον υποστηρίζεται από όλα τα λειτουργικά συστήµατα (εφαρμογές: WWW, , Network printing κτλ) Μοιάζει µε τον χειρισµό αρχείων – ένα κανάλι επικοινωνίας λειτουργεί σαν ένα αρχείο στο δίσκο ◦ Μια ενέργεια write µετατρέπεται σε send ◦ Μια ενέργεια read µετατρέπεται σε receive Μπορεί να υλοποιήσει είτε σύγχρονες είτε ασύγχρονες µεταφορές δεδοµένων Υποστηρίζει TCP και UDP ◦ UDP -- σαν ταχυδροµείο (σύντομα μυνήματα, ασύγχρονη επικοινωνία, μη αξιόπιστο, datagram sockets) ◦ TCP -- σαν κλήση σε τηλέφωνο (σύγχρονη και αξιόπιστη επικοινωνία, stream sockets) - 4 -
∆ύο διεργασίες που εκτελούνται στην ίδια υπολογιστική µονάδα µπορούν να χρησιµοποιήσουν µια απλουστευµένη έκδοση των sockets, γνωστά και ως pipes ◦ Εύκολα µπορούµε να τα µετατρέψουµε σε socket που λειτουργούν σε TCP/IP δίκτυα Το socket αποκτά την µορφή ενός εικονικού αρχείου ΄Ενα socket name µπορεί να ‘ελέγχεται’ από το πολύ µια διεργασία Μια διεργασία µπορεί να ‘ελέγχει’ πολλά socket names Οι αποστολείς πρέπει να ξέρουν το όνοµα του socket στο οποίο ‘ακούει’ ο παραλήπτης ◦ ΄Οποια διεργασία γνωρίζει το όνοµα του socket µπορεί να στείλει µηνύµατα ◦ Συνήθως είναι γνωστό εκ των προτέρων - 5 -
Για να χειριστούµε ένα 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 σαν κανονικά αρχεία
Ο εξυπηρέτης πρέπει να ‘συνδέσει’ το sd µε ένα local port του ΛΣ ως εξής: bind(sd, address, length); ◦ Το πεδίο address ορίζει το local port που ‘ακούει’ η διεργασία – δηλαδή το όνοµα του εικονικού αρχείου ◦ Το πεδίο length είναι το µήκος του πεδίου address Για να δεχθεί µια νέα σύνδεση χρησιµοποιεί την κλήση συστήµατος listen ως εξής: listen(sd, qlength); ◦ Ο εξυπηρέτης δέχεται τις κλήσεις σειριακά – άρα οι κλήσεις τοποθετούνται σε µία ουρά έως ότου η διεργασία τις εξυπηρετήσει ◦ Η παράµετρος qlength ορίζει το µέγεθος της ουράς - 7 -
- 8 -
#include main() { int sd, ns, fromlen; struct sockaddr sockaddr; 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);
... 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); }
#include main() { int sd; char buf[256]; sd = socket(AF_UNIX, SOCK_STREAM, 0); // connect to name -- don’t include null char connect(sd, "sockname", sizeof("sockname")-1);
... // 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); }
20 & 21: FTP 22: SSH 23: Telnet 25: SMTP ( ) 53: DNS 80: HTTP (WWW) 110: POP3 κτλ «A port number is a 16-bit unsigned integer, thus ranging from 1 to (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