【问题标题】:Windows thread-switching latency after IO completion - microseconds or millisecondsIO 完成后的 Windows 线程切换延迟 - 微秒或毫秒
【发布时间】:2012-12-07 19:20:13
【问题描述】:

我正在尝试确定 IO 操作完成时切换线程的大致时间延迟(Win 7、Vista、XP)。

我(认为我)知道的是:

a) 线程上下文切换本身的计算速度非常快。 (通过非常快,我的意思是通常方式在 1 毫秒以下,甚至可能在 1 微秒以下? - 假设一个相对较快的空载机器等)

b) 循环时间片量子约为 10-15ms。

我似乎找不到有关从(高优先级)线程变为活动/发出信号的典型延迟时间的信息 - 例如,通过同步磁盘写入完成 - 并且该线程实际上再次运行。

例如,我至少在一个地方读到,所有非活动线程都保持休眠状态,直到大约 10 毫秒的系统时间片到期,然后(假设它们已准备就绪),它们几乎同时被重新激活。但在另一个地方,我读到线程完成 I/O 操作与它变为活动/发出信号并再次运行之间的延迟以微秒而不是毫秒为单位。

我的询问上下文与从高速摄像机捕获和连续流式写入 SSD 的 RAID 阵列有关,除非我可以在前一个写入远低于 1 毫秒后开始新的写入(这将是最好平均低于 1/10 毫秒),这将是有问题的。

任何有关此问题的信息将不胜感激。

谢谢, 大卫

【问题讨论】:

  • 请注意,毫秒时间也可以以微秒为单位,只需再添加三个零;-)
  • 你能设置一个基准吗?

标签: windows data-processing thread-state


【解决方案1】:

线程上下文切换需要 2,000 到 10,000 个 cpu 周期,因此只需几微秒。

当线程阻塞表示完成的同步句柄时,I/O 完成速度很快。这使得 Windows 线程调度程序暂时提高线程优先级。这反过来又使得它可能(但不能保证)被选为获得处理器喜爱的线程。所以这通常是微秒,而不是毫秒。

请注意,磁盘写入通常会通过文件系统缓存。这使得 WriteFile() 调用一个简单的内存到内存复制,不会阻塞线程。它以每秒 5 GB 以上的内存总线速度运行。然后数据以懒惰的方式写入磁盘,线程不参与或延迟。只有当文件系统缓存被填满并且您不使用重叠 I/O 时,您才会得到缓慢的写入。如果您编写视频流,这当然是一种可能性。 RAM的数量有很大的不同。和 SSD 控制器不一样。没有什么是你无法预先推理的,你必须测试。

【讨论】:

  • 感谢 Hans,您写道:I/O 完成速度很快 - usecs。您可能已经回答了我的问题,但要确认:1)目前,异步磁盘写入在无限“while”循环中启动。 IO 重叠,并在下一次循环中轮询完成。 1000fps 太慢...(仅供参考:流视频立即填满系统 RAM 和 SSD RAID 卡 RAM。) 2)正在考虑 FIFO buf,从主线程推送,在第二线程中弹出并写入(同步?)。 3)问题:当第二个线程写入完成时,该线程会“立即”(我们)获取控制权以启动另一个写入吗? (可以使第二个线程具有高优先级。)谢谢,D
  • 每秒一千个视频帧?这是一个严重的消防水带。至少通过测量您可以写入 SSD 的字节/秒并除以帧中的平均字节数来设定一个现实的目标。这是你的帧速率上限。只要您从不超过它,您就可以通过缓冲帮助您达到该限制。走得更快,再多的缓冲也无济于事。
  • 想想看,你在严重滥用 SSD 驱动器。他们善于阅读,善于寻找,他们不喜欢写作。你会在一个月或更短的时间内杀死那只小狗。
  • 所有好的想法。我已经确认原始带宽大约是我需要的两倍(持续超过 1 GB/秒)。重新 SSD 寿命 - 是的,如果以该速率运行,MLC 驱动器的寿命有限,这是非常正确的。 (有助于使大尺寸驱动器的周期/单元最小化。目前在 8 个驱动器 RAID 阵列中,所以... :-) 您的响应是否意味着在您的估计中线程切换响应写入完成事件(高优先级和/或提升优先级线程)确实可能在微秒范围内?非常感谢,D。
  • PS:从您的评论中可以听到“当线程阻塞表示完成的同步句柄时,I/O 完成速度很快。”我应该使辅助线程写入确实是同步和阻塞的。 (无论如何,这比一些替代方案更容易,并且似乎比回调等更有意义。)D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2017-09-03
相关资源
最近更新 更多