Page 1 of 1

Scheduler et threads

Posted: Tue Mar 10, 2026 7:23 pm
by Hydraxx
# Le Scheduler Windows (Thread Scheduling)


Salut :) aujourd’hui on va voir un composant central du noyau Windows : le scheduler.

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
Seuls les threads READY peuvent être exécutés.

---
2) Priorités des threads

Code: Select all

1 → 31
1-15 = priorités normales
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
API importantes

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
API

Code: Select all

BOOL SetThreadPriority(
 HANDLE hThread,
 int nPriority
);
---
5) Base vs Dynamic priority

Code: Select all

Base Priority
Dynamic Priority
Le scheduler utilise la Dynamic Priority.

---
6) Ready Queues

Code: Select all

32 ready queues
1 par niveau de priorité
Algorithme :

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
Le scheduler prend en compte :

- 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
APIs

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.