Dot-Net

如何提高程序的 I/O 優先級?

  • January 20, 2020

我想增加程序的 I/O 優先級。.NET 和 Windows Vista 的答案都很好。processexplorer 也可以。

與通常的 MS 文件相比,相關資訊似乎有點分散。有這篇白皮書討論了 windows 中的 I/O 優先級。這個文件似乎到處都是 beta 標誌,但我想它可能非常準確。

需要注意的兩個重要事項:

  1. 您只能將 IO 請求的優先級降低到正常以下。
  2. 驅動程序可以忽略任何此類請求並將其視為正常。

對客戶端應用程序有用的 API 是SetFileInformationByHandle

FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
                                    FileIoPriorityHintInfo,
                                    &priorityHint,
                                    sizeof(PriorityHint));

設置優先級

// reduce CPU, page and IO priority for the whole process
result = SetPriorityClass( GetCurrentProcess(),
                          PROCESS_MODE_BACKGROUND_BEGIN);
// do stuff
result = SetPriorityClass( GetCurrentProcess(),
                          PROCESS_MODE_BACKGROUND_END);

SetThreadPriority類似:

// reduce CPU, page and IO priority for the current thread
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
// do stuff
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);

SetFileBandwithReservation

// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
                                 1000,
                                 200,
                                 FALSE,
                                 &transferSize,
                                 &outstandingRequests );

對於 .Net,使用 P/Invoke 做通常的事情。

引用自:https://stackoverflow.com/questions/301290