Al momento sei offline in attesa che la connessione Internet venga ristabilita

Disco asincrono i/o viene visualizzato sincrona in Windows

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 156932
Sommario
File i/o su Microsoft Windows può essere sincrona o asincrona. Il comportamento predefinito per i/o è sincrono, in cui una funzione dei / o viene chiamata e restituisce una volta completata il / o. I/o asincrono consente una funzione dei / o restituire immediatamente l'esecuzione al chiamante, ma non si presuppone che il / o che sia completo a una fase successiva. Una volta completata il / o, il sistema operativo notifica al chiamante. In alternativa, il chiamante può determinare lo stato dell'operazione dei / o sospeso mediante i servizi del sistema operativo.

Il vantaggio dei / o asincrono è che il chiamante disponga di tempo per eseguire altre operazioni o emettere ulteriori richieste fino al completamento dell'operazione dei / o. Il termine sovrapposti I / Ois frequentemente utilizzato per i/o asincrono e i/o sovrapposto Non per i/o sincrono. Per le operazioni dei / o, in questo articolo vengono utilizzati i termini asincrona e sincrona. In questo articolo si presuppone che il lettore abbia familiarità con le funzioni dei / o File come WriteFile CreateFile, ReadFile.

Spesso si comportano operazioni dei / o asincrone i/o appena sincrone. determinate condizioni vengono discussi nel rendere sezioni successive che le operazioni dei / o completate in modo sincrono. Il chiamante non ha alcun tempo di attività in background poiché le funzioni dei / o non si restituiscono fino al completamento dei / o.

Diverse funzioni correlate ai / o sincrone e asincrone. In questo articolo vengono utilizzati ReadFile e WriteFile come esempi; valide alternative sono ReadFileEx e WriteFileEx. Anche se in questo articolo viene descritto solo i/o disco in particolare, molti dei principi può essere applicati ad altri tipi dei / o, ad esempio i/o seriale o dei / o di rete.
Informazioni

Impostare i/o asincrono

È necessario specificare il flag FILE_FLAG_OVERLAPPED in CreateFile quando viene aperto il file. Questo flag consente operazioni dei / o sul file da eseguire in modo asincrono. Ecco un esempio:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Prestare attenzione durante la codifica per i/o asincrono, perché il sistema di riserva theright per effettuare un'operazione sincrona se è necessario. Pertanto, è consigliabile scrivere il programma per gestire correttamente un'operazione dei / o può essere completata in modo sincrono o asincrono. Il codice di esempio viene illustrato questo aspetto.

Esistono molte cose che un programma può mentre in attesa di asynchronousoperations da completare, ad esempio operazioni aggiuntive di accodamento o di lavoro doingbackground. Ad esempio, il codice seguente correttamente handlesoverlapped e non sovrapposti di completamento di un'operazione di lettura. Si doesnothing più di attesa per il / o di attesa per il completamento:
   if (!ReadFile(hFile,                 pDataBuf,                 dwSizeOfBuffer,                 &NumberOfBytesRead,                 &osReadOperation )   {      if (GetLastError() != ERROR_IO_PENDING)      {         // Some other error occurred while reading the file.         ErrorReadingFile();         ExitProcess(0);      }      else         // Operation has been queued and         // will complete in the future.         fOverlapped = TRUE;   }   else      // Operation has completed immediately.      fOverlapped = FALSE;   if (fOverlapped)   {      // Wait for the operation to complete before continuing.      // You could do some background work if you wanted to.      if (GetOverlappedResult( hFile,                               &osReadOperation,                               &NumberOfBytesTransferred,                               TRUE))         ReadHasCompleted(NumberOfBytesTransferred);      else         // Operation has completed, but it failed.         ErrorReadingFile();   }   else      ReadHasCompleted(NumberOfBytesRead);				
Si noti che & NumberOfBytesRead passato ReadFile è diverso da & NumberOfBytesTransferred passato GetOverlappedResult. Se un operationhas stato reso asincrona, viene utilizzato GetOverlappedResult determinethe il numero effettivo di byte trasferiti nell'operazione dopo di esso hascompleted. Il & NumberOfBytesRead passato ReadFile è privo di significato.

Se, invece, viene completata un'operazione immediatamente, quindi & NumberOfBytesRead passato ReadFile è valido per il numero di byte letti. In questo caso, ignorare la struttura OVERLAPPED passata ReadFile; non utilizzare con GetOverlappedResult o WaitForSingleObject.

Un'altra precisazione con l'operazione asincrona è che non è possibile utilizzare una struttura OVERLAPPED fino a quando non è stata completata l'operazione in sospeso. In otherwords, se si dispone di tre operazioni i/o in attesa, è necessario utilizzare tre strutture OVERLAPPED. Se si riutilizza una struttura OVERLAPPED, riceverai risultati imprevisti nelle operazioni dei / o e si verifichi il danneggiamento dei dati. Inoltre, prima di poter utilizzare una struttura OVERLAPPED per la prima volta o prima di riutilizzare una volta completata un'operazione precedente, deve correttamente inizializzarla in modo che nessun dato rimasto dopo influisce sull'operazione di nuova.

Lo stesso tipo di restrizione si applica per il buffer di dati utilizzato in anoperation. Un buffer di dati non è necessario leggere o scritto prima del completamento operazione dei / o itscorresponding; lettura o la scrittura di buffermay causano errori e dati danneggiati.

Asincrono i/o appare ancora sincrono

Se sono state seguite le istruzioni riportate in questo articolo, tuttavia, nel caso in cui tutte le operazioni dei / o comunque in genere completate in modo sincrono in ordine emesso e nessuna delle operazioni ReadFile restituisce FALSE con GetLastError () ha restituito l'errore ERROR_IO_PENDING, ciò significa che non c'è tempo per qualsiasi attività in background. Perché viene eseguita?

Esistono diversi motivi per cui, completare le operazioni dei / o synchronouslyeven se è stato codificato per l'operazione asincrona:

Compressione

Ostruzione di un'operazione asincrona è la compressione NTFS. Il driver del file System non avranno accesso a file compressi in modo asincrono; alloperations invece sono appena apportate sincrona. Ciò non si applica ai file che arecompressed con utilità simili a compressione o PKZIP.

Crittografia di NTFS

Simile alla compressione, crittografia dei file, il driver di sistema convertire i/o asincrono in sincrono. Se i file vengono decrittografati, le richieste dei / o è asincrone.

Estensione di un File

Un altro motivo che le operazioni dei / o siano state completate in modo sincrono è le operazioni autonomamente. In Windows NT, qualsiasi scrittura in un file che estende la sua lunghezza è sincrona.

Nota: le applicazioni di effettuare l'operazione di scrittura menzionato in precedenza asincrona modificando la lunghezza dei dati valido del file utilizzando la funzione SetFileValidData, ed emettere quindi una WriteFile.

Utilizza SetFileValidData (che è disponibile in Windows XP e versioni successive), le applicazioni possono estendere in modo efficiente i file senza incorrere in una riduzione delle prestazioni per il riempimento zero li.

Poiché il file system NTFS non zero-riempimento dati fino alla lunghezza di dati validi (VDL) definito da SetFileValidData, questa funzione implicazioni di sicurezza cui può essere assegnato il file cluster che sono stati precedentemente occupato da altri file. Di conseguenza, SetFileValidData richiede che il chiamante dispone il nuovo SeManageVolumePrivilege attivato (impostazione predefinita, questo viene assegnato solo agli amministratori). Microsoft consiglia che gli ISV valutare attentamente le implicazioni dell'utilizzo di questa funzione.

Cache

La maggior parte dei driver dei / o (disco, comunicazioni e altri) sono codice caso speciale in cui, se una richiesta dei / o può essere completata "immediatamente", l'operazione verrà completata e la funzione ReadFile o WriteFile restituirà TRUE. In tutti i modi, questi tipi di operazioni sembrano essere sincroni. Per un diskdevice, in genere, una richiesta dei / o può essere completata "immediatamente" quando i dati sono memorizzati nella cache.

Dati non sono presente nella Cache

La combinazione di cache grado di funzionare con, tuttavia, se i dati non sono in thecache. La cache di Windows NT viene implementata internamente utilizzando i mapping dei file. Il gestore della memoria in Windows NT non fornisce un meccanismo asincrono pagefault per gestire i mapping di file utilizzati dal gestore della cache. Thecache manager può, tuttavia, verificare se la pagina richiesta è in memoria, in modo che se si esegue una lettura asincrona memorizzato nella cache, e le pagine non sono in memoria, si presuppone che il driver del file system che non si desidera che il thread bloccato e la richiesta verrà gestita da un pool di thread di lavoro limitato. Il controllo viene restituito al programma dopo la chiamata a ReadFile con lettura ancora in sospeso.

Questa procedura funziona correttamente per un numero ridotto di richieste, ma poiché il pool di thread di lavoro è limitato (attualmente tre in un sistema di 16MB), vi verranno comunque essere solo alcune richieste in coda per il driver del disco in un determinato momento. Se si emette una grande quantità di operazioni dei / o per i dati che non si trova nella cache, il gestore della cache e il gestore della memoria in caso di saturazione e le richieste sono sincrone.

Il comportamento del gestore della cache può anche essere influenzato basato su access whetheryou un file in modo sequenziale o casuale. Vantaggi della cache sono seenmost quando l'accesso ai file in sequenza. Il flagin FILE_FLAG_SEQUENTIAL_SCAN la chiamata di CreateFile consente di ottimizzare la cache per questo tipo di accesso. Tuttavia, se si accede a file in modo casuale, è possibile utilizzare flag theFILE_FLAG_RANDOM_ACCESS in CreateFile per indicare il tooptimize di gestione cache relativo comportamento per l'accesso casuale.

Non utilizzare la Cache

Il flag FILE_FLAG_NO_BUFFERING influisce più sul comportamento del sistema di file per l'operazione asincrona. Questo è il modo migliore per guaranteethat che le richieste dei / o sono effettivamente asincrona. Esso indica il file systemto non utilizzare qualsiasi meccanismo di cache affatto.

Avviso: esistono alcune limitazioni all'utilizzo di questo flag che hanno a che fare con l'allineamento del buffer di dati e dimensioni di settore della periferica. Riferimento alla funzione nella documentazione per la funzione CreateFile per ulteriori informazioni sull'utilizzo di questo flag correttamente.

Risultati del Test del mondo reale

Di seguito sono alcuni risultati del test dal codice di esempio. La grandezza di thenumbers non è importante qui e varia da computer a computer, ma la relazione tra i numeri confrontate tra loro illumina thegeneral effetto dei flag sulle prestazioni.

È possibile che venga visualizzato risultati simili al seguente:
  • Test 1
    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n   Operations completed out of the order in which they were requested.   500 requests queued in 0.224264 seconds.   500 requests completed in 4.982481 seconds.						
    Questo test dimostra che il programma indicato in precedenza rilasciati rapidamente 500 richieste dei / o e un'elevata quantità di tempo per eseguire altre operazioni o emettere ulteriori richieste.
  • Test 2
    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n   Operations completed in the order issued.   500 requests queued and completed in 4.495806 seconds.						
    Questo test dimostra che questo programma ha impiegato 4.495880 secondi chiamata ReadFile per completare le operazioni, mentre il test 1 impiegato solo 0.224264 secondi per emettere le richieste della stesse. Nel test 2, si è verificato alcun tempo "extra" per il programma eseguire qualsiasi attività in background.
  • Test 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Questo test dimostra la natura sincrona della cache. Tutte le operazioni di lettura sono stati emessi e completate in 0.251670 secondi. In altre parole, le richieste asincrone sono state completate in modo sincrono. Questo test dimostra anche ad alte prestazioni il gestore della cache quando i dati nella cache.
  • Test 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Questo test viene illustrato il risultato identico a quello test 3. Nota che sincrone letture dalla cache completino più velocemente operazioni di lettura asincrone dalla cache. Questo test dimostra anche ad alte prestazioni il gestore della cache quando i dati nella cache.

CONCLUSIONE

È possibile decidere quale metodo è consigliabile in quanto tutto dipende il tipo, la dimensione e il numero di operazioni che esegue il programma.

L'accesso al file predefinito senza specificare alcun flag speciali per CreateFileis un'operazione sincrona e memorizzati nella cache.

Nota: È possibile ottenere un comportamento asincrono automatico in questa modalità perché il driver del file system vengono predittiva read-ahead e asincrona lazy scrittura asincrona dei dati modificati. Anche se questo non dei / o dell'applicazione asincrono, è la situazione ottimale per la maggior parte delle applicazioni semplici.

Se, invece, l'applicazione non è semplice, è necessario dosome di analisi e monitoraggio delle prestazioni per determinare il metodo migliore, in modo simile ai test illustrato in precedenza in questo articolo. Profilatura il tempo trascorso in theReadFile o funzione WriteFile e confrontando questo tempo come tempo takesfor operazioni dei / o effettive per il completamento è estremamente utile. Se majorityof che il tempo trascorso in emissione effettivamente il / o, quindi il / o è beingcompleted in modo sincrono. Tuttavia, se il tempo trascorso emittente i/o richieste isrelatively piccola rispetto al tempo necessario per la tocomplete di operazioni dei / o, quindi le operazioni sono da trattare in modo asincrono. Samplecode indicato in precedenza in questo articolo viene utilizzata la funzione di QueryPerformanceCounter per eseguire l'analisi owninternal.

Monitoraggio delle prestazioni consentono di determinare l'efficacia con cui isusing il programma sul disco e la cache. Rilevamento di uno qualsiasi dei contatori delle prestazioni per l'oggetto Cache indicherà le prestazioni del gestore della cache. Verifica dei contatori delle prestazioni per il disco fisico o logico Diskobjects indicherà le prestazioni dei sistemi su disco.

Sono disponibili diverse utilità sono utili per il monitoraggio delle prestazioni; PerfMon e DiskPerf sono particolarmente utili. Per il sistema raccogliere dati sulle prestazioni dei sistemi su disco, è prima necessario emettere il comando di diskperf -y. Dopo aver emesso il comando, è necessario riavviare il sistema per avviare la raccolta dei dati.
Riferimenti
Consultare la documentazione MSDN su / O sincrono e asincrono Per ulteriori informazioni.

Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult asincrona sincrona sovrapposte Non sovrapposta

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 156932 - Ultima revisione: 06/25/2015 21:33:00 - Revisione: 8.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtit
Feedback
=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">