In het algemeen krijgt een thread met een hogere prioriteit meer processor tijd
dan ‚‚n met een lagere prioriteit. Om preciezer te zijn, &os2; kijkt naar thread
prioriteiten als meer dan ‚‚n thread intern gemerkt is met "klaar".
Daar tegenover staat dat, threads die nu geblokkeerd zijn in het geheel geen CPU tijd
nodig hebben, prioriteiten doen er dan niet toe totdat de blokkering is opgeheven. Merk op dat
typisch op uw &os2; systeem, het grootste gedeelte van de threads op ieder moment
in de tijd in "geblokkeerde" status staan.
&os2; is in staat om de thread prioriteiten op een zeer verfijnde wijze te beheren.
Het onderscheidt vier prioritietsklassen:
- "Idle time priority" (1) is de laagste prioriteitsklasse. Dit betekent
dat een thread alleen maar processor tijd krijgt als er geen threads lopen met een hogere
prioriteitsklasse. Zulke threads zijn nuttig voor het weghalen van werk dat moet worden
gedaan, maar kan worden uitgesteld totdat de computer er tijd voor heeft.
- "Regular priority" (2) is de prioriteitsklasse die door de meeste threads
wordt gebruikt. Het is tevens de standaard &os2; prioriteitsklasse als een thread zijn
prioriteit niet expliciet wijzigt. &os2; varieert dynamisch prioriteitsniveaus tussen
threads van deze klasse (meer daarover hieronder) om er zeker van te zijn dat geen enkele
thread met deze klasse "gebrek lijdt" d.w.z. geen processor tijd krijgt.
- "Foreground server priority" (4) is de tweede hoogste prioriteitsklasse
voor threads die niet willen worden be‹nvloed door de dynamische prioriteitsvariaties die
op "vaste" klasse typen worden uitgevoerd.
Merk op dat zelfs al heeft deze klasse de waarde 4, tijd kritische threads de prioriteit
overnemen van threads uit deze klasse. &os2; doet toch enige prioriteitsvariaties met
deze klasse gebaseerd op de activiteit van de thread en het systeem.
- "Time-critical priority" (3) is de hoogste prioriteitsklasse in &os2;.
Een thread met een tijd kritische prioriteit zal onmiddellijk processor tijd krijgen en
zal niet worden onderbroken totdat zijn werk klaar is.
Veel apparatuur stuurprogramma's zullen de CPU alleen maar afstaan aan threads met deze
prioriteitsklasse.
Zo'n thread moet alleen maar de kortst mogelijke CPU tijd gebruiken omdat hij niet
onderbroken kan worden (behoudens door andere tijd-kritische threads) en kan eenvoudig
het systeem laten 'hangen'.
Zelfs als het de CPU afstaat via DosSleep(0) (zie de documentatie voor
DosSleep
in de Toolkit documentatie *),
zullen andere niet tijd kritische threads niet lopen.
Deze klasse wordt daarom normaliter alleen maar gebruikt voor netwerk- en andere
communicatie- of CD-writer- en andere multimedia programmatuur.
Binnen iedere prioriteitsklasse kan een thread een prioriteitsniveau instellen.
Dit is een waarde tussen 0 en +31 die de voorrang aangeeft van een thread binnen een
prioriteitsklasse en waar alleen maar rekening mee gehouden wordt als twee threads van dezelfde
prioriteitsklasse met elkaar wedijveren.
Een paar voorbeelden:
- een "vaste" thread met een prioriteitswaarde van +31 overtreft een "vaste"
thread met prioriteitswaarde 0.
Binnen de "regular priority" klasse echter zorgt &os2; ervoor dat geen thread
"gebrek lijdt", d.w.z. nooit processor tijd krijgt, door dynamisch de prioriteit van
threads automatisch na verloop van tijd te verhogen. Deze tijdsperiode wordt ingesteld
door de MAXWAIT &cfgsys; instelling.
Bovendien verhoogt &os2; de prioriteit van een thread tijdelijk als het invoer van het
toetsenbord moet ontvangen, als het proces of de thread op de voorgrond lopen of als
de thread op dit moment I/O aan het uitvoeren is.
Deze dynamische afregelingen worden alleen dan uitgevoerd als de &cfgsys; niet de opdracht
PRIORITY=ABSOLUTE bevat, die niet wordt aanbevolen.
(Daarom zult u deze instelling niet in het
"&os2; Kernel" object vinden.)
- Een "tijd kritische" thread met prioriteits waarde 0 overtreft nog steeds een
"vaste" thread met prioriteitswaarde +31 omdat die behoort tot een hogere prioriteits
klasse. In dit geval hebben de dynamische prioriteitsaanpassingen geen invloed, omdat zij
alleen betrekking hebben op de uitvoer van "vaste" threads. Terwijl de tijd kritische
thread loopt, lijden alle "vaste" threads gebrek.
- Hetzelfde geldt, b.v., voor een "vaste thread" met prioriteits waarde 0 en een
"wachttijd" thread met prioriteits waarde +31.
- Twee threads echter met precies dezelfde prioriteit lopen "tegen" elkaar,
d.w.z. &os2; bewaakt een alternatief CPU eigendom tussen hen.