File Buffering
In questo argomento vengono illustrate le varie considerazioni relative al controllo del buffering dei file nell'applicazione, noto anche come input/output di file non bufferizzati (I/O). Il buffer dei file viene in genere gestito dal sistema in background e viene considerato parte del memorizzazione nella cache dei file all'interno del sistema operativo Windows, se non diversamente specificato. Anche se i termini memorizzazione nella cache e buffering vengono talvolta usati in modo intercambiabile, in questo argomento viene usato il termine buffering specificamente nel contesto di spiegare come interagire con i dati che non vengono memorizzati nella cache (memorizzati nel buffer) dal sistema, in cui altrimenti è in gran parte fuori dal controllo diretto delle applicazioni in modalità utente.
Quando si apre o si crea un file con la funzioneCreateFile, è possibile specificare il flag FILE_FLAG_NO_BUFFERING per disabilitare la memorizzazione nella cache di sistema dei dati letti o scritti nel file. Sebbene ciò offra un controllo completo e diretto sul buffering di I/O dei dati, nel caso di file e dispositivi simili, è necessario considerare i requisiti di allineamento dei dati.
Nota
Queste informazioni di allineamento si applicano alle operazioni di I/O sui dispositivi, come i file che supportano la funzione di ricerca e il concetto di puntatori alla posizione nel file (o offset). Per i dispositivi che non cercano, ad esempio named pipe o dispositivi di comunicazione, la disattivazione del buffer potrebbe non richiedere un particolare allineamento. Eventuali limitazioni o efficienze che possono essere ottenute in base all'allineamento in tal caso dipendono dalla tecnologia sottostante.
In un esempio semplice, l'applicazione aprirà un file per l'accesso in scrittura con il flag FILE_FLAG_NO_BUFFERING e quindi eseguirà una chiamata alla funzione WriteFile usando un buffer di dati definito all'interno dell'applicazione. Questo buffer locale è, in queste circostanze, l'unico buffer di file esistente per questa operazione. A causa del layout fisico del disco, del layout di archiviazione del file system e del rilevamento della posizione del puntatore di file a livello di sistema, questa operazione di scrittura avrà esito negativo a meno che i buffer di dati definiti localmente non soddisfino determinati criteri di allineamento, descritti nella sezione seguente.
Nota
La discussione sulla cache non prende in considerazione la cache hardware sul disco fisico stesso, che non è solitamente sotto il controllo diretto del sistema. Questo non ha alcun effetto sui requisiti specificati in questo argomento.
Per altre informazioni su come FILE_FLAG_NO_BUFFERING interagisce con altri flag correlati alla cache, vedere CreateFile.
Requisiti di allineamento e accesso ai file
Come illustrato in precedenza, un'applicazione deve soddisfare determinati requisiti quando si lavora con i file aperti con FILE_FLAG_NO_BUFFERING. Si applicano le specifiche seguenti:
- Le dimensioni di accesso ai file, incluso l'offset del file facoltativo nella struttura OVERLAPPED, se specificato, devono essere un numero di byte pari a un multiplo intero della dimensione del settore del volume. Ad esempio, se la dimensione del settore è di 512 byte, un'applicazione può richiedere letture e scritture di 512, 1.024, 1.536 o 2.048 byte, ma non di 335, 981 o 7.171 byte.
- Gli indirizzi del buffer di accesso ai file per le operazioni di lettura e scrittura devono essere allineati al settore fisico, ovvero allineati agli indirizzi in memoria che sono multipli interi delle dimensioni fisiche del settore fisico del volume. A seconda del disco, questo requisito potrebbe non essere applicato.
Gli sviluppatori di applicazioni devono prendere nota dei nuovi tipi di dispositivi di archiviazione introdotti sul mercato con dimensioni del settore dei supporti fisici di 4.096 byte. Il nome del settore per questi dispositivi è "Formato avanzato". Poiché potrebbero verificarsi problemi di compatibilità con l'introduzione diretta di 4.096 byte come unità di indirizzamento per i supporti, una soluzione di compatibilità temporanea consiste nell'introdurre dispositivi che emulano un normale dispositivo di archiviazione del settore a 512 byte, ma rendono disponibili informazioni sulle dimensioni reali del settore tramite comandi ATA e SCSI standard.
In seguito a questa emulazione, esistono essenzialmente due dimensioni del settore che gli sviluppatori dovranno comprendere:
- Settore logico: l'unità utilizzata per l'indirizzamento a blocchi logici dei supporti. È anche possibile considerarlo come l'unità di scrittura più piccola che l'archiviazione può accettare. Si tratta dell'emulazione.
- Settore fisico: unità per cui le operazioni di lettura e scrittura nel dispositivo vengono completate in un'unica operazione. Questa è l'unità di scrittura atomica alla quale le operazioni di I/O non bufferizzate dovranno essere allineate per ottenere caratteristiche ottimali di prestazioni e affidabilità.
La maggior parte delle API di Windows correnti, ad esempio IOCTL_DISK_GET_DRIVE_GEOMETRY e GetDiskFreeSpace, restituirà le dimensioni del settore logico, ma le dimensioni del settore fisico possono essere recuperate tramite il codice di controllo IOCTL_STORAGE_QUERY_PROPERTY, con le informazioni pertinenti contenute nel membro BytesPerPhysicalSector nella struttura STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Per un esempio, vedere il codice di esempio in STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR. Microsoft consiglia vivamente agli sviluppatori di allineare le I/O senza buffer alle dimensioni del settore fisico come indicato dal codice di controllo IOCTL_STORAGE_QUERY_PROPERTY per garantire che le applicazioni siano preparate per la transizione delle dimensioni del settore.
Windows Server 2003 e Windows XP: La struttura STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR non è disponibile. È stato introdotto con Windows Vista e Windows Server 2008.
Poiché gli indirizzi del buffer per le operazioni di lettura e scrittura devono essere allineati al settore, l'applicazione deve avere il controllo diretto della modalità di allocazione di questi buffer. Un modo per allineare i buffer da settore consiste nell'usare la funzionevirtualallocper allocare i buffer. Considerare quanto segue:
- VirtualAlloc alloca memoria allineata agli indirizzi che sono multipli interi delle dimensioni della pagina del sistema. Le dimensioni della pagina sono di 4.096 byte nei sistemi basati su Itanium e x86 o 8.192 byte. Per altre informazioni, vedere la funzioneGetSystemInfo.
- Le dimensioni dei settori sono in genere da 512 a 4.096 byte per i dispositivi di archiviazione ad accesso diretto (unità disco rigide) e 2.048 byte per i CD-ROM.
- Le dimensioni sia della pagina che del settore sono potenze di 2.
Pertanto, nella maggior parte dei casi, la memoria allineata alla pagina sarà anche allineata al settore, poiché il caso in cui la dimensione del settore è più grande di quella della pagina è raro.
Un altro modo per ottenere buffer di memoria allineati manualmente consiste nell'usare la funzione _aligned_malloc dalla libreria di Run-Time C. Per un esempio di come controllare manualmente l'allineamento del buffer, vedere l'esempio di codice del linguaggio C++ nella sezione Codice di esempio di WriteFile.