如何在磁盘调度算法中找到平均寻道时间? 我正在寻找磁盘调度算法中使用的平均寻道时间的公式。
第一步是确定设备本身的地理位置。这是困难的。现代硬盘无法通过旧的“气缸,磁头,扇区”三联体来定义,每个磁道的扇区数量对于不同的轨道是不同的(外围轨道上的周边更多的扇区,周边的内部轨道上的扇区更少)您可以获得有关驱动器的所有信息(来自设备本身,或来自任何固件或OS API),这些都是让传统软件感到满意的谎言。
要解决这个问题,你需要求助于“基准战术”。具体来说,从LBA扇区0读取然后读取LBA扇区1并测量它所花费的时间(建立“两个扇区处于相同轨道时所花费的时间”假设),然后从LBA扇区0读取,然后在循环中读取LBA扇区N( N从2开始增加)同时测量它所花费的时间并将其与之前的值进行比较,并寻找更大的时间增加,这表明你已找到“轨道0”和“轨道1”之间的边界。然后重复此操作(从“轨道1”中的第一个扇区开始)以找到“轨道1”和“轨道2”之间的边界;并不断重复这个来构建一个“每条轨道上有多少扇区”的数组。请注意,并非如此简单 - 存在各种缺陷(例如,比逻辑扇区更大的物理扇区,在轨道上交错的扇区,坏块替换,内置在磁盘驱动器中的内部缓存等),需要将其考虑在内。当然这将耗费大量时间(例如,每次操作系统启动时,您不希望为每个磁盘执行此操作),因此您需要获取硬盘的标识(制造商和型号)并存储自动 - 在某处检测到几何图形,以便在先前存储该磁盘模型的几何图形时跳过自动检测。
下一步是使用有关真实几何体(而不是假几何体)的信息与更多“基准测试策略”相结合来确定性能特征。理想情况下,你会试图找到类似公式的常量 expected_time = sector_read_time + rotational_latency + distance_between_tracks * head_travel_time + head_settle_time ,可以这样做:
expected_time = sector_read_time + rotational_latency + distance_between_tracks * head_travel_time + head_settle_time
sector_read_time
rotational_latency
time0
time1
head_travel_time = time1 - time0
head_settle_time = time0 - head_travel_time - sector_read_time
请注意,这也存在各种陷阱(与之前相同),并且(如果你解决它们)你可以期望的最好的是一般估计(而不是一个准确的预测器)。
当然,这也将是非常耗时的,并且如果您将自动检测到的几何存储在某处,那么将自动检测的性能特征存储在同一位置也是一个好主意;这样,如果先前存储了该型号磁盘的所有信息,则可以跳过所有自动检测。
请注意,以上所有内容都假设“独立旋转盘片硬盘没有缓存且没有混合/闪存层”,并且在很多情况下都是完全没用的。对于其他一些情况(SSD,CD / DVD),您需要使用不同的技术来自动检测其几何和/或特征。然后就是像RAID和虚拟化这样的东西让事情变得更复杂。
大多; 的 在实践中烦恼太麻烦了 强> 。
代替;只是假设 cost = abs(previous_LBA_sector_number - next_LBA_sector_number) 和/或让硬盘自己整理最佳顺序(例如使用本机命令队列 - 请参阅 https://en.wikipedia.org/wiki/Native_Command_Queuing )。
cost = abs(previous_LBA_sector_number - next_LBA_sector_number)