INFO: FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING

Riepilogo

Il flag FILE_FLAG_WRITE_THROUGH per CreateFile () fa sì che tutte le scritture apportate a tale handle per scrivere direttamente il file senza memorizzati nel buffer. I dati memorizzati (memorizzati nella cache del disco); Tuttavia, è ancora scritti direttamente al file. Questo metodo consente a un'operazione di lettura su tali dati per soddisfare la richiesta di lettura dei dati memorizzati nella cache (se è ancora disponibile), anziché eseguire un file di lettura per ottenere i dati. La chiamata di scrittura non viene restituito finché i dati vengono scritti nel file. Questo vale per remote scritture - anche le passate redirector di rete di FILE_FLAG_WRITE_THROUGH flag al server in modo che il server è in grado di non per soddisfare la richiesta di scrittura fino a quando i dati vengono scritti nel file.


Il FILE_FLAG_NO_BUFFERING ha ulteriormente questo passaggio di un concetto ed Elimina tutti i file read-ahead buffering e memorizzazione nella cache del disco, in modo che tutte le letture non sono necessariamente provengono dal file e non da qualsiasi buffer di sistema o di una cache del disco. Quando si utilizza FILE_FLAG_NO_BUFFERING, letture su disco e scritture devono essere eseguite su limiti di settore e gli indirizzi di buffer devono essere allineati sui limiti dei settori del disco nella memoria.


Queste restrizioni sono necessari perché il buffer di passare a leggere o scrivere API viene utilizzato direttamente per i/o livello di dispositivo. tale livello le dimensioni di settore indirizzi buffer devono soddisfare eventuali restrizioni di allineamento del processore e supporto dell'hardware su che è in esecuzione.

Ulteriori informazioni

Di Windows 95 (CD-ROM File System) non supporta il flag FILE_FLAG_NO_BUFFERING per CreateFile (). Mentre un FSD di Windows 95, ad esempio VFAT, potrebbe essere implementato, FILE_FLAG_NO_BUFFERING non è un contrassegno obbligatorio per i driver del file system e non è supportato da CDFS.


Questo frammento di codice riportato di seguito viene illustrato come allineare i dati in un buffer di settore e passarlo a CreateFile ():

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


Il puntatore p è allineato al settore e punta all'interno del buffer.


Se si dispone di una situazione in cui si desidera cancellare tutti i file aperti nell'unità logica corrente, a tale scopo:

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

Questo metodo, tutti i dati memorizzati nel buffer di scrittura per tutti i file aperti sulla partizione c: per essere scaricati e scritti su disco. Che eventuali eseguita dal sistema di buffer non è influenzato dallo svuotamento; qualsiasi file possibili il buffer che il runtime del linguaggio C che sta svolgendo sui file aperti con le routine di runtime C non viene modificata.


Quando si apre un file remoto in rete, il server sempre memorizza nella cache e non ignora il Nessun flag buffer specificato dal client. È per progettazione. Il redirector e il server non può implementare correttamente la semantica completa di FILE_FLAG_NO_BUFFERING in rete. In particolare, non è possibile soddisfare il requisito dei / o dimensioni di settore, allineate ai settori. Di conseguenza, quando un'applicazione basata su Win32-richiede FILE_FLAG_NO_BUFFERING, il redirector e il server considerarlo come una richiesta per FILE_FLAG_WRITE_THROUGH. Il file non viene memorizzato nella cache del client, scritture andare direttamente al server e al disco sul server e le dimensioni di lettura/scrittura nella rete sono esattamente ciò che richiede l'applicazione. Tuttavia, il file viene memorizzato nella cache sul server.


Non memorizzare nella cache del client può avere un effetto diverso, a seconda del tipo dei / o. Si eliminano i riscontri nella cache o ReadAhead, ma è anche possibile ridurre la dimensione del trasmette e riceve. In generale, per i/o sequenziale, è buona norma cache sul client. Per l'accesso casuale dei / o, è spesso consigliabile non nella cache.
Proprietà

ID articolo: 99794 - Ultima revisione: 12 gen 2017 - Revisione: 1

Feedback