Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

Introduktion till operativsystem

Hej Habr! Jag skulle vilja uppmÀrksamma dig pÄ en serie artiklar-översÀttningar av en intressant litteratur enligt min mening - OSTEP. Detta material diskuterar ganska djupt arbetet med unix-liknande operativsystem, nÀmligen arbete med processer, olika schemalÀggare, minne och andra liknande komponenter som utgör ett modernt operativsystem. Du kan se originalet av allt material hÀr hÀr. Observera att översÀttningen gjordes oprofessionellt (ganska fritt), men jag hoppas att jag behöll den allmÀnna innebörden.

Labbarbete i detta Àmne finns hÀr:

Övriga delar:

Du kan ocksÄ kolla in min kanal pÄ telegram =)

Planering: Feedbackkö pÄ flera nivÄer

I den hÀr förelÀsningen kommer vi att prata om problemen med att utveckla ett av de mest kÀnda tillvÀgagÄngssÀtten
planering, som kallas Feedbackkö pÄ flera nivÄer (MLFQ). MLFQ-schemalÀggaren beskrevs första gÄngen 1962 av Fernando J. Corbató i ett system som heter
Kompatibelt tidsdelningssystem (CTSS). Dessa verk (inklusive senare arbete pÄ
Multics) nominerades dÀrefter till Turing Award. Planeraren var
förbÀttrades dÀrefter och fick det utseende som redan finns i
nÄgra moderna system.

MLFQ-algoritmen försöker lösa tvÄ grundlÀggande överlappande problem.
Först, försöker den optimera omloppstiden, som, som vi diskuterade i föregÄende förelÀsning, Àr optimerad av metoden att börja i början av kön mest
korta uppgifter. Men operativsystemet vet inte hur lÀnge en viss process kommer att köra, och detta
nödvÀndig kunskap för driften av SJF, STCF-algoritmerna. Andra, MLFQ försöker
gör systemet responsivt för anvÀndare (till exempel för de som sitter och
stirra pÄ skÀrmen i vÀntan pÄ att uppgiften ska slutföras) och pÄ sÄ sÀtt minimera tiden
svar. TyvÀrr förbÀttrar algoritmer som RR svarstiden, men extremt
har en dÄlig inverkan pÄ handlÀggningstidsmÄttet. DÀrav vÄrt problem: Hur man designar
en schemalÀggare som kommer att uppfylla vÄra krav utan att veta nÄgot om
processens karaktÀr i allmÀnhet? Hur kan schemalÀggaren lÀra sig egenskaperna hos uppgifter,
som den lanserar och dÀrmed fatta bÀttre planeringsbeslut?

KÀrnan i problemet: Hur man planerar instÀllningen av uppgifter utan perfekt kunskap?
Hur man designar en schemalÀggare som samtidigt minimerar svarstiden
för interaktiva uppgifter och samtidigt minimerar handlÀggningstiden utan att veta
kunskap om uppgiftens genomförandetid?

Obs: vi lÀr oss av tidigare hÀndelser

MLFQ-kön Àr ett utmÀrkt exempel pÄ ett system som lÀr sig av
tidigare hÀndelser för att förutsÀga framtiden. Liknande tillvÀgagÄngssÀtt Àr ofta
finns i OS (Och mÄnga andra grenar av datavetenskap, inklusive grenar
hÄrdvaruförutsÀgelser och cachningsalgoritmer). Liknande resor
utlöses nÀr uppgifter har beteendefaser och Àr dÀrmed förutsÀgbara.
Du bör dock vara försiktig med denna teknik eftersom förutsÀgelser Àr mycket enkla
kan visa sig vara felaktiga och leda till att systemet tar sÀmre beslut Àn
skulle vara utan kunskap alls.

MLFQ: GrundlÀggande regler

LÄt oss titta pÄ de grundlÀggande reglerna för MLFQ-algoritmen. Och Àven om implementeringar av denna algoritm
Det finns flera, de grundlÀggande tillvÀgagÄngssÀtten Àr likartade.
I implementeringen vi kommer att titta pÄ kommer MLFQ att ha flera
separata köer, som var och en har olika prioritet. NÀr som helst,
en uppgift redo att utföras finns i en kö. MLFQ anvÀnder prioriteringar,
att bestÀmma vilken uppgift som ska köras för utförande, d.v.s. uppgift med högre
prioritet (uppgift frÄn kön med högst prioritet) kommer att startas först
kö.
Naturligtvis kan det finnas mer Àn en uppgift i en given kö, sÄ
sÄ de kommer att ha samma prioritet. I det hÀr fallet kommer mekanismen att anvÀndas
RR för att schemalÀgga en körning bland dessa uppgifter.
SÄ vi kommer fram till tvÄ grundlÀggande regler för MLFQ:

  • Regel 1: Om prioritet(A) > Prioritet(B) kommer uppgift A att startas (B kommer inte)
  • Regel 2: Om prioritet(A) = Prioritet(B), startas A&B med RR

