INFO: FILE_FLAG_WRITE_THROUGH a FILE_FLAG_NO_BUFFERING

Souhrn

Příznak FILE_FLAG_WRITE_THROUGH pro funkce CreateFile() způsobí, že všechny zápisy provedené popisovače zapsat přímo do souboru bez jsou ukládány do vyrovnávací paměti. Je uložen v mezipaměti (uložené v mezipaměti disku); Nicméně je stále zapsán přímo do souboru. Tato metoda umožňuje operace čtení na dat, které splňují požadavek na čtení z dat uložených v mezipaměti (Pokud je stále k dispozici), namísto toho chcete-li soubor získat data. Volání zápisu nevrací, dokud budou data zapsána do souboru. To se týká vzdálených zápisů – předá přesměrovač sítě, nastaveným příznakem FILE_FLAG_WRITE_THROUGH příznak serveru tak, aby server ví, nikoli k uspokojení požadavku zápisu, dokud budou data zapsána do souboru.


FILE_FLAG_NO_BUFFERING má tento pojem o krok dále a eliminuje všechny souboru čtení napřed ukládání do vyrovnávací paměti a ukládání do diskové mezipaměti, takže je zaručeno, že všechny operace čtení pocházet ze souboru a nikoli z vyrovnávací paměti systému nebo diskové mezipaměti. Používáte-li FILE_FLAG_NO_BUFFERING, přečte disku a zápisy musí být provedeny na hranice sektorů a vyrovnávací paměti adresy musí být zarovnány na hranice sektorů disku do paměti.


Tato omezení jsou nezbytné, protože vyrovnávací paměť předat čtení nebo zápisu API slouží přímo pro vstupně-výstupní operace na úrovni zařízení; na této úrovni musí splňovat omezení procesoru a média zarovnání hardwaru, který používáte na vyrovnávací paměti adresy a velikosti sektoru.

Další informace

CDFS systém Windows 95 (CD-ROM File System) pro funkce CreateFile() nepodporuje příznak FILE_FLAG_NO_BUFFERING. Zatímco FSD systému Windows 95, jako například VFAT, může jeho implementaci, FILE_FLAG_NO_BUFFERING není požadováno příznak pro ovladače systému souborů a není podporován CDFS.


Tento fragment kódu demonstruje odvětví zarovnání dat do vyrovnávací paměti a předat Funkce 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);


Ukazatel p je zarovnán sektoru a body ve vyrovnávací paměti.


Pokud je situace, ve které chcete vyprázdnit všechny otevřené soubory v aktuální logickou jednotku, to lze provést:

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

Tato metoda způsobí, že všechna data pro zápis ve vyrovnávací paměti pro všechny otevřené soubory v oddílu C: vyprázdněna a zapsána na disk. Všimněte si, že všechny ukládání do vyrovnávací paměti provést cokoli jiného než systém není ovlivněn tento vyprázdnění; všechny možné soubory ukládání do vyrovnávací paměti, že C Run-time dělá soubory otevřené pomocí rutiny C Run-time není ovlivněn.


Při otevírání vzdáleného souboru v síti, server vždy ukládá do mezipaměti a ignoruje žádné vyrovnávací paměti příznak zadaný klientem. Toto je záměrné. Přesměrovač a server nemůže implementovat správně úplné sémantiku FILE_FLAG_NO_BUFFERING v síti. Zejména nelze splnit požadavek vstupně-výstupní velikost sektoru, sektoru zarovnané. Proto pokud aplikace Win32-založené požaduje FILE_FLAG_NO_BUFFERING, přesměrovač a server považovat tento jako požadavek pro FILE_FLAG_WRITE_THROUGH. Soubor není v mezipaměti na straně klienta, zápisy přejít přímo na server a na disk na serveru a velikosti ke čtení a zápisu v síti jsou přesně aplikace požádá o. Však soubor je uložen do mezipaměti na serveru.


Není ukládání do mezipaměti klienta může mít různý účinek v závislosti na typu vstupu a výstupu. Vyloučit přístupů do mezipaměti nebo čtení předem, ale také může snížit velikost odesílá a přijímá. Obecně pro sekvenční I/O, je vhodné do mezipaměti na straně klienta. Malý, náhodný přístup I/O, je často nejlepší nejsou do mezipaměti.
Vlastnosti

ID článku: 99794 - Poslední kontrola: 12. 1. 2017 - Revize: 1

Váš názor