2010-03-05 38 views
8

Utilizzo di un delegato Posso chiamare qualsiasi funzione in modo asincrono. Dalla documentazione capisco che questo è fatto accodando un workitem per il threadpool.differenza tra chiamate asincrone e chiamate asincrone io in .net

Si possono anche effettuare chiamate asincrone a funzioni di I/O (come leggere da prese, file, pagine Web, ecc.). Penso (ma non sono sicuro) che questo non generi un workitem nel threadpool. Solo dopo aver ottenuto il risultato (o un errore), viene richiamata la chiamata da un nuovo thread nel threadpool.

Questa supposizione è corretta? O è una chiamata IO asincrona, anche sotto le coperte solo qualche thread che viene generato? Se questo è il caso, in che modo le chiamate asincrone possono essere più performanti dei thread di generazione (usando un threadpool) da soli e bloccare?

anche: quante chiamate asincrone possono essere gestite in un dato momento? In caso di utilizzo di un threadpool, immagino quanto vuoi. Ma in caso di chiamate asincrone IO, c'è un limite? Ed è così, come fai a sapere qual è il limite?

risposta

7

L'I/O asincrono è una cosa molto più complicata dell'utilizzo di un altro thread dal pool di thread.

Ci sono molte tecniche differenti all'interno OS, che supportano asincrona IO:

1 segnalazione un oggetto kernel dispositivo

Non utile per eseguire richieste multiple simultanee I/O contro un singolo dispositivo. Consente a un thread di emettere una richiesta I/O e un altro thread per elaborarlo.

2 segnalazione di un oggetto kernel evento

consente a più richieste di I simultanea/O nei confronti di un singolo dispositivo. Consente a un thread di emettere una richiesta I/O e un altro thread per elaborarlo.

3 Utilizzo alertable I/O

consente più richieste simultanee I/O contro un unico dispositivo. Anche il thread che ha emesso una richiesta di I/O deve elaborarlo.

4 Uso/O porte di completamento I

Consente più richieste simultanee I/O contro un unico dispositivo. Consente a un thread di emettere una richiesta I/O e un altro thread per elaborarlo. Questa tecnica è altamente scalabile e ha la massima flessibilità.

+0

@sergey: quindi stai dicendo che c'è davvero una differenza. Quindi quante richieste di IO possono essere sospese in qualsiasi momento? Qual è lo sweetspot? Questo dipende dall'IO mirato o qualcos'altro? Come si può sapere? – Toad

+0

Risposta semplice: dipende. Se si utilizzano le porte di I/O (questa è la tecnica più complicata ma più potente), il sistema operativo creerebbe il minor numero possibile di thread (dipende dalla configurazione hardware) per gestire tutte le attività IO attive. L'utilizzo di IO alertable richiede un thread per! Every! operazioni IO in sospeso. Ecco perché le porte di copulazione IO sono molto più efficaci e scalabili: puoi gestire molte! richieste IO simultanee con risorse minime. Penso che dovresti leggere "Windows via C/C++" o "Programmazione applicazione lato server" di Jeffrey Richter per capire tutto questo. È roba abbastanza dura! –

+0

@reinier I limiti si basano su tutto, dal numero di CPU al codice di licenza di Windows. Ma i limiti non sono importanti - purché si utilizzino i metodi asincroni forniti dal BCL, si sa * si otterrà una migliore scalabilità rispetto a se si ad es. 'QueueUserWorkItem'. – bzlm

Problemi correlati