Buffer dei file
In questo argomento vengono illustrate le varie considerazioni relative al controllo dell'applicazione del buffer dei file, noto anche come input/output di file non memorizzati .I/O. Il buffer dei file viene in genere gestito dal sistema dietro le quinte ed è considerato parte della memorizzazione nella cache dei file all'interno del sistema operativo Windows, a meno che non sia specificato diversamente. Anche se i termini memorizzazione nella cache e nel buffer vengono talvolta usati in modo interscambiabile, questo argomento usa il termine buffering in particolare nel contesto di spiegare come interagire con i dati che non vengono memorizzati nella cache (memorizzati nel buffer) dal sistema, dove in caso contrario è in gran parte fuori dal controllo diretto delle applicazioni in modalità utente.
Quando si apre o si crea un file con la funzione CreateFile , è possibile specificare il flag FILE_FLAG_NO_BUFFERING per disabilitare la memorizzazione nella cache di sistema dei dati letti o scritti nel file. Anche se ciò offre un controllo completo e diretto sul buffer di I/O dei dati, nel caso di file e dispositivi simili sono presenti requisiti di allineamento dei dati che devono essere considerati.
Nota
Queste informazioni di allineamento si applicano ai dispositivi di I/O, ad esempio i file che supportano la ricerca e il concetto di puntatori di posizione file (o offset). Per i dispositivi che non cercano, ad esempio pipe denominate o dispositivi di comunicazione, la disattivazione del buffer potrebbe non richiedere alcun particolare allineamento. Qualsiasi limitazione o efficienza che può essere ottenuta dall'allineamento in tal caso dipende dalla tecnologia sottostante.
In un esempio semplice, l'applicazione apre un file per l'accesso in scrittura con il flag FILE_FLAG_NO_BUFFERING e quindi esegue una chiamata alla funzione WriteFile usando un buffer di dati definito all'interno dell'applicazione. Questo buffer locale è, in queste circostanze, effettivamente l'unico buffer di file esistente per questa operazione. A causa del layout del disco fisico, del layout dell'archiviazione del file system e del rilevamento della posizione del puntatore dei file a livello di sistema, questa operazione di scrittura avrà esito negativo a meno che i buffer di dati definiti in locale soddisfino determinati criteri di allineamento, descritti nella sezione seguente.
Nota
La discussione sulla memorizzazione nella cache non considera alcuna memorizzazione nella cache hardware nel disco fisico stesso, che non è garantita all'interno del controllo diretto del sistema in qualsiasi caso. 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.
Come illustrato in precedenza, un'applicazione deve soddisfare determinati requisiti quando si utilizzano file aperti con FILE_FLAG_NO_BUFFERING. Le specifiche seguenti si applicano:
- Le dimensioni di accesso ai file, incluso l'offset facoltativo del file nella struttura OVERLAPPED , se specificato, devono essere per un numero di byte che corrisponde a un numero intero di dimensioni del settore del volume. Ad esempio, se la dimensione del settore è pari a 512 byte, un'applicazione può richiedere letture e scritture pari a 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, che significa allineati agli indirizzi in memoria che sono interi di dimensioni 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 nel mercato con dimensioni del settore multimediale fisico 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 da 512 byte, ma rendono disponibili informazioni sulle dimensioni del settore reali tramite comandi ATA e SCSI standard.
A seguito di questa emulazione, esistono in sostanza due dimensioni del settore che gli sviluppatori dovranno comprendere:
- Settore logico: unità usata per l'indirizzamento logico dei blocchi per il supporto. È anche possibile considerarlo come l'unità di scrittura più piccola che l'archiviazione può accettare. Si tratta dell'"emulazione".
- Settore fisico: unità per cui vengono completate le operazioni di lettura e scrittura nel dispositivo in un'unica operazione. Questa è l'unità di scrittura atomica e ciò che i/O non memorizzati dovranno essere allineati a per avere caratteristiche ottimali di prestazioni e affidabilità.
La maggior parte delle API windows correnti, ad esempio IOCTL_DISK_GET_DRIVE_GEOMETRY e GetDiskFreeSpace, restituirà le dimensioni logiche del settore, 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 BytesPerPhysicalSectornella 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 l'I/O non memorizzata alle dimensioni del settore fisico come segnalato dal codice di controllo IOCTL_STORAGE_QUERY_PROPERTY per garantire che le applicazioni siano preparate per questa 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 sulla modalità di allocazione di questi buffer. Un modo per allineare i buffer di settore consiste nell'usare la funzione VirtualAlloc per allocare i buffer. Considerare quanto segue:
- VirtualAlloc alloca la memoria allineata agli indirizzi che sono numeri interi delle dimensioni della pagina del sistema. Le dimensioni delle pagine sono 4.096 byte in x64 e x86 o 8.192 byte per sistemi basati su Itanium. Per altre informazioni, vedere la funzione GetSystemInfo .
- Le dimensioni del settore sono in genere da 512 a 4.096 byte per i dispositivi di archiviazione ad accesso diretto (dischi rigidi) e 2.048 byte per le MACCHINE CD-RO.
- Entrambe le dimensioni della pagina e del settore sono poteri di 2.
Pertanto, nella maggior parte delle situazioni, la memoria allineata a pagina sarà anche allineata al settore, perché il caso in cui le dimensioni del settore sono maggiori rispetto alle dimensioni della pagina sono rare.
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.