Baserat pÄ ovanstÄende, nyckelelementen för att planera MLFQ
Àr prioriteringar. IstÀllet för att ge en fast prioritet till var och en
uppgift Àndrar MLFQ sin prioritet beroende pÄ det observerade beteendet.
Till exempel, om en uppgift stÀndigt kastar arbete pÄ processorn medan den vÀntar pÄ tangentbordsinmatning,
MLFQ kommer att hÄlla processprioritet hög eftersom det Àr sÄ
en interaktiv process ska fungera. Om, tvÀrtom, uppgiften Àr stÀndigt och
anvÀnder CPU mycket under en lÄng period, kommer MLFQ att sÀnka den
en prioritet. SÄledes kommer MLFQ att studera beteendet hos processer medan de körs
och anvÀnda beteenden.
LÄt oss rita ett exempel pÄ hur köerna kan se ut nÄgon gÄng
tid och dÄ fÄr du nÄgot sÄnt hÀr:
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

I detta schema Àr 2 processer A och B i högsta prioritetskön. Bearbeta
C Àr nÄgonstans i mitten, och process D Àr i slutet av kön. Enligt ovanstÄende
Enligt beskrivningarna av MLFQ-algoritmen kommer schemalÀggaren att utföra uppgifter endast med den högsta
prioritet enligt RR, och arbetsuppgifter C, D kommer att vara arbetslösa.
Naturligtvis kommer en statisk ögonblicksbild inte att ge en fullstÀndig bild av hur MLFQ fungerar.
Det Àr viktigt att förstÄ exakt hur bilden förÀndras över tid.

Försök 1: Hur man Àndrar prioritet

Vid det hÀr laget mÄste du bestÀmma hur MLFQ ska Àndra prioritetsnivÄn
uppgifter (och dÀrmed uppgiftens position i kön) nÀr den fortskrider genom sin livscykel. För
detta Àr nödvÀndigt för att komma ihÄg arbetsflödet: en viss mÀngd
interaktiva uppgifter med korta körtider (och dÀrmed frekventa slÀpp
CPU) och flera lÄngvariga uppgifter som anvÀnder processorn hela sin arbetstid, medan
Svarstiden Àr inte viktig för sÄdana uppgifter. Och pÄ sÄ sÀtt kan du göra ditt första försök
implementera MLFQ-algoritmen med följande regler:

  • Regel 3: NĂ€r en uppgift kommer in i systemet placeras den i kön med högst
  • prioritet.
  • Regel 4a: Om en uppgift anvĂ€nder hela det tidsfönster som tilldelats den, dĂ„
  • prioritet minskas.
  • Regel 4b: Om en uppgift slĂ€pper CPU:n innan dess tidsfönster löper ut, dĂ„
  • förblir med samma prioritet.

Exempel 1: Enstaka lÄngvarig uppgift

Som framgÄr av detta exempel Àr antagningsuppgiften satt med den högsta
prioritet. Efter ett tidsfönster pÄ 10 ms degraderas processen i prioritet
planerare. Efter nÀsta tidsfönster degraderas uppgiften slutligen till
lÀgsta prioritet i systemet, dÀr det finns kvar.
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

Exempel 2: Levererade en kort uppgift

LÄt oss nu se ett exempel pÄ hur MLFQ kommer att försöka nÀrma sig SJF. I den
till exempel tvÄ uppgifter: A, som Àr en lÄngvarig uppgift konstant
upptar CPU och B, vilket Àr en kort interaktiv uppgift. Anta
att A redan hade arbetat en tid nÀr uppgift B kom.
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

Denna graf visar resultatet av scenariot. Uppgift A, som vilken uppgift som helst,
CPU-anvÀndningen var i botten. Uppgift B kommer att anlÀnda vid tidpunkten T=100 och kommer
placeras i högsta prioritetskön. Eftersom dess drifttid Àr kort alltsÄ
den kommer att slutföras innan den nÄr den sista kön.

FrÄn detta exempel bör algoritmens huvudmÄl förstÄs: eftersom algoritmen inte gör det
vet om en uppgift Àr lÄng eller kort, dÄ antar han först och frÀmst att uppgiften
kort och ger den högsta prioritet. Om det hÀr Àr en riktigt kort uppgift, alltsÄ
det kommer att slutföras snabbt, annars kommer det att gÄ lÄngsamt om det Àr en lÄng uppgift
prioritet ner och kommer snart att bevisa att hon verkligen Àr en lÄng uppgift som inte gör det
krÀver ett svar.

