I/o asincrono disco viene visualizzato come sincrono su Windows NT, Windows 2000 e Windows XP

Traduzione articoli Traduzione articoli
Identificativo articolo: 156932 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

File i/o su Microsoft Windows NT, Windows 2000 e Windows XP può essere sincrona o asincrona. Il comportamento predefinito per i/o è sincrono: una funzione dei / o viene chiamata e restituisce una volta completata il / o. I/o asincrono, invece, consente a 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 straordinaria, mediante i servizi del sistema operativo.

Il vantaggio dei / o asincrono è che il chiamante disponga di tempo per eseguire l'altro lavoro o inviare le richieste di ulteriori mentre viene completata l'operazione dei / o. Il termine Overlapped dei / o viene spesso utilizzato per i/o asincrono e sovrapposto Non / O per i/o sincrono. In questo articolo vengono utilizzati i termini asincrono e Sincrona per le operazioni dei / o in Windows NT. In questo articolo si presuppone che il lettore ha determinata una certa familiarità con le funzioni dei / o File come CreateFile, ReadFile WriteFile.

Spesso, le operazioni dei / o asincrone si comportano come sincrona i/o. determinati condizioni di cui in questo articolo sono illustrati nelle sezioni successive siano il / o operazioni completate in modo sincrono. Il chiamante non ha alcun tempo per lo sfondo Poiché le funzioni dei / o non si restituiscono fino al completamento dei / o di lavoro.

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 di disco in particolare, molti dei principi possono essere applicati ad altri tipi dei / o, ad esempio i/o seriale o dei / o di rete.

Nota: poiché Windows 95 non supporta i/o asincrono in periferiche disco (anche se non in altri tipi di dispositivi i/o), il comportamento non viene trattato in questo articolo.

Informazioni

Impostare i/o asincrono

Quando viene aperto il file necessario specificare il flag FILE_FLAG_OVERLAPPED in CreateFile. 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 di diritto di effettuare un'operazione sincrona, se è necessario. Pertanto, è consigliabile aver scritto 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 molti aspetti un programma può mentre attende asincrona operazioni da completare, ad esempio operazioni aggiuntive di Accodamento messaggi o si esegue attività in background. Ad esempio, gestisce correttamente il codice riportato di seguito sovrapposto e non sovrapposte completamento di un'operazione di lettura. Non non attendere più 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'operazione è stato reso asincrona, GetOverlappedResult viene utilizzato per determinare il numero effettivo di byte trasferiti nell'operazione dopo l'assegnazione completata. Il & NumberOfBytesRead passato ReadFile non produce alcun effetto.

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 altri parole, se si dispongono 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 un 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, è necessario correttamente inizializzarlo in modo che nessun dato rimasto dopo influisce sull'operazione di nuova.

Si applica lo stesso tipo di restrizione per il buffer di dati utilizzato in un operazione. Un buffer di dati non deve essere letto o scritto fino al relativo operazione dei / o corrispondente è stata completata; lettura o scrittura nel buffer potrebbero verificarsi errori e dati danneggiati.

Asynchronous i/o appare ancora sincrono

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

Esistono diversi motivi per cui le operazioni dei / o completare in modo sincrono anche se è stato codificato per l'operazione asincrona:

Compressione

Ostruzione di un'operazione asincrona è la compressione NTFS. Il file. driver di sistema non accederà ai file compressi in modo asincrono; invece tutte le le operazioni vengono effettuate solo sincrone. Ciò non si applica ai file compresso 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 è delle operazioni stesse. In Windows NT, qualsiasi scrittura in un file che estende la sua lunghezza è sincrona.

Nota: le applicazioni possono rendere 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), 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 ha implicazioni di sicurezza cui può essere assegnato il file cluster che sono stati precedentemente occupato dagli altri file. Pertanto, SetFileValidData richiede che il chiamante dispone di SeManageVolumePrivilege nuovo attivato (impostazione predefinita, 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) dispongono di speciale codice case dove, 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 disco dispositivo, 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 della cache può funzionare con, tuttavia, se i dati non sono nel cache. La cache di Windows NT viene implementata internamente utilizzando i mapping dei file. Il gestore della memoria in Windows NT non fornisce una pagina asincrona meccanismo di errore per gestire i mapping di file utilizzati dal gestore della cache. Il gestore della cache può, tuttavia, verificare se la pagina richiesta è in memoria, in modo che se si esegue una lettura asincrona 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 viene 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.

Questo va bene per un piccolo numero di richieste, ma perché il pool di thread di lavoro è limitato (attualmente tre in un sistema di 16MB), vi vengono comunque solo alcune richieste accodate per il driver del disco in un determinato momento. Se si utilizza una grande quantità di operazioni dei / o per i dati che non sono presente nella cache, il gestore della cache e gestione della memoria in caso di saturazione e le richieste sono sincrone.

