【问题标题】:I/O Prioritization of Windows OSWindows 操作系统的 I/O 优先级
【发布时间】:2021-03-05 04:17:44
【问题描述】:

我正在学习 Jeffrey Richter Book(Windows via C/C++)。在一节中,他谈到了 I/O 优先级。我现在知道什么是优先级,什么是优先级、优先级以及基本优先级。

我知道,我可以使用 SetPriorityClass 和 SetThreadPriority 更改进程和线程的优先级,但我无法理解 I/O 优先级在 Windows 10 中的工作原理,或者优先级如何帮助我们微调适用的应用程序性能缓慢的基于存储的设备。

例如,当我有一个与存储设备一起工作的线程时,当我设置它的优先级 THREAD_MODE_BACKGROUND_BEGIN 时会发生什么?能不能简单解释一下?我也完整阅读了这篇论文 (link),但我无法理解 I/O 的优先级。

【问题讨论】:

  • 请注意,如果存储设备本身就很慢,那么您无能为力。
  • @MartinJames 是否可以从头开始解释整个机制?我想知道当我将线程的优先级更改为后台模式时会发生什么,以及调度程序或设备如何处理这些线程。
  • 并非如此。 I/O 子系统很复杂,而且在较低级别上,是特定于设备的:(
  • 关键是I/O 请求优先级。如果两个进程对同一设备的 I/O 请求进行排队,哪个将首先执行?这与请求 CPU 使用率的 thread 优先级不同。通过网络备份的 I/O 优先级应该低于来自网络的视频流,因此它的 I/O 优先级较低,而视频的优先级较高。这说明清楚了吗?
  • @PaulOgilvie 因此,当一个线程具有低优先级时,当一个具有高优先级的线程想要向同一设备(如文件系统)发出 I/O 请求时,它无法发出 I/O 请求。对吗?

标签: c++ c multithreading winapi


【解决方案1】:

如那篇论文中所述,由 I/O 设备驱动程序根据线程优先级来处理优先级,并且在该论文中,只有两个级别,正常和后台,设备驱动程序可以忽略。

设备驱动程序可以通过两个 I/O 请求队列实现两个优先级,一个用于普通优先级,另一个用于后台优先级。驱动程序还可以包含逻辑,以防止正常队列完全锁定后台队列,方法是偶尔根据时间或请求计数处理来自后台队列的请求,即使正常队列不为空。

这篇论文是一篇旧论文,指的是 Vista。到目前为止,在 Windows 10 中,I/O 优先级可能不止两个级别。

【讨论】:

  • 那么设备驱动会根据线程的优先级来响应线程的I/O请求吧?
  • @Cayoot - 如果设备没有当前的 I/O,它将由于当前的 I/O 请求而启动。如果设备忙,则 I/O 请求将排队,如果由驱动程序实现,则根据优先级排队。在我的回答中,我使用了基于优先级的单独 I/O 请求队列的示例。
  • 所以 I/O 请求会根据优先级排队,设备分别响应?
  • @Cayoot - 如果 I/O 设备一次只支持一个命令,则设备一次发送一个命令,并在每个命令完成时做出响应。如果 I/O 设备支持排队命令,例如具有“本机命令队列”的硬盘驱动器,则执行命令的顺序可能与发出这些命令的顺序不同,这会干扰 I/O 的优先级。看看wiki native command queuing。优先命令队列可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多