Exempel 3: Hur Àr det med I/O?

LÄt oss nu titta pÄ ett I/O-exempel. Som framgÄr av regel 4b,
om en process slÀpper processorn utan att anvÀnda all dess processortid,
dÄ förblir den pÄ samma prioritetsnivÄ. Avsikten med denna regel Àr ganska enkel
- om det interaktiva jobbet utför mÄnga I/O-operationer, till exempel att vÀnta
frÄn anvÀndartangenten eller musen, kommer en sÄdan uppgift att frigöra processorn
före det tilldelade fönstret. Vi skulle inte vilja sÀnka prioritet för en sÄdan uppgift,
och dÀrmed kommer den att förbli pÄ samma nivÄ.
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

Det hÀr exemplet visar hur algoritmen kommer att fungera med sÄdana processer - interaktivt jobb B, som bara behöver CPU i 1 ms innan det körs
I/O-process och lÄngvarigt jobb A, som Àgnar all sin tid Ät att anvÀnda processorn.
MLFQ hÄller process B pÄ högsta prioritet eftersom den fortsÀtter
slÀpp processorn. Om B Àr en interaktiv uppgift, har algoritmen uppnÄtts
Ditt mÄl Àr att köra interaktiva uppgifter snabbt.

Problem med den nuvarande MLFQ-algoritmen

I de tidigare exemplen byggde vi en grundlÀggande version av MLFQ. Och det verkar som att han
gör sitt jobb bra och Àrligt och fördelar CPU-tiden rÀttvist mellan dem
lÄnga uppgifter och tillÄter korta eller stora uppgifter
arbeta med I/O snabbt. TyvÀrr innehÄller detta tillvÀgagÄngssÀtt flera
allvarliga problem.
Först, problemet med hunger: om systemet har mÄnga interaktiva
uppgifter, dÄ kommer de att förbruka all processortid och dÀrmed inte en enda pÄ lÀnge
uppgiften kommer inte att kunna utföras (de svÀlter).

Andra, kunde smarta anvÀndare skriva sina program sÄ att
lura schemalÀggaren. BedrÀgeri ligger i att göra nÄgot för att tvinga
SchemalÀggaren ger processen mer CPU-tid. Algoritmen det
som beskrivs ovan Àr ganska sÄrbar för liknande attacker: innan tidsfönstret Àr praktiskt taget
avslutat mÄste du utföra en I/O-operation (för vissa, oavsett vilken fil)
och dÀrmed frigöra processorn. SÄdant beteende kommer att tillÄta dig att förbli i samma sak
sjÀlva kön och Äterigen fÄ en större andel av CPU-tiden. Om du gör
detta Àr korrekt (exekvera till exempel 99 % av fönstertiden innan du slÀpper processorn),
en sÄdan uppgift kan helt enkelt monopolisera processorn.

Slutligen kan ett program Àndra sitt beteende över tid. De uppgifterna
som anvÀnde processorn kan bli interaktiv. I vÄrt exempel, liknande
uppgifter kommer inte att fÄ den behandling de förtjÀnar frÄn schemalÀggaren som andra skulle göra
(inledande) interaktiva uppgifter.

FrÄga till publiken: vilka attacker mot schemalÀggaren skulle kunna utföras i den moderna vÀrlden?

Försök 2: Ökad prioritet

LÄt oss försöka Àndra reglerna och se om vi kan undvika problem med
fasta. Vad kan vi göra för att sÀkerstÀlla att relaterade
CPU-uppgifter kommer att fÄ sin tid (Àven om inte lÄng).
Som en enkel lösning pÄ problemet kan du föreslÄ med jÀmna mellanrum
prioritera alla sÄdana uppgifter i systemet. Det finns mÄnga sÀtt
För att uppnÄ detta, lÄt oss försöka implementera nÄgot enkelt som ett exempel: översÀtt
alla uppgifter ges omedelbart högsta prioritet, dÀrav den nya regeln:

  • Rule5: Efter en viss period S, flytta alla uppgifter i systemet till den högsta kön.

VÄr nya regel löser tvÄ problem samtidigt. Först, processerna
kommer garanterat inte att svÀlta: uppgifter som har högsta prioritet kommer att delas upp
CPU-tid enligt RR-algoritmen och dÀrmed alla processer kommer att ta emot
CPU-tid. För det andra, om nÄgon process som tidigare anvÀnts
endast processorn blir interaktiv, den förblir i kön med den högsta
prioritet efter att ha fÄtt en engÄngsökning av prioritet till den högsta.
LÄt oss titta pÄ ett exempel. I det hÀr scenariot, övervÀg en process som anvÀnder
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

CPU och tvÄ interaktiva, korta processer. Till vÀnster i figuren visar figuren beteendet utan prioriterad befordran, och dÀrmed börjar den lÄngvariga uppgiften svÀlta efter att tvÄ interaktiva uppgifter kommit in i systemet. I figuren till höger utförs en prioritetsökning var 50:e ms och dÀrmed Àr alla processer garanterade att fÄ CPU-tid och kommer att startas med jÀmna mellanrum. 50ms i det hÀr fallet tas som ett exempel, i verkligheten Àr detta nummer nÄgot högre.
Uppenbarligen, att lÀgga till den periodiska ökningstiden S leder till
en logisk frÄga: vilket vÀrde ska stÀllas in? En av de hedrade
systemingenjörer John Ousterhout kallade sÄdana kvantiteter i system som voo-doo
konstant, eftersom de pÄ nÄgot sÀtt krÀvde svart magi för korrekt
stÀller ut. Och tyvÀrr har S en sÄdan doft. Om du stÀller in vÀrdet ocksÄ
stora - lÄnga uppgifter kommer att börja svÀlta. Och om du stÀller in vÀrdet för lÄgt,
Interaktiva uppgifter kommer inte att fÄ korrekt CPU-tid.

Försök 3: BÀttre bokföring

Nu har vi ett annat problem att lösa: hur inte
lÄta vÄr schemalÀggare luras? MÀnniskorna att skylla pÄ denna möjlighet Àr
reglerna 4a, 4b, som tillÄter ett jobb att behÄlla prioritet, vilket frigör processorn
innan den utsatta tiden gÄr ut. Hur ska man hantera detta?
Lösningen i detta fall kan betraktas som en bÀttre redovisning av CPU-tid pÄ varje
MLFQ nivÄ. IstÀllet för att glömma tiden programmet anvÀnde
processor för den tilldelade perioden, bör den beaktas och sparas. Efter
processen har förbrukat sin tilldelade tid bör den flyttas ned till nÀsta
prioritetsnivÄ. Nu spelar det ingen roll hur processen kommer att anvÀnda sin tid - hur
stÀndigt berÀkna pÄ processorn eller som ett antal samtal. SÄledes,
regel 4 bör skrivas om till följande form:

  • Rule4: Efter att en uppgift har förbrukat sin tilldelade tid i den aktuella kön (oavsett hur mĂ„nga gĂ„nger den frigjorde processorn), sĂ€nks prioritet för den uppgiften (den flyttas ner i kön).

LÄt oss titta pÄ ett exempel:
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)»

Bilden visar vad som hÀnder om du försöker lura schemalÀggaren, som
om det var med de tidigare reglerna 4a, 4b skulle resultatet till vÀnster erhÄllas. Gott nytt
regeln Àr resultatet till höger. Innan skyddet kan vilken process som helst anropa I/O innan den Àr klar och
dominerar alltsÄ CPU:n, efter att ha aktiverat skydd, oavsett beteende
I/O kommer han fortfarande att flytta ner i kön och kommer dÀrmed inte att kunna oÀrligt
ta över CPU-resurser.

FörbÀttra MLFQ och andra problem

Med ovanstÄende förbÀttringar kommer nya problem: ett av de största
FrÄgor - hur parametriserar man en sÄdan schemalÀggare? De dÀr. Hur mycket ska det vara
köer? Vad ska storleken pÄ programfönstret vara i kön? Hur
Programprioritet bör ofta ökas för att undvika svÀlt och
ta hÀnsyn till förÀndringen i programmets beteende? Det finns inget enkelt svar pÄ dessa frÄgor
svar och endast experiment med laster och efterföljande konfiguration
planerare kan leda till en tillfredsstÀllande balans.

Till exempel tillÄter de flesta MLFQ-implementeringar dig att tilldela olika
tidsintervall för olika köer. Högprioriterade köer vanligtvis
korta intervaller föreskrivs. Dessa köer bestÄr av interaktiva uppgifter,
vÀxla mellan vilket Àr ganska kÀnsligt och bör ta 10 eller mindre
Fröken. DÀremot bestÄr lÄgprioriterade köer av lÄngvariga uppgifter som anvÀnder
CPU. Och i det hÀr fallet passar lÄnga tidsintervall vÀldigt bra (100ms).
Operativsystem: Tre enkla delar. Del 5: Planering: Feedbackkö pÄ flera nivÄer (översÀttning)

I det hÀr exemplet finns det 2 uppgifter som fungerade i högprioritetskö 20
ms, uppdelat i 10ms fönster. 40 ms i mellankö (20 ms fönster) och i lÄg prioritet
Kötidsfönstret blev 40ms dÀr uppgifterna avslutade sitt arbete.

Solaris OS-implementeringen av MLFQ Àr en klass av tidsdelningsschemalÀggare.
Planeraren kommer att tillhandahÄlla en uppsÀttning tabeller som definierar exakt som den ska
prioriteringen av processen förÀndras under dess livstid, vad bör vara storleken
tilldelat fönster och hur ofta du behöver höja uppgiftens prioriteringar. Administratör
system kan interagera med den hÀr tabellen och fÄ schemalÀggaren att fungera
annorlunda. Som standard har denna tabell 60 köer med en gradvis ökning
fönsterstorlek frÄn 20 ms (hög prioritet) till flera hundra ms (lÄg prioritet), och
ocksÄ med en boost av alla uppgifter en gÄng per sekund.

Andra MLFQ-planerare anvÀnder inte en tabell eller nÄgot specifikt
regler som beskrivs i denna förelÀsning, tvÀrtom, de berÀknar prioriteringar med hjÀlp av
matematiska formler. Till exempel anvÀnder FreeBSD-schemalÀggaren en formel för
berÀkna aktuell prioritet för en uppgift baserat pÄ hur lÄng processen Àr
anvÀnd CPU. Dessutom avtar CPU-anvÀndningen med tiden, och sÄ
AlltsÄ sker en ökad prioritet nÄgot annorlunda Àn vad som beskrivits ovan. Detta Àr sant
kallas förfallsalgoritmer. Sedan version 7.1 har FreeBSD anvÀnt ULE-schemalÀggaren.

Slutligen har mÄnga schemalÀggare andra funktioner. Till exempel nÄgra
schemalÀggare reserverar de högsta nivÄerna för driften av operativsystemet och dÀrmed
SÄledes kan ingen anvÀndarprocess fÄ högsta prioritet i
systemet. Vissa system lÄter dig ge rÄd för att hjÀlpa
planeraren kan prioritera korrekt. Till exempel genom att anvÀnda kommandot trevligt
du kan öka eller minska en uppgifts prioritet och dÀrmed öka eller
minska programmets chanser att anvÀnda CPU-tid.

MLFQ: Sammanfattning

Vi har beskrivit en planeringsmetod som kallas MLFQ. Hans namn
innesluten i driftprincipen - den har flera köer och anvÀnder feedback
för att bestÀmma uppgiftens prioritet.
Den slutliga formen av reglerna kommer att vara följande:

  • Rule1: Om prioritet(A) > Prioritet(B) kommer uppgift A att startas (B kommer inte)
  • Rule2: Om prioritet(A) = Prioritet(B), startas A&B med RR
  • Rule3: NĂ€r en uppgift kommer in i systemet placeras den i högsta prioritetskön.
  • Rule4: Efter att en uppgift har förbrukat sin tilldelade tid i den aktuella kön (oavsett hur mĂ„nga gĂ„nger den frigjorde processorn), sĂ€nks prioritet för den uppgiften (den flyttas ner i kön).
  • Rule5: Efter en viss period S, flytta alla uppgifter i systemet till den högsta kön.

MLFQ Àr intressant av följande anledning - istÀllet för att krÀva kunskap om
uppgiftens karaktÀr i förvÀg studerar algoritmen det tidigare beteendet för uppgiften och uppsÀttningarna
prioriteringar i enlighet med detta. SÄledes försöker han sitta pÄ tvÄ stolar samtidigt - för att uppnÄ produktivitet för smÄ uppgifter (SJF, STCF) och för att Àrligt springa lÄngt,
CPU-laddningsjobb. DÀrför har mÄnga system, inklusive BSD och deras derivat,
Solaris, Windows, Mac anvÀnder nÄgon form av algoritm som schemalÀggare
MLFQ som baslinje.

Ytterligare material:

  1. manpages.debian.org/stretch/manpages/sched.7.en.html
  2. en.wikipedia.org/wiki/Scheduling_(Computing)
  3. pages.lip6.fr/Julia.Lawall/atc18-bouron.pdf
  4. www.usenix.org/legacy/event/bsdcon03/tech/full_papers/roberson/roberson.pdf
  5. chebykin.org/freebsd-process-scheduling

KĂ€lla: will.com