sea*_*rse 7 c c++ operating-system
当我执行fopen然后fread时,fopen或fread期间文件实际/部分加载到内存中的时间是什么时候?
或者是根据文件大小在fopen部分加载,然后在fread时满载?
类似地,当调用fwrite时,操作系统级别内部会发生什么?此时文件是否已加载到内存中,或者页面交换是否仅仅在内存中重写文件的那一部分?
关于内存中的文件加载,在每个调用的操作系统级别会发生什么?
fopen() 仅创建文件的句柄.fread() 实际上将文件读入内存缓冲区(操作系统级缓冲可能会透明地发生在客户端上.)fwrite() 将数据写入文件,虽然它提交到存储可能会延迟(例如,使用日志文件系统.)通常,文件在打开时不会加载到内存中。相反,每次读取都会加载零件;由于各种缓冲,可能会加载更大的块,然后您在每个fread.
当您获得fwrite一些数据时,它最终会被复制到内核中,然后在缓冲后将其写入磁盘(或其他任何地方)。通常,不需要加载文件的任何部分来写入。
一般来说,这取决于文件系统和操作系统。在 Windows 中,有一个缓存机制,它以 256KB 块的形式处理文件,并在读取请求落在该块中时加载每个块。调用fopen不应导致从媒体读取文件内容。并fread会导致从媒体部分读取(或小文件完全读取)。部分读取通常等于缓存管理器中的缓存行大小 (256KB)。
fwrite也可能/可能不会导致实际写入介质。它通常会导致客户端数据传输到 RAM 中的缓存文件区域,但不能保证数据实际写入介质。在 Windows 中,缓存管理器决定何时将文件的缓存区域刷新到介质。如果您想确保所有脏数据在 后刷新到介质fwrite,您需要fflush稍后调用。