ROW调度算法翻译

  1. 在移动设备中,用户体验的优化性高于一切,因此,我们希望赋予读请求更高的处理权限。ROW的主要调度策略是:在不导致写请求更多饥饿的情况下赋予读请求更高的权限。
  2. ROW调度策略中,请求根据其权限将被放入不同的权限队列中。每个队列通过轮询的方式被调度,调度过程中每个队列被赋予一定的调度时间片。每个请求队列的调度片大小是根据该队列的权限所确定的。相比于写请求队列,在同一个调度周期(即一次轮询)内,读请求队列将被赋予更大的调度片。
  3. 目前,ROW支持六种类型的调度队列:
    a) 高权限读队列
    b) 高权限同步写队列
    c) 普通权限读队列
    d) 普通权限同步写队列
    e) 普通权限写队列
    f) 低权限读队列
  4. 若当前某个队列在当前的队列调度片内处于“空”状态并且当前的调度片没有使用完,则将该队列标记为“未服务”。若现在某个其他队列正在被服务,且其权限低于之前的某个调度片的“未服务”队列,则该“未服务”队列将在当前调度队列的时间片结束后重新被调度发送请求,但这并不意味着该“未服务”队列会被重新分配调度片,其将会在之前剩余的调度片内继续完成调度工作。
  5. 对于读请求队列,我们允许其在调度片内存在一定的空闲时间,从而能够使得应用程序能够发送更多的读请求到读请求队列中。该空闲时间表示,即使当前读请求队列处于“空”状态,其仍能够在一定的时间段内被继续响应,等待读请求的加入。当我们定义应用程序处于频繁发送请求的状态,则该空闲时间机制将被触发。
  6. 空闲时间机制时通过timer机制实现的。当timer提示当前分配的额外时间已到期,并且当前仍有请求在其他队列中等待被处理,则调度器将通知底层driver,让其开始调度其他请求队列。
  7. ROW调度策略在设计过程中采取了“面向用户”的设计原则,即允许应用程序示意ROW某些请求需要被更紧急地处理。例如,如在一批读请求中存在某些读请求需要被更紧急地处理,那么这些需要被更紧急的读请求将被添加的高权限读请求队列中,该请求队列具有更大的调度片,从而使得更多的读请求能够被及时调度。
  8. ROW调度器能够使底层块设备对于高权限请求进行特殊处理。即,调度器可通过新的调用函数make_urgent_request通知底层设备处理紧急的请求。另外,ROW调度器支持对于中断请求的再调度。例如,若当前设备发送了一个长时间的写请求,而这时候有大量高权限的读请求中断加入到当前调度器中。那么,底层设备将停止当前对于写请求的服务,而转向与服务这些高权限的读请求。在这种情况下,底层设备会先向调度器返回一个当前该写请求的reminder,从而调度器能够继续发送这些高权限的读请求而不需要将该正在被处理的写请求进行一次又一次的中断。而该write reminder将会在随后被继续发送并执行该写请求。

原文:https://lwn.net/Articles/509829/

点赞