Il comportamento del gestore della cache può essere influenzato anche a seconda che Per accedere a un file in modo sequenziale o casuale. Vantaggi della cache sono visibili maggior parte quando l'accesso ai file in sequenza. Il flag FILE_FLAG_SEQUENTIAL_SCAN Nella CreateFile chiamata consente di ottimizzare la cache per questo tipo di accesso. Tuttavia, se si accede a file in modo casuale, utilizzare il Flag FILE_FLAG_RANDOM_ACCESS in CreateFile per istruire il gestore della cache ottimizzare il comportamento per l'accesso casuale.

Non utilizzare la Cache

Il flag FILE_FLAG_NO_BUFFERING ha più effetto sul comportamento del file system per l'operazione asincrona. Questo è il modo migliore per garantire che le richieste dei / o sono effettivamente asincrone. Indica il file system da non utilizzare una cache meccanismo 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. Vedere la funzione nella documentazione per la funzione CreateFile per ulteriori informazioni sull'utilizzo di questo flag correttamente.

Risultati dei Test reali

Di seguito sono alcuni risultati del test dal codice di esempio. La grandezza della i numeri non è importanti e varia da computer a computer, ma la relazione tra i numeri rispetto a altro illumina il effetto generale 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 a ReadFile per completare le operazioni, mentre il test 1 impiegato per eseguire le stesse richieste solo per 0.224264 secondi. Nella prova 2, si è verificato alcun tempo "extra" per il programma da eseguire in background lavoro.
  • 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 letture sono stati rilasciati e completata in 0.251670 secondi. In altre parole, le richieste asincrone sono state completate in modo sincrono. Questo test anche viene illustrato ad alte prestazioni al gestore della cache quando i dati sono in la 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 test 3. Nota che le letture sincrone dalla cache completare più velocemente delle letture asincrone dalla cache. Questo test dimostra anche ad alte prestazioni al gestore della cache quando i dati nella cache.

CONCLUSIONE

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

L'accesso al file predefinito senza specificare alcun flag speciali a CreateFile è un'operazione sincrona e memorizzati nella cache.

Nota: poiché il driver del file system non predittiva read-ahead e asincrona lazy scrittura asincrona dei dati modificati, è possibile ottenere un comportamento asincrono automatico in questa modalità. Sebbene questo non prende la s di applicazione [ASCII 146] i/o asincrono, è la situazione ottimale per la maggior parte delle applicazioni semplici.

Se, invece, l'applicazione non è semplice, potrebbe essere necessario eseguire alcune analisi e monitoraggio delle prestazioni per determinare il metodo migliore, simile al test illustrato in precedenza in questo articolo. Profilatura il tempo trascorso per il Funzione ReadFile o WriteFile e confrontando questo tempo come tempo impiegato per le operazioni dei / o effettive per il completamento sono estremamente utile. Se la maggior parte il tempo trascorso in emissione effettivamente il / o, quindi il / o è in corso completata in modo sincrono. Tuttavia, se il tempo impiegato per l'emissione delle richieste dei / o è relativamente piccolo rispetto all'orario è richiesto per le operazioni dei / o completo, quindi le operazioni sono da trattare in modo asincrono. L'esempio codice indicato in precedenza in questo articolo utilizza la funzione QueryPerformanceCounter per eseguire il proprio il profilo interno.

Monitoraggio delle prestazioni consentono di determinare l'efficacia con cui il programma è utilizzando il disco e la cache. Tenere traccia di tutti i contatori delle prestazioni l'oggetto Cache indicherà le prestazioni del gestore della cache. I contatori delle prestazioni di registrazione per il disco fisico o logico oggetti indica le prestazioni dei sistemi su disco.

Sono disponibili diverse utilità di monitoraggio delle prestazioni; PerfMon e DiskPerf sono particolarmente utili. Per il sistema raccogliere dati sulle prestazioni dei sistemi su disco, è innanzitutto necessario emettere il comando di diskperf -y. Dopo aver emesso il comando, è necessario riavviare il sistema per avviare la raccolta dei dati.

Riferimenti

Per ulteriori informazioni su queste utilità e il monitoraggio delle prestazioni, vedere il volume "Optimizing Windows NT" nella risorsa di Windows NT Documentazione del Kit.
SQL Server richiede sistemi per supportare la "consegna garantita su un supporto stabile' come indicato in base al programma di Microsoft SQL Server Always-On archiviazione soluzione revisione. FoPer ulteriori informazioni sui requisiti di input e outpui per il motore di database di SQL Server, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
967576Requisiti di Input/Output di Microsoft SQL Server Database Engine

Proprietà

Identificativo articolo: 156932 - Ultima modifica: giovedì 30 maggio 2013 - Revisione: 7.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Win32 Application Programming Interface
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Standard
Chiavi: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com