我正在开发一个 I/O 绑定应用程序,并试图追踪从慢速移动驱动器读取时发生的错误。追踪此 Heisenbug 的问题是某些东西(驱动器或 Windows 本身)将读取缓存在 RAM 中的某个地方(在驱动器内置缓存中,或在操作系统中的某个地方)。
为了发现软件中的错误,我必须重新启动系统(在虚拟机内运行有同样的性能问题 - 我读取数据一次,但最终它会被缓存在某个地方。)
有没有办法清除这些缓存(无论是在操作系统中还是驱动器本身中)?
答案1
你可以清除 Windows StandbyList/Cache通过调用 Windows API 调用系统信息设置。
在stackoverflow 有人发布了不同的 hack清理系统缓存,也许这就是您所需要的。
答案2
您是否在使用 Win32 IO 调用?如果是,请FILE_FLAG_NOBUFFERING
在调用时使用该选项CreateFile
。然后所有ReadFile
和WriteFile
调用都将直接进入硬件,而无需在操作系统中进行缓冲或缓存。限制:通过该文件句柄进行的读写调用必须是块大小的倍数,并且文件中的偏移量也必须是块大小的倍数。
据我所知,这不会停止驱动器硬件上的缓存。