Salut
Le scheduler décide :
- quel thread s’exécute
- sur quel CPU
- pendant combien de temps
Comprendre le scheduler permet de comprendre :
- performances CPU
- blocages
- starvation
- comportement multithread
---
1) Principe général
Windows ne planifie pas les processus.
Windows planifie les threads.
Code: Select all
Running
Ready
Waiting
Terminated
---
2) Priorités des threads
Code: Select all
1 → 31
16-31 = priorités temps réel
---
3) Classes de priorité
Les processus avec haute priorité exécutent toujours en priorité ses threads avant les threads d'un processus de basse priorité voici les différents types de priorité.
Code: Select all
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
Ces apis permettent de modifier la priorité des threads d'un processus ou obtenir ces infos
Code: Select all
BOOL SetPriorityClass(
HANDLE hProcess,
DWORD dwPriorityClass
);
DWORD GetPriorityClass(
HANDLE hProcess
);
4) Priorité des threads
Les threads avec haute priorité s'exécutent toujours en priorité avant les threads de basse priorité voici les différents types de priorité.
Code: Select all
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
Code: Select all
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority
);
5) Base vs Dynamic priority
Code: Select all
Base Priority
Dynamic Priority
---
6) Ready Queues
Code: Select all
32 ready queues
1 par niveau de priorité
Code: Select all
le thread READY avec la priorité la plus haute s'exécute
7) Quantum
Client Windows ≈ 31 ms
Server Windows ≈ 187 ms
Code: Select all
thread → Ready Queue
8) Round Robin
Si plusieurs threads ont la même priorité :
Code: Select all
Round Robin scheduling
9) Préemption
Code: Select all
Higher priority thread → preemption
10) Priority Boost
Cas fréquents :
Code: Select all
I/O completion
GUI wakeup
Starvation avoidance
11) Scheduling multiprocesseur
Chaque CPU possède :
Code: Select all
sa propre ready queue
- priorité
- cache CPU
- affinité
---
12) Ideal Processor
Ceci permet de choisir sur quel cœur s'exécute le thread en paramètre
Code: Select all
DWORD SetThreadIdealProcessor(
HANDLE hThread,
DWORD dwIdealProcessor
);
13) Hard Affinity
Code: Select all
SetProcessAffinityMask()
GetProcessAffinityMask()
SetThreadAffinityMask()
14) Processor Groups
Code: Select all
1 group = max 64 CPU
Code: Select all
GetProcessGroupAffinity()
SetThreadGroupAffinity()
GetThreadGroupAffinity()
15) CPU Sets
Code: Select all
GetSystemCpuSetInformation()
SetProcessDefaultCpuSets()
SetThreadSelectedCpuSets()
16) Background Mode
Code: Select all
SetPriorityClass(
GetCurrentProcess(),
PROCESS_MODE_BACKGROUND_BEGIN
);
17) Suspend / Resume
Enfin ces 2 api permettent de relance un thread suspendu ou alors d'en suspendre un ce qui est très utile.
Code: Select all
SuspendThread()
ResumeThread()
NtSuspendProcess()
NtResumeProcess()
18) Sleep / Yield
Code: Select all
Sleep(ms)
SwitchToThread()
Conclusion
Le scheduler Windows repose sur :
- priorités
- ready queues
- quantum
- préemption
C’est l’un des composants les plus complexes du noyau Windows.
