ntaryl Δημοσ. 4 Μαρτίου 2010 Δημοσ. 4 Μαρτίου 2010 κσλησπερα Απευθυνομαι κυριως σε ατομα που εχουν ασχοληθει με Multithread and Socket Μπορει καποιος να μου εξηγησει την λογικη ? αποριες 1)το Main Thread ακουει σε μια πορτα ? 2)Καθε ποτε δημιουργειται νεο Thread ? 3) Το νεο Thread ποσο μενει ενεργο ? 4) Πως μεταφερονατι τα δεδομενα απο το ενα στο αλλο Thread ? Υ.γ Υπαρχει καποιιο βιβλιο για μελετη σχετικα με ταThreads καλο βραδυ
karabouzouk... Δημοσ. 5 Μαρτίου 2010 Δημοσ. 5 Μαρτίου 2010 Εγώ είχα ασχοληθεί με sockets κλπ πριν λίγο καιρό... Εδώ μπορείς να βρεις κάτι χρήσιμο... http://www.insomnia.gr/forum/showthread.php?t=345276&highlight=server+client Και εδώ είναι ένας πολύ καλός οδηγός και με εύκολη γλώσσα κατ εμέ.. τον έχω και στο topic που σου έδωσα.. Αν χρειαστείς κάτι άλλο πες να σε βοηθήσω αν ξέρω... Είχα φτιάξει ένα πρόγραμμα chat με client και server.. Η λογική εξαρτάται από το τι ακριβώς θέλεις να φτιάξεις... Γενικά αν έχεις ένα πρόγραμμα server που συνδέονται σε αυτό clients (δηλαδή διάφοροι χρήστες) για κάποιο λόγο (ευρεση πληροφοριών, μεταφορά δεδομένων, εκτέλεση υπολογισμών.....κλπ) τα threads θα είναι χρήσιμα για να εξηπηρετούνται από το πρόγραμμα του server περισσότεροι από έναν χρήστες (clients) ΤΑΥΤΟΧΡΟΝΑ.. Έτσι ένα νέο thread θα δημιουργείς κάθε φορά που θα συνδέεται στο server σου ένας νέος client για να τον εξυπηρετήσεις...
bookysmell2004 Δημοσ. 5 Μαρτίου 2010 Δημοσ. 5 Μαρτίου 2010 Οι ερωτήσεις σου δυστυχώς είναι πολύ δύσκολο να απαντηθούν μιας και η αρχιτεκτονική ενός multithreaded server εξαρτάται από πολλούς παράγοντες αλλά κυρίως από εσένα και το μοντέλο που θα επιλέξεις. Γενικά τα πολλαπλά threads σε έναν server χρησιμοποιούνται για την ταυτόχρονη εξυπηρέτηση είτε clients είτε "πακέτων" (των λογικών πακέτων της εφαρμογής σου). Άρα, δύο βασικές αρχιτεκτονικές μπορεί να είναι 1) thread δεσμευμένο σε έναν και μόνο client ή 2) προσωρινό thread για την εξυπηρέτηση ενός ληφθέντος πακέτου. Βέβαια, μπορεί να είναι και κάτι άσχετο από αυτά, τελείως διαφορετικό. Όπως είπα, εξαρτάται από εσένα. Στην πρώτη περίπτωση μια σχεδίαση μπορεί να έχει ως εξής: Ένα thread που να κάνει polling (με blocking ή non-blocking μέθοδο) σε ένα συγκεκριμένο socket που είναι σε κατάσταση listening. Όταν δεχθεί κάποιον client ανοίγει ένα νέο thread, το οποίο αναλαμβάνει την εξυπηρέτησή του (συνήθως με πολιτική blocking αφού δεν υπάρχουν άλλοι clients) και το δεσμεύει στο νέο socket. Το ίδιο thread αναλαμβάνει τόσο τη λήψη, όσο και την αποστολή από το συγκεκριμένο socket (Σημείωση: Υπάρχουν πρακτικά ζητήματα κατά την on demand αποστολή μιας και από το API που θα γίνεται expose εκ των πραγμάτων μπορεί να υπάρχει πρόσβαση από άλλα threads - λύνεται αυτό το πρόβλημα με invoking). Όταν ο client αποσυνδεθεί, το thread κλείνει το socket και αυτοκαταστρέφεται. Η αρχιτεκτονική αυτή δεν είναι πολύ χρήσιμη σε περιβάλλον με μεγάλο αριθμό clients (1000 clients = 1000 threads), γι' αυτό το λόγο συνήθως περιορίζουμε τον αριθμό απορρίπτοντας συνδέσεις νέων clients πάνω από ένα συγκεκριμένο όριο. Στη δεύτερη περίπτωση τα πράγματα είναι λίγο πιο περίπλοκα: Χρησιμοποιούμε το ασύγχρονο μοντέλο I/O. Σύμφωνα με αυτό ένα thread που καλεί μεθόδους εισόδου/εξόδου δε χρειάζεται να περιμένει (πχ. σε περίπτωση που δεν υπάρχουν δεδομένα) αλλά έχει την επιλογή να κάνει άλλες δουλειές και όταν το θυμηθεί να γυρίσει "πίσω" και να ξανακαλέσει τη μέθοδο. Ανάλογα με την πλατφόρμα προγραμματισμού, μπορεί να δίνεται και δυνατότητα ενημέρωσης όταν υπάρχουν διαθέσιμα δεδομένα προς διάβασμα ή όταν μπορούμε να γράψουμε. Μιλάμε τότε για event based asynchronus I/O. Σε αυτό το παράδειγμα, όπως καταλαβαίνεις, η όλη εξυπηρέτηση μπορεί να γίνει από ένα και μόνο thread. >Λίστα Clients Κάνε τα παρακάτω μέχρι να σου πει ο χρήστης να σταματήσεις: Δες άμα υπάρχει client που θέλει να συνδεθεί, αν ναι πρόσθεσέ τον στη λίστα clients. Για κάθε client στη λίστα: Δες αν υπάρχουν δεδομένα προς λήψη και αν ναι, στείλε την απάντηση/εξυπηρέτησε. Περίμενε 5 δευτερόλεπτα για να μην κάψουμε τη CPU Συνεπώς που κολλάει με multithreaded περιβάλλον; Το πρόβλημα με αυτή τη σχεδίαση είναι ότι αν η διαδικασία εξυπηρέτησης ενός ληφθέντος λογικού πακέτου είναι μεγάλη (μπορεί να κάνει πολλές πράξεις, να χειρίζεται μια μεγάλη βάση δεδομένων κ.ο.κ.), για τον server θα παίρνει πολύ χρόνο η εξυπηρέτηση ενός πελάτη με αποτέλεσμα οι υπόλοιποι να περιμένουν είτε να έρθει η σειρά τους είτε να ολοκληρώσει ο server με τον από πάνω. Παρατηρούνται δηλαδή κενά στην συνέχεια της εξυπηρέτησης, κάτι το οποίο είναι critical σε real time περιβάλλον. Η λύση που αποδίδουμε είναι να δημιουργούμε ένα νέο thread μετά από τη λήψη δεδομένων. Το thread αυτό θα τα επεξεργάζεται, θα κάνει ό,τι πράξεις είναι να γίνουν χωρίς να περιμένει το κυρίως thread και όταν ολοκληρώσει θα επιστρέψει την εκτέλεση και θα αυτοκαταστραφεί. Για να αποφύγουμε μεγάλες κορυφώσεις στον αριθμό των threads σε περίπτωση που πολλά πακέτα "πέσουν μαζεμένα" χρησιμοποιούμε thread pool. Στο παραπάνω σενάριο αν ο server είναι αδρανής θα έχουμε μόνο ένα thread να δουλεύει ενώ όσο πιο πολύς φόρτος έχει αποδοθεί στον server τόσο πιο πολλά threads δημιουργούμε. Επίσης, δεν χρειάζεται να απορρίπτουμε clients λόγω υπερφόρτωσης (μάλλον δεν χρειάζεται να απορρίπτουμε τόσο συχνά). Ρώτησες για την επικοινωνία μεταξύ των threads. Το θέμα αυτό είναι πολύ τεχνικό και εξαρτάται από τα εργαλεία που έχεις στη διάθεσή σου. Πιθανόν, αν μας εξηγούσες πιο συγκεκριμένα τι εννοείς επικοινωνία μεταξύ των threads, να μπορέσουμε να σε βοηθήσουμε περισσότερο. Όπως είπα και πιο πάνω, αυτά που μόλις έγραψα δεν είναι κανόνες αλλά παραδείγματα που αποσκοπούν κυρίως στην κατανόηση. Κάποιος θα μπορούσε να χρησιμοποιήσει εντελώς διαφορετικό μοντέλο για τη σχεδίαση ενός multithreaded server.
karabouzouk... Δημοσ. 5 Μαρτίου 2010 Δημοσ. 5 Μαρτίου 2010 (Πολύ πιο ολοκληρωμένη απάντηση από τη δική μου.. πολύ πιο επεξηγηματικός.. Well done..!)
ntaryl Δημοσ. 5 Μαρτίου 2010 Μέλος Δημοσ. 5 Μαρτίου 2010 Καλησπερα παιδια Ενα μεγαλο ευχαριστω για τις απαντησεις Λοιπον ασχολουμε με την Visual basic και εχω φτιαξει ενα client Server προγραμματακι (reverse connection) Αυτο που θελω ειναι οταν φτανουν συνδεσεις στον Server αυτος να εχει την δυνατοτητα να μπορει να τις εκτελει ταυτοχρονα .Δηλαδη ο ενας Πελατης να μεταφερει Δεδομενα και ο αλλος να κανει κατι αλλο ταυτοχρονα . Για αυτο τον λογο προσπαθω να καταλαβω την λογικη του ολου project ! O αριθμος συνδεσεων θα ειναι (20) Θελω αρκετο διαβασμα ακομα καλο απογευμα
bookysmell2004 Δημοσ. 5 Μαρτίου 2010 Δημοσ. 5 Μαρτίου 2010 Καλησπερα παιδια Ενα μεγαλο ευχαριστω για τις απαντησεις Λοιπον ασχολουμε με την Visual basic και εχω φτιαξει ενα client Server προγραμματακι (reverse connection) Αυτο που θελω ειναι οταν φτανουν συνδεσεις στον Server αυτος να εχει την δυνατοτητα να μπορει να τις εκτελει ταυτοχρονα .Δηλαδη ο ενας Πελατης να μεταφερει Δεδομενα και ο αλλος να κανει κατι αλλο ταυτοχρονα . Για αυτο τον λογο προσπαθω να καταλαβω την λογικη του ολου project ! O αριθμος συνδεσεων θα ειναι (20) Θελω αρκετο διαβασμα ακομα καλο απογευμα Στο .NET (αν μιλάς για VB .NET) υπάρχει γενικά πολύ καλή υποστήριξη για ασύγχρονο networking. Στο διαδίκτυο θα βρεις μεγάλο αριθμό παραδειγμάτων με μια αναζήτηση ".net asynchronous tcp server".
kagelos Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 Γραφω σε VB 6.0 Είναι σαν να θες να γράψεις έκθεση στα αρχαία Ελληνικά. Μερικοί γνωρίζουν, αλλά κανείς δεν τα χρησιμοποιεί πλέον.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.