Processkonfliktomfattning
Process Contention Scope är ett av de två grundläggande sätten att schemalägga trådar. Båda är: processlokal schemaläggning (känd som Process Contention Scope, eller Unbound Threads - Many-to-Many-modellen) och system global scheduling (känd som System Contention Scope, eller Bound Threads - One-to-One- modellen ) . Dessa schemaläggningsklasser är kända som schemaläggningskonfliktomfånget och definieras endast i POSIX . Schemaläggning av processkonfliktomfång innebär att all schemaläggningsmekanism för tråden är lokal för processen – trådens bibliotek har full kontroll över vilken tråd som ska schemaläggas på en LWP . Detta innebär också användningen av antingen Many-to-One eller Many-to-Many-modellen.
Typer av PCS-schemaläggning
PCS-schemaläggning görs av trådbiblioteket. Biblioteket väljer vilken obunden tråd som ska läggas på vilken LWP. Schemaläggningen av LWP är (naturligtvis) fortfarande global och oberoende av den lokala schemaläggningen. Även om detta betyder att obundna trådar är föremål för en sorts rolig schemaläggningsarkitektur i två nivåer, kan du i praktiken ignorera schemaläggningen av LWP och enbart hantera den lokala schemaläggningsalgoritmen. Det finns fyra sätt att få en aktiv tråd (säg T1) att byta kontext. Tre av dem kräver att programmeraren har skrivit kod. Dessa metoder är i stort sett identiska i alla bibliotek.
- Synkronisering . Det i särklass vanligaste sättet att bli kontextväxlad (en vild generalisering) är att T1 begär ett mutex-lås och inte får det. Om låset redan hålls av T2, kommer T1 att placeras i vilokön, i väntan på låset, vilket gör att en annan tråd kan köras.
- Preemption . En löpande tråd (T6) gör något som gör att en tråd med högre prioritet (T2) blir körbar. I det fallet kommer den aktiva tråden med lägst prioritet (T1) att förekomma, och T2 kommer att ta sin plats på LWP. Sätten att få detta att hända inkluderar att släppa ett lås, ändra prioritetsnivån för T2 uppåt eller för T1 nedåt.
- Ge efter . Om programmeraren lägger ett explicit anrop till sched_yield() i koden som T1 kör, kommer schemaläggaren att se om det finns en annan körbar tråd (T2) med samma prioritet (det kan inte finnas en körbar tråd med högre prioritet ). Om det finns en så kommer den att schemaläggas. Om det inte finns en så fortsätter T1 att köras.
- Tidskivning . Om leverantörens PCS tillåter tidsdelning (som Digital UNIX, till skillnad från Solaris), kan T1 helt enkelt få sin tidsdel slut och T2 (på samma prioritetsnivå) får då en tidsdel.
Genomförande
Schemaläggaren för PCS-trådar har en mycket enkel algoritm för att bestämma vilken tråd som ska köras. Varje tråd har ett prioritetsnummer kopplat till sig. De körbara trådarna med högst prioritet får löpa. Dessa prioriteringar justeras inte av trådbiblioteket. Det enda sättet de ändras är om programmeraren skriver ett explicit anrop till thread_setschedparam(). Denna prioritet är ett heltal i C. Vi ger dig inga råd om hur du väljer värdet, eftersom vi upptäcker att vi själva inte använder det mycket. Det gör du förmodligen inte heller. Den naturliga konsekvensen av ovanstående diskussion om schemaläggning är förekomsten av fyra schemaläggningstillstånd för trådar. En tråd kan vara i något av följande tillstånd:
- Aktiv : Det betyder att den är på en LWP 5 .
- Runnable : Det betyder att den är redo att köras, men det finns helt enkelt inte tillräckligt med LWP för att den ska få en. Den kommer att finnas kvar tills en aktiv tråd förlorar sin LWP eller tills en ny LWP skapas.
- Sova : Betyder att den väntar på en synkroniseringsvariabel.
- Stoppad (inte i POSIX) : Betyder att ett anrop till avstängningsfunktionen har gjorts. Den kommer att förbli i detta tillstånd tills en annan tråd anropar fortsätt-funktionen på den.
- Zombie : Det betyder att det är en död tråd och väntar på att dess resurser ska samlas in. (Detta är inte ett tillstånd som användaren känner igen, även om det kan visas i felsökningsprogrammet.)