当我执行fopen然后执行fread时,文件何时实际/部分加载到内存中 在fopen或fread期间?
或者是根据文件大小在fopen中部分加载,然后在时间完全加载 恐惧?
同样,在调用fwrite时OS内部会发生什么? 此时文件是否已加载到内存中,或者仅在重新访问该部分时发生页面交换 内存中的文件?
对于内存中的文件加载,在每个调用的操作系统级别会发生什么?
答案 0 :(得分:6)
fopen()
仅创建文件句柄。fread()
实际上将文件读入内存缓冲区(操作系统级缓冲可能会透明地发生在客户端上。)fwrite()
将数据写入文件,但是提交到存储可能会延迟(例如使用记录的文件系统。)答案 1 :(得分:4)
通常,打开文件时不会将文件加载到内存中。相反,每次读取都会加载部件;由于各种缓冲,可能会加载更多的块,然后在每个fread
中请求。
当你fwrite
某些数据时,它最终被复制到内核中,然后在缓冲后将其写入磁盘(或任何地方)。通常,为了写入,不需要加载文件的任何部分。
答案 2 :(得分:2)
通常它取决于文件系统和操作系统。在Windows中有一个缓存机制,它处理256KB块中的文件,并在读取请求时加载每个块,落在该块中。对fopen
的调用不应导致从媒体中读取文件内容。 fread
将导致媒体部分读取(或完整读取小文件)。部分读取通常等于缓存管理器中的缓存行大小(256KB)。
fwrite
也可能/可能不会导致对媒体的实际写入。它通常会将客户端数据传输到RAM中的缓存文件区域,但不保证数据实际写入介质。在Windows中,缓存管理器决定何时将文件的缓存区域刷新到介质。如果您想确保在fwrite
之后将所有脏数据刷新到媒体,则需要在之后调用fflush
。
答案 3 :(得分:1)
虽然这是依赖于操作系统的,但在现代操作系统中,所有磁盘活动都是透明缓存的,因此当您实际打开文件时,它会映射到虚拟内存空间的一部分。
这意味着在实际读/写之前没有磁盘活动。
即使您在没有内存映射的情况下打开文件(例如:fopen)也是如此, 而如果你用内存映射打开它(例如:mmap),你就会失去“透明度”。