文件何时加载到内存中 - 对于fread、fopen和fwrite调用?

9
当我执行fopen然后进行fread操作,文件实际上/部分在fopen期间加入内存还是fread期间?
或者说,它基于文件大小在fopen时部分加载,然后在fread时完全加载?
同样地,当调用fwrite时,在OS级别内部会发生什么?
文件是否在此时加载到内存中,或者页面交换发生在检索内存中文件的那一部分?
每次调用时,在OS级别上对于文件在内存中的加载情况会发生什么?

4
针对哪些文件系统?针对哪个操作系统? - Scott Hunter
4
哪个操作系统?这完全取决于操作系统。 (通常情况下,我认为当您只是fopen文件时,不会从文件中读取任何数据。) - Edward Loper
我需要 Windows 的数据,但是也很想了解在 Linux 上的差异。 - seahorse
4个回答

8
  • fopen() 只创建文件句柄。
  • fread() 实际上将文件读入内存缓冲区中(操作系统级别的缓冲可能会对客户端透明)。
  • fwrite() 将数据写入文件,但其提交到存储可能会延迟(例如使用日志文件系统)。

5
通常,打开文件时不会将文件加载到内存中。相反,每次读取时会加载部分内容;由于各种缓冲,可能会加载比每个fread请求的更大的块。
当您fwrite一些数据时,它最终会被复制到内核中,内核将在缓冲后将其写入磁盘(或其他位置)。通常,为了写入文件,不需要加载文件的任何部分。

5

通常取决于文件系统和操作系统。在Windows中,有一个缓存机制,它以256KB的块处理文件,并在落入该块的读请求时加载每个块。调用fopen不应导致从介质读取文件内容。而fread将导致从介质进行部分读取(或对于小文件进行完整读取)。部分读取通常等于缓存管理器中的高速缓存行大小(256KB)。

fwrite也可能/可能不会导致实际写入媒体。它通常导致客户端数据传输到RAM中的缓存文件区域,但不能保证数据实际上被写入媒体。在Windows中,缓存管理器决定何时将文件的缓存区域刷新到介质。如果您想确保所有脏数据在fwrite之后刷新到介质,请在此之后调用fflush


3
虽然这取决于操作系统,但在现代操作系统中,所有磁盘活动都被透明地缓存,因此当您打开一个文件时,实际上它被映射到虚拟内存空间的一部分。 这意味着在实际读写之前不会发生任何磁盘活动。 即使您没有使用内存映射(例如:fopen)打开文件,这也是正确的, 而如果您使用内存映射(例如:mmap)打开它,您只会失去“透明度”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接