ntaryl Δημοσ. 9 Σεπτεμβρίου 2010 Δημοσ. 9 Σεπτεμβρίου 2010 Καλησπερα Μπορει καποιος να μου εξηγησει πια η διαφορα αυτων των 2 ? καποια πλεονεκτηματα τους ... ευχαριστω πολυ
warchief Δημοσ. 10 Σεπτεμβρίου 2010 Δημοσ. 10 Σεπτεμβρίου 2010 Τα blocking sockets ειναι οπως οποιοδήποτε blocking IO operation, έστω ότι socket_fd είναι ο file descriptor του socket, σε blocking socket το ακόλουθο call έχει ως εξής: int byte_read = read(socket_fd, buffer, read_bytes); η read θα επιστρέψει είτε όταν έχουν γίνει read, read_bytes απο το socket_fd είτε όταν η read κάνει timeout (πχ byte_read = -1). Σε κάθε περιπτωση ο κώδικας σου θα περιμένει την συνάρτηση read να κάνει return και μετά θα συνεχίσει την εκτέλεση του υπόλοιπου προγράμματος. Τώρα, το πότε θα επιστρέψει η read δεν είναι κάτι γνωστό απο πρίν και στην χειρότερη των περιπτώσεων είναι timeout seconds. Σε αυτή την περίπτωση λέμε πως η κλήση της read είναι σύγχρονη. Σε non blocking sockets η κλήση της read επιστρέφει απευθείας, σε αυτή την περίπτωση το λειτουργικό τσεκάρει αν ο file descriptor socket_fd έχει τόσα Bytes διαθέσιμα όσα θέλεις να διαβάσεις - read_bytes. Αν τα έχει διαθέσιμα τότε όλα καλά και ο buffer σου έχει αυτά τα bytes. Αν δεν τα έχει, τότε σε ειδοποιεί απευθείας (πχ bytes_read = -1). Σε κάθε περίπτωση η κλήση της read δεν μπλοκάρει (εξ ού και το blocking). Σε αυτή την περίπτωση λέμε πως η κλήση είναι ασύγχρονη. Τώρα το μεγάλο πλεονέκτημα με τα non blocking sockets είναι ότι ο κώδικας μπορεί να κάνει άλλα πράγματα χωρίς να χρειάζεται να περιμένει σε blocking IO calls. Επι του πρακτέου, φαντάσου έναν torrent client που πρέπει να διαχειρίζεται ταυτόχρονα input απο 100 seeders. Κάτι τέτοιο μπορείς να το υλοποιήσεις σε blocking sockets με 100 threads όπου κάθε thread αναλαμβάνει ενα connection, είτε σε non blocking sockets με ένα run loop στο οποίο κάθε στιγμή τσεκάρεις άν έχεις available input απο καθέναν απο τους seeders. Αρα το tradeoff έχει ως εξής: Performance: non blocking sockets Code simplicity: blocking sockets /Γιώργος
Evgenios1 Δημοσ. 10 Σεπτεμβρίου 2010 Δημοσ. 10 Σεπτεμβρίου 2010 Ειναι ονομα και πραμα. Η μια μπλοκαρει τον caller και ο αλλος οχι. Για να καταλαβεις πως γινεται το δευτερο, πρεπει να μελετησεις για multitherding. Πιο συγκεκριμενα τo callback.
karabouzouk... Δημοσ. 10 Σεπτεμβρίου 2010 Δημοσ. 10 Σεπτεμβρίου 2010 Performance: non blocking sockets Code simplicity: blocking sockets Εγώ νόμιζα ότι ισχύει το αντίθετο.. γιατί στα non-blocking με το να ελέγχουμε συνεχώς αν υπάρχουν διαθέσιμα δεδομένα κρατάμε διαρκώς απασχολημένο τον επεξεργαστή ακόμη και αν δεν υπάρχει καμιά μεταφορά για μεγάλο χρονικό διάστημα.. Με τα blocking sockets όταν δεν υπάρχει καμιά μεταφορά έχουμε μεν πολλά νήματα για τη διαχείριση όλων των sockets αλλά δεν εξοικονομούνται πόροι έτσι αφού μένουμε σε μια στάσιμη κατάσταση αναμονής..?
warchief Δημοσ. 10 Σεπτεμβρίου 2010 Δημοσ. 10 Σεπτεμβρίου 2010 Εγώ νόμιζα ότι ισχύει το αντίθετο.. γιατί στα non-blocking με το να ελέγχουμε συνεχώς αν υπάρχουν διαθέσιμα δεδομένα κρατάμε διαρκώς απασχολημένο τον επεξεργαστή ακόμη και αν δεν υπάρχει καμιά μεταφορά για μεγάλο χρονικό διάστημα.. Με τα blocking sockets όταν δεν υπάρχει καμιά μεταφορά έχουμε μεν πολλά νήματα για τη διαχείριση όλων των sockets αλλά δεν εξοικονομούνται πόροι έτσι αφού μένουμε σε μια στάσιμη κατάσταση αναμονής..? Εξαρτάται πως ορίζεις το complexity και το performance . Σιγουρα το να εκτελείς ενα runloop συνέχεια εχει μεγάλες απαιτήσεις απο την CPU. Εκεί έρχονται άλλοι μηχανισμοί όπως η select. Παρόλα αυτά (ειδικά απο άποψη διαχείρισης μνήμης και scalability), τα πολλά threads δεν ειναι ότι καλύτερο. Φυσικά τα πάντα έχουν να κάνουν με το είδος τις εφαρμογής. Αλλες απαιτήσεις έχει (πχ) ένα iptv set top box, με μερικά MB RAM και low end cpu, και άλλες απαιτήσεις ένα desktop messenger application.
ntaryl Δημοσ. 10 Σεπτεμβρίου 2010 Μέλος Δημοσ. 10 Σεπτεμβρίου 2010 ευχαριστω πολυ παιδια παω για μελετη ....
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.