Come si fa a ridurre al minimo il numero di thread utilizzati in un server tcp applicazione?

StackOverflow https://stackoverflow.com/questions/32198

Domanda

Sto cercando di eventuali strategie utilizzati dalle persone durante l'implementazione di applicazioni server che client del servizio TCP (o UDP) le richieste di:modelli di progettazione, tecniche di esecuzione, le migliori pratiche, etc.

Supponiamo che per scopi di questa domanda che le richieste sono relativamente lunga durata (alcuni minuti) e che il traffico è tempo sensibile, quindi senza ritardi sono accettabili nel rispondere ai messaggi.Inoltre, ci sono sia delle richieste dei clienti e per effettuare le nostre connessioni ad altri server.

La mia piattaforma è .NET, ma dal momento che la tecnologia di base è la stessa a prescindere dalla piattaforma, sono interessato a vedere le risposte per qualsiasi lingua.

È stato utile?

Soluzione

Il moderno approccio è quello di utilizzare il sistema operativo multiplex, molte prese di rete per voi, a liberare la vostra applicazione per l'elaborazione di sole connessioni attive con il traffico.

Ogni volta che si apre un socket è associato con un selettore.Si utilizza un singolo thread di sondaggio che di selezione.Ogni volta che arrivo dei dati, il selettore indica la presa che è attivo, è fuori mano che il funzionamento di un bambino thread e continuare a polling.

In questo modo hai solo bisogno di un thread per ogni operazione simultanea.Prese che sono aperti, ma minimo non si leghi un filo.

Altri suggerimenti

Più sofisticati approccio sarebbe quello di utilizzare Completamento di i / o porte.(Windows) IO con le porte di Completamento si lascia al sistema operativo di gestire polling, che consente di utilizzare potenzialmente molto elevato livello di ottimizzazione con i driver di scheda di rete di supporto.In sostanza, si dispone di una coda di operazioni di rete che è il sistema operativo gestito, e di fornire una funzione di callback che viene chiamato quando l'operazione viene completata.Un po ' come (disco Rigido) DMA, ma per la rete.

Len Holgate scritto un eccelent serie di completamento IO porti un paio di anni fa su Codeproject:http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

E Ho trovato un articolo su i / o porte di completamento per .net (non l'ho letto, però) http://www.codeproject.com/KB/cs/managediocp.aspx

Vorrei anche dire che è facile da usare porte di completamento rispetto per provare e scrivere un scalabili, in alternativa.Il problema è che sono disponibili solo su NT (2000, XP, Vista)

Se si utilizza C++ Win32 direttamente quindi suggerisco di leggere su overlapped I/O e I/O porte di Completamento.Ho una connessione C++, IOCP framework client/server con il codice sorgente completo, vedere qui per ulteriori dettagli.

Dal momento che si sta utilizzando .Net si dovrebbe essere guardando utilizzando il socket asincroni metodi in modo che non hai bisogno di avere un thread per ogni connessione;ci sono diversi link dal blog di miniera che possono essere utili punti di partenza: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (alcuni dei migliori collegamenti sono nei commenti al post originale!)

G ' day,

Mi piacerebbe iniziare a guardare la metafora che si desidera utilizzare per il vostro thread quadro.

Forse "leader seguace" in cui un thread è in ascolto per le richieste in arrivo e quando giunge una nuova richiesta, in l'opera e il prossimo thread in piscina inizia in ascolto per le richieste in arrivo.

O il pool di thread in cui lo stesso thread è sempre in ascolto per le richieste in arrivo, e poi passare le richieste per il prossimo thread disponibile nel pool di thread.

Come si potrebbe visitare il Reattore sezione dell'Ace, Componenti per ottenere alcune idee.

HTH.

ciao Rob

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top