2012-02-03 7 views
7

Kiedy robię fopen, a następnie fread, kiedy plik faktycznie/częściowo załadowany do pamięci podczas fopen lub fread?Kiedy plik jest ładowany do pamięci - w przypadku freadowania, fopen i fwrite calls?

Czy jest częściowo załadowany w systemie fopen na podstawie rozmiaru pliku, a następnie całkowicie załadowany w momencie z freadu?

Podobnie, co dzieje się wewnętrznie na poziomie systemu operacyjnego, gdy wywoływany jest fwrite? Czy plik został wczytany do pamięci w danym momencie, czy też nastąpi zamiana strony, pobierając tylko część pliku w pamięci?

Co dzieje się na poziomie systemu operacyjnego podczas każdego z tych połączeń związanych z ładowaniem plików do pamięci?

+4

Dla jakich systemów plików? Do jakiego systemu operacyjnego? –

+4

Który system operacyjny? Jest to całkowicie zależne od systemu operacyjnego. (Spodziewam się, że zazwyczaj żadne dane nie będą czytane z pliku, gdy go po prostu otworzysz.) –

+0

Potrzebowałem danych dla Windows, ale chciałbym wiedzieć, jaka jest różnica w systemie Linux – seahorse

Odpowiedz

6
  • fopen() tworzy tylko uchwyt do pliku.
  • fread() faktycznie czyta plik w buforze pamięci (buforowania OS-poziom może nastąpić w sposób przejrzysty dla klienta.)
  • fwrite() zapisuje dane do pliku, choć jego popełnienia do przechowywania może się opóźnić (np osadzony plików.)
4

Zazwyczaj plik nie jest ładowany do pamięci po jego otwarciu. Zamiast tego części są ładowane do każdego odczytu; ze względu na wszelkiego rodzaju buforowanie, większe partie mogą być ładowane, a następnie prosić o każdy z nich w każdym fread.

Po dodaniu niektórych danych, jest on ostatecznie kopiowany do jądra, które następnie zapisuje je na dysku (lub gdziekolwiek) po buforowaniu. Zasadniczo żadna część pliku nie musi zostać załadowana w celu napisania.

2

Zasadniczo zależy to od systemu plików i systemu operacyjnego. w oknach znajduje się mechanizm buforowania, który zajmuje się plikiem w porcjach 256KB i ładuje każdy fragment na żądanie odczytu spadające w tym kawałku. Połączenie z numerem fopen nie powinno powodować odczytu zawartości pliku z nośnika. I fread spowoduje częściowe odczytanie (lub całkowite przeczytanie małych plików) z nośnika. Czytanie częściowe jest zwykle równe wielkości linii pamięci podręcznej w menedżerze pamięci podręcznej (256 KB).

fwrite również może/nie może powodować rzeczywistego zapisu na nośniku. Zwykle powoduje to przeniesienie danych klienta do obszaru plików buforowanych w pamięci RAM, ale nie ma gwarancji, że dane rzeczywiście zostaną zapisane na nośniku. w systemie Windows menedżer pamięci podręcznej decyduje, kiedy opróżnić buforowany obszar pliku na nośnik. Jeśli chcesz się upewnić, że wszystkie brudne dane zostaną przepłukane na nośniki po fwrite, musisz później zadzwonić pod numer fflush.

1

Chociaż jest to zależne od systemu operacyjnego, w nowoczesnym systemie operacyjnym cała aktywność dysku jest przezroczyście przechowywana w pamięci podręcznej, tak więc po otwarciu pliku w rzeczywistości jest on mapowany na część wirtualnej pamięci.

Oznacza to, że żadna aktywność dysku nie występuje przed faktycznym odczytem/zapisem.

Jest to prawdą, nawet jeśli otworzysz plik bez mapowania pamięci (np. Fopen), , a jeśli otworzysz go z mapowaniem pamięci (np: mmap), stracisz "przezroczystość".

Powiązane problemy