何时将文件加载到内存中 – 对于fread,fopen和fwrite调用?

当我执行fopen然后fread时,fopen或fread期间文件实际/部分加载到内存中的时间是什么时候?

或者它是基于文件大小在fopen部分加载,然后在fread时满载?

类似地,当调用fwrite时,操作系统级别内部会发生什么? 此时文件是否已加载到内存中,或者页面交换是否正在重新检索内存中的那部分文件?

关于内存中的文件加载,在每个调用的操作系统级别会发生什么?

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

通常,打开文件时不会将文件加载到内存中。 相反,每次读取都会加载部件; 由于各种缓冲,可能会加载更大的块然后你在每个fread

当您写入一些数据时,它最终会被复制到内核中,然后在缓冲后将其写入磁盘(或任何地方)。 通常,为了写入,不需要加载文件的任何部分。

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

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

虽然这是依赖于操作系统的,但在现代操作系统中,所有磁盘活动都是透明缓存的,因此当您实际打开文件时,它会映射到虚拟内存空间的一部分。

这意味着在实际读/写之前没有磁盘活动。

即使您打开没有内存映射的文件(例如:fopen)也是如此,而如果您使用内存映射打开它(例如:mmap),您就会失去“透明度”。