windows - OS tråd planlægning og cpu brug relationer

Indlæg af Hanne Mølgaard Plasc

Problem



Som jeg ved, for Linux-planlægning implementerer Linux en retfærdig planlægning, og Windows implementerer Round-robin (RR) -planlæggerne: hver tråd har en tidsskive til dens udførelse (korrigér mig, hvis jeg er forkert).


Jeg undrer mig over, er CPU-brugen relateret til trådplanlægningen?


For eksempel: Der er 2 tråde udført på samme tid, og tidsskiven for systemet er 15ms. CPU'en har kun 1 kerne.


Tråd A kræver 10ms for at afslutte jobbet og derefter sove 5ms, løbe i en loop.


Tråd B har 5ms til at afslutte jobbet og derefter sove 10ms, også i en løkke.



  1. Vil CPU-brugen være 100\%?

  2. Hvordan er tråden planlagt? Vil tråd A bruge hele tiden og derefter planlægge?



Et andet scenario:
Hvis jeg fik en tråd A kører, bliver den så blokeret af en tilstand (f.eks. Netværk). Vil CPU'en ved 100\% påvirke wakeup-tiden for denne tråd? For eksempel kan en tråd B køre i dette tidsvindue, vil tråden A blive forudindtaget af operativsystemet?

Bedste reference



  Så CPU forbruget vil være 100\%?



Ideelt tale, svaret ville være ja, og ideelt set mener jeg, at du ikke overvejer at tiden er spildt ved at udføre en kontekstkontakt . Praktisk set øges CPU-udnyttelsen ved at holde det travlt hele tiden, men der er stadig en vis tid, der er spildt ved at lave en kontekstomskifter (den tid det tager at skifte fra en proces eller tråd til en anden). [1]


Men jeg vil sige, at tidsbegrænsningerne for begge tråde i dit tilfælde er perfekt tilpasset for at have maksimal CPU-udnyttelse.



  Og hvordan er tråden planlagt? Vil tråd A bruge hele sin tid og
  derefter planlægge?



Nå det afhænger virkelig, i de fleste moderne operativsystem implementeringer, hvis der er en anden proces i klar køen, er den aktuelle proces planlagt, så snart den er færdig med CPU, uanset om det stadig har tidskvantum tilbage. Så ja, hvis du overvejer et moderne OS design, er tråden A planlagt lige efter 10ms.

Andre referencer 1



  Som jeg ved, implementerer Linux en fair scheduler og Windows System
  implementerer Round-Robin (RR) planlæggere til tråde planlægning,



Både Linux og Windows bruger prioritetsbaserede, preemptive thread schedulers. Fairness betyder noget, men det er ikke strengt taget målet. Præcis hvordan denne planlægger arbejder afhænger af versionen og smagen (klienten vs. serveren) af systemet. Generelt er trådplanlæggere designet til at maksimere responsivitet og lindre planlægningsfarer som inversion og sult. Selv om nogle planlægningsbeslutninger er lavet i runde robin mode, er der situationer, hvor scheduleren kan indsætte den forudlagte tråd foran i køen snarere end bagpå.



  hver tråd har et tidsskive til dets udførelse.



Tidsskiven (eller kvantet) er virkelig mere som en retningslinje end en regel. Det er vigtigt at forstå, at et tidsskive er deleligt, og det svarer til nogle variable antal urcyklusser. Planlæggeren opkræver CPU-brug i form af urcykler, ikke tidsskiver. En tråd kan løbe for mere end et tidsskive (f.eks. et tidsskive og en halv). En tråd kan også frivilligt afstå resten af ​​sin tidsskive. Dette er muligt, fordi den eneste måde, hvorpå en tråd kan opgive sin tidsskive, er ved at udføre et systemopkald (søvn, udbytte, erhverve lås, anmode om synkron I/O). Alle disse er privilegerede operationer, der ikke kan udføres i bruger-tilstand (ellers kan en tråd gå i seng uden at fortælle OS!). Planlæggeren kan ændre trådens tilstand fra 'klar' at 'vente' og planlægge en anden klar tråd til at løbe. Hvis en tråd afstår resten af ​​sin tidsskive, kompenseres den ikke næste gang det er planlagt at køre.


Et særligt interessant tilfælde er, når der opstår en hardwareafbrydelse, mens en tråd kører. I dette tilfælde skifter processoren automatisk til afbryderhåndtereren, idet han forcibly forbereder tråden, selvom tidsskærmen endnu ikke er færdig. I dette tilfælde bliver tråden ikke opladet for den tid, det tager at håndtere afbrydelsen. Bemærk, at afbryderhåndtereren rent faktisk vil udnytte CPU'en. Forresten er overhead af kontekst, der skifter i sig selv, heller ikke ladet over for ethvert tidsskive. Derudover påvirker den omstændighed, at en tråd kører i bruger-tilstand eller kernel-tilstand i sig selv ikke i Windows, på dets prioritet eller tidsskive. På Linux kaldes planlæggeren på bestemte steder i kernen for at undgå sult (kernelprævention implementeret i Linux 2.5+).



  Så CPU forbruget vil være 100\%? Og hvordan er tråden planlagt? Vilje
  tråd A bruge hele tiden og så planlægge?



Det er nemt at besvare disse spørgsmål nu. Når en tråd går i seng, bliver den anden planlagt. Bemærk at dette sker selvom trådene har forskellige prioriteter.



  Hvis jeg fik en tråd kørende, og blokeret af nogle
  tilstand (fx netværk). Vil CPU 100\% påvirke wakeup-tiden
  af denne tråd? For eksempel kan en anden tråd køre i sin tid
  vindue og vil ikke planlægge af OS?



Linux- og Windows-planlæggere implementerer teknikker til at muliggøre tråde, der venter på I/O-operationer til at 'vågne op hurtigt' og få større chancer for at blive planlagt snart. For eksempel kan i Windows prioriteringen af ​​en tråd, der venter på en I/O-operation, øges lidt, når I/O-operationen fuldendes. Det betyder, at det kan preempt en anden løbende tråd inden afslutningen af ​​sin tidsskive, selvom begge tråde oprindeligt havde de samme prioriteter. Når en tråd med forstærket prioritet vågner op, genoprettes den oprindelige prioritet.