关于硬盘驱动器的问题,在Windows操作系统中“搜索”和“读取”

时间:2009-05-03 15:09:39

标签: windows winapi file-io filesystems hard-drive

有人知道什么时候打电话'寻找'和'读',硬盘如何受到物理影响?

如果我更具体,我知道硬盘有一种磁针用于从磁板读取数据。所以我的问题是,什么时候针准确移动到读取位置?

当我们调用“seek”windowsApi方法时(无论是否执行了实际读取),或者“寻找”只是记住虚拟指针,它是否被移动,并且针的物理移动仅在“读“方法被称为?

编辑:假设硬盘驱动器中请求的数据不存在于任何缓存中(硬盘驱动器缓存,Os缓存,Ram以及其他任何缓存)

3 个答案:

答案 0 :(得分:2)

想要从你的帖子中提出这个问题

  

针何时移动到读数位置?

我认为简单的答案是“每当请求数据时,任何数量的缓存中都不存在”。预测硬盘驱动器移动的问题是您必须考虑缓存从硬盘驱动器读取数据的所有不同位置。如果数据存在于那些高速缓存中并且在请求数据的上下文中可访问,则将使用高速缓存而不是实际读取硬盘驱动器。以下是可以和可以缓存硬盘数据的一些地方

  • 硬盘的内部缓存
  • 操作系统级别缓存
  • 程序级缓存
  • API级缓存

如果没有数据存在,那么在read通话期间可能会从硬盘驱动器中读取数据。 seek调用不太可能导致硬盘驱动器移动,因为您没有更改物理硬盘驱动器指针,而是更改程序中文件的虚拟指针。

答案 1 :(得分:1)

硬盘驱动器头(针)开始移动,并且在read操作中磁盘开始旋转(除非已经旋转)。 seek操作没有头部移动或旋转。

请注意,即使您按顺序read文件,头部也可能在磁盘上方不按顺序移动,即第2个,第3个等的read 512字节块可能会导致即使没有介入seek,也要前往很远的地方。这部分是因为文件在文件系统上被分段,或者因为固件具有扇区号重新映射(即逻辑扇区5不在逻辑扇区4和6之间)以补偿坏块错误。

答案 2 :(得分:1)

问题中的假设“假设硬盘驱动器中请求的数据不存在于任何缓存中(硬盘驱动器缓存,Os缓存,Ram以及其他任何可能的内容)”很难假设而且比较少见。即使在这种情况下,用户模式文件I / O操作和物理存储设备操作之间也只有松散的关联。

各种Windows库中有许多用户模式文件I / O功能。一些最古老的是C library low level I/O functions。还有C library stream I/O functionsC++ iostreams classesmanged I/O classes。还有其他I / O接口也是其他软件包的一部分。

通常,所有用户模式I / O库都建立在Win32 file I/O functions之上,包括CreateFile()SetFilePointer()ReadFile()WriteFile()

除非在无缓冲模式下打开文件,否则操作系统可以缓存文件内容。这是在系统范围内完成的,而不是基于每个文件。因此,即使您的程序没有读取或写入文件,文件的I / O也可能被缓存,并且不会导致任何物理存储设备I / O.

有许多因素决定了文件I / O如何映射到物理设备上的实际I / O操作。这包括库级别缓冲,操作系统兑现,设备驱动程序缓存,硬件级别兑现,设备块大小,文件大小,硬件块/扇区重新映射以及其他因素。

这里的简短故事是,您不能假设单个文件级别的读取或查找操作对应于物理设备操作,例如磁头搜索。

当考虑写入时,这变得更加棘手。写入通常伴随着刷新 - 应用程序开发人员假定将刷新数据一直推送到物理介质。开发人员通常假设当刷新调用返回成功时,保证数据在存储设备上是持久的。这远非如此,因为设备和驱动程序经常忽略刷新调用。

固态硬盘更复杂,不是机械的,因此没有“搜索”操作。在这里,其他物理特征表现出来,例如在写入之前擦除块的必要性。