2

我有一个进程为一块硬件(数据传输设备)提供特定的缓冲区大小。我可以从 Windows 调度程序窗口合理地期望什么,以确保我没有得到缓冲区下溢?

我的缓冲区大小为 32K,每秒消耗约 800k 字节。

如果我将其填充为 16k 字节批次,即每 20 毫秒一批。但是,我填充它的下限是多少。如果说,我在填充循环中调用 sleep(0) 我合理的最坏情况调度间隔是多少?

操作系统 = Windows XP SP3 双核 2.2Ghz

请注意,我正在调用 API 来检查缓冲区填充级别,并调用驱动程序 API 以将数据传递给它。我假设这些是除了 sleep(0) 之外 Windows 可以使用的调度点。

我想(作为一个过程)表现得很好,并且仍然满足我的实时截止日期。机器专用于这项任务,但需要通过网络接收数据并将其发送到 IO 设备。

我对调度程序性能有什么期望?我还需要考虑什么。

4

2 回答 2

3

Windows 中进程的最短保证时间是多少?

无法保证:Windows 不是实时操作系统。

我还需要考虑什么

  • 机器上还有什么正在运行(高优先级的东西可能会抢占你)
  • 您有多少 RAM(当 RAM 供不应求时,系统性能会发生很大变化)
  • 无论您是 dong I/O(因为您可能会在等待磁盘或网络访问时停止)

我想(作为一个过程)表现得很好,并且仍然满足我的实时截止日期。机器专用于这项任务,但需要通过网络接收数据并将其发送到 IO 设备。

考虑将进程和/或线程的优先级设置为“实时优先级”。

于 2010-08-24T16:04:18.580 回答
3

没有保证最坏的情况。CPU 丢失数百毫秒是很有可能的。无论内核线程正在做什么,您都受制于它们,它们总是以比您所能获得的更高的优先级运行。遇到行为不端的 NIC、USB 或音频驱动程序是您经常遇到的问题。除非你能控制硬件。

如果您可以在偶尔的欠载中幸存下来,那么请确保您用于获取设备数据的 I/O 请求是可等待事件。Windows 喜欢调度阻塞在所有其他请求之前完成的 I/O 请求的线程。使用 Sleep() 轮询不是一个好策略。它不必要地消耗 CPU 周期,调度程序根本不会支持线程。

如果您无法在欠载中幸存下来,那么您需要考虑设备驱动程序。

于 2010-08-24T16:07:00.607 回答