Date

MMCSS の AvSetMmThreadCharacteristics によって、スレッド優先度の値がどのように変化するのか、気になったので検証してみた。また、プロセス優先度によって、設定されるスレッド優先度に違いがあるかどうか検証した。

MMCSS のタスク名は Pro audio と Audio の 2 種類を試しています。

結果としては、プロセス優先度が高いと設定されるスレッド優先度が高くなった。Pro Audio のほうが Audio よりも優先度が高くなるようだ。レジストリをみると、Pro Audio の Priority は 1, Scheduling Category は High、 Audio のは 6 , Medium 。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
** Default priority class (NORMAL_PRIORITY_CLASS)
process priority=32 / thread priority=0
  - Pro Audio
process priority=32 / thread priority=-7
  - Audio
process priority=32 / thread priority=-3
** ABOVE_NORMAL_PRIORITY_CLASS
process priority=32768 / thread priority=0
  - Pro Audio
process priority=32768 / thread priority=-9
  - Audio
process priority=32768 / thread priority=-5
** HIGH_PRIORITY_CLASS
process priority=128 / thread priority=0
  - Pro Audio
process priority=128 / thread priority=-12
  - Audio
process priority=128 / thread priority=-8
** REALTIME_PRIORITY_CLASS
process priority=128 / thread priority=0
  - Pro Audio
process priority=128 / thread priority=-12
  - Audio
process priority=128 / thread priority=-8
** IDLE_PRIORITY_CLASS
process priority=64 / thread priority=0
  - Pro Audio
process priority=64 / thread priority=-3
  - Audio
process priority=64 / thread priority=1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
void output_priority() {
    DWORD proc_p=GetPriorityClass(GetCurrentProcess());
    int priority=GetThreadPriority(GetCurrentThread());
    printf("process priority=%d / thread priority=%d\n", proc_p, priority);
}
void mm_thread(LPCTSTR name) {
    DWORD taskIndex=0;
    HANDLE hTask=AvSetMmThreadCharacteristics(name, &taskIndex);
    printf("  - %S\n", name);
    output_priority();
    AvRevertMmThreadCharacteristics(hTask);
}
int _tmain(int argc, _TCHAR* argv[])
{
    printf("** Default priority class (NORMAL_PRIORITY_CLASS)\n");
    output_priority();
    mm_thread(_T("Pro Audio"));
    mm_thread(_T("Audio"));
    printf("** ABOVE_NORMAL_PRIORITY_CLASS\n");
    SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
    output_priority();
    mm_thread(_T("Pro Audio"));
    mm_thread(_T("Audio"));
    printf("** HIGH_PRIORITY_CLASS\n");
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    output_priority();
    mm_thread(_T("Pro Audio"));
    mm_thread(_T("Audio"));
    printf("** REALTIME_PRIORITY_CLASS\n");
    SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
    output_priority();
    mm_thread(_T("Pro Audio"));
    mm_thread(_T("Audio"));
    printf("** IDLE_PRIORITY_CLASS\n");
    SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
    output_priority();
    mm_thread(_T("Pro Audio"));
    mm_thread(_T("Audio"));
    return 0;
}

https://github.com/mahorigahama/MMCSS_TEST


Comments

comments powered by Disqus