Vene Föderatsiooni transpordiministeerium

Föderaalne agentuur raudteetransport

GOU VPO "DVGUPS"

Osakond: " Infotehnoloogia ja süsteemid"

KURSUSETÖÖ

teemal: "Protsessihalduse allsüsteem"

Lõpetanud: Sholkov I.D.

rühm 230

Kontrollis: Reshetnikova O.V.

Habarovsk 2010

Sissejuhatus

1. Programmi kirjeldus

1.1 Funktsionaalne otstarve

1.2 Tehnilised vahendid, mida kasutatakse programmi loomisel

1.3 Mitmelõimeline ja multitöötlus

1.4 Lõime ja protsessi prioriteedid

1.5 Lõimede sünkroonimise viisid

1.3 Programmi loogiline ülesehitus

2. Programmi kasutamise juhend

2.1 Programmi üldinfo ja eesmärk

2.2 Graafiline liides

2.3 Programmiga töötamine

2.4 Programmi ProcessManager põhiomadused

Järeldus

Bibliograafia

C# toetab paralleelkoodi täitmist mitme lõimega. Lõim on sõltumatu täitmistee, mida saab käivitada samaaegselt teiste lõimedega.

C#-programm töötab ühe lõimena, mille loovad automaatselt CLR ja operatsioonisüsteem ("peamine" lõim) ja muutub mitmelõimeliseks, luues täiendavaid lõime.

Multithreadingut haldab lõime planeerija – funktsioon, mille CLR tavaliselt operatsioonisüsteemile delegeerib. Lõimede ajakava tagab, et aktiivsetele lõimedele antakse täitmiseks sobiv aeg ja et ootel või blokeeritud lõimed (nt ootavad eksklusiivset lukku või kasutaja sisendit) ei tarbi protsessori aega.

Ühe protsessoriga arvutites kasutab lõime ajakava ajalõikamist – lülitub kiiresti iga aktiivse lõime täitmise vahel. See toob kaasa ettearvamatu käitumise, nagu esimeses näites, kus iga tähemärkide jada "X" ja "Y" vastab lõimele eraldatud ajalõikele. Windows XP puhul valitakse tüüpiline ajakvantväärtus – kümned millisekundid – palju suuremaks kui protsessori kulu lõimede vahel konteksti vahetamisel (mitu mikrosekundit).

Mitme protsessoriga arvutites rakendatakse mitme lõimega töötlemist ajalõikamise ja tõelise paralleelsuse seguna, kus erinevad lõimed täidavad koodi erinevatel protsessoritel. Ajalõikuse vajadus jääb endiselt alles, kuna operatsioonisüsteem peab teenindama nii oma lõime kui ka teiste rakenduste lõime.

Lõime kohta öeldakse, et see on ennetatud, kui selle täitmine on peatatud välised tegurid aja lõikamise tüüp. Enamikul juhtudel ei saa lõim kontrollida, millal ja kus seda ennetatakse.

Kõik ühe rakenduse lõimed sisalduvad loogiliselt protsessis – operatsioonisüsteemi moodulis, milles rakendus käivitatakse.

Mõnes mõttes on lõimed ja protsessid sarnased – näiteks jagatakse aega samas arvutis töötavate protsesside vahel, nii nagu seda jagatakse sama C# rakenduse lõimede vahel. Peamine erinevus on see, et protsessid on üksteisest täielikult isoleeritud. Lõimed jagavad mälu (kuhja) teiste sama rakenduse lõimedega. See võimaldab ühel lõimel taustal andmeid esitada, samas kui teine ​​lõim kuvab andmeid saabumisel.

Atribuut Priority määrab, kui palju täitmisaega eraldatakse lõimele võrreldes teiste sama protsessi lõimedega. Lõime prioriteedil on 5 gradatsiooni: enum ThreadPriority ( madalaim, alla normaalse, tavaline, üle normaalse, kõrgeim)

Prioriteedi väärtus muutub oluliseks, kui samaaegselt käivitatakse mitu lõime.

Lõime prioriteedi seadmine maksimaalseks ei tähenda reaalajas töötamist, kuna seal on ka rakendusprotsessi prioriteet. Reaalajas töötamiseks peate protsessi prioriteedi tõstmiseks kasutama System.Diagnostics nimeruumi klassi Process.

Alates ProcessPriorityClass.High üks samm kõrgeima protsessi prioriteedi – reaalajas. Reaalajas protsessi prioriteedi määramisega annate operatsioonisüsteemile teada, et soovite, et teie protsessi kunagi ei takistataks. Kui teie programm satub kogemata lõpmatusse tsüklisse, võib operatsioonisüsteem täielikult lukustuda. Sel juhul saab teid päästa ainult toitenupp. Sel põhjusel peetakse ProcessPriorityClass.High kõrgeimaks kasutatavaks protsessi prioriteediks.

Kui reaalajas rakendusel on kasutajaliides, ei pruugi olla soovitav selle protsessi prioriteetsust tõsta, kuna ekraani värskendamine sööb liiga palju protsessori aega – aeglustab kogu arvuti tööd, eriti kui kasutajaliides on üsna keeruline.

Lukustuslause (teise nimega Monitor.Enter/Monitor.Exit) on üks näide lõime sünkroonimise konstruktsioonidest. Lukk on kõige sobivam vahend eksklusiivse juurdepääsu korraldamiseks ressursile või koodilõigule, kuid on sünkroonimisülesandeid (näiteks stardisignaali saatmine ootelõngele), mille jaoks lukk ei ole kõige adekvaatsem ja mugavam vahend.

Win32 API-l on rikkalik komplekt sünkroonimiskonstruktsioone ja need on .NET Frameworkis saadaval klassidena EventWaitHandle, Mutex ja Semaphore. Mõned on praktilisemad kui teised: näiteks Mutex dubleerib suures osas lukustusvõimalusi, samas kui EventWaitHandle pakub ainulaadsed võimalused alarmid.

Kõik kolm klassi põhinevad abstraktsel WaitHandle klassil, kuid neil on väga erinev käitumine. Üks ühiseid omadusi on nimetamisvõime, mis võimaldab töötada mitte ainult ühe, vaid ka erinevate protsesside lõimedega.

EventWaitHandle'il on kaks tuletatud klassi - AutoResetEvent ja ManualResetEvent (millel pole midagi pistmist C# sündmuste ja delegaatidega). Mõlemal klassil on ligipääs kõikidele põhiklassi funktsionaalsustele, ainsaks erinevuseks on see, et põhiklassi konstruktorit kutsutakse välja erinevate parameetritega.

Toimivuse osas täidetakse kõik WaitHandle'id tavaliselt mõne mikrosekundi piires. See on harva oluline, arvestades konteksti, milles neid rakendatakse.

AutoResetEvent on kõige sagedamini kasutatav WaitHandle'i klass ja peamine sünkroonimiskonstruktsioon koos lukuga.

AutoResetEvent on väga sarnane turniketiga – üks pilet võimaldab läbida ühe inimese. Nimes olev eesliide "auto" viitab asjaolule, et avatud pöördvärav sulgub automaatselt või "lähtestub" pärast kellegi läbipääsu lubamist. Lõng blokeeritakse pöördväravast kutsudes WaitOne (oodake selle (ühe) pöördvärava juures, kuni see avaneb) ja pilet sisestatakse Set meetodi kutsumisega. Kui mitu lõime kutsuvad WaitOne'i, moodustub pöördvärava taha järjekord. Pilet võib "sisestada" mis tahes lõime – teisisõnu, iga (blokeerimata) lõim, millel on juurdepääs AutoResetEvent objektile, võib kutsuda Set ühe blokeeritud lõime vahele jätmiseks.

Kui Set kutsutakse välja, kui ühtki lõime ei oota, jääb käepide avatud olekusse, kuni mõni lõim kutsub WaitOne'i. See funktsioon aitab vältida võidujooksu pöördväravale läheneva keerme ja piletit sisestava keerme vahel ("oop, pilet sisestati mikrosekundi varakult, kahju, aga peate veel veidi ootama!"). Mitmekordne Seti helistamine tasuta turnikee peale ei luba aga tervet rahvahulka korraga läbi sõita – läbi pääseb vaid üks inimene, kõik ülejäänud piletid lähevad raisku.

WaitOne aktsepteerib valikulist ajalõpu parameetrit – meetod tagastab vale, kui ootamine lõpeb signaali vastuvõtmise asemel ajalõpuga. WaitOne'i saab õpetada ka praegusest sünkroonimiskontekstist väljuma, et jätkata ootamist (kui kasutate automaatse blokeerimise režiimi), et vältida liigset blokeerimist.

Lähtestamismeetod tagab avatud pöördvärava sulgemise ilma ootamise või blokeerimiseta.

AutoResetEventi saab luua kahel viisil. Esiteks, kasutades oma konstruktorit: EventWaitHandle wh = new AutoResetEvent(false);

Ülesandehaldussüsteem tagab nende läbimise arvutist. Olenevalt protsessi olekust peab see eraldama ühe või teise ressursi. Näiteks tuleb mällu paigutada uus protsess, eraldades sellele aadressiruumi; lisada protsessori aja pärast konkureerivate ülesannete loendisse.

Mitmeprogrammilise OS-i üks peamisi alamsüsteeme, mis mõjutab otseselt arvuti tööd, on protsesside ja lõimede haldamise allsüsteem. See tegeleb nende loomise ja hävitamisega ning jaotab protsessori aja ka süsteemis samaaegselt olemasolevate protsesside ja lõimede vahel.

Kui süsteemis töötab samaaegselt mitu ülesannet, ehkki lõime luuakse ja täidetakse asünkroonselt, võivad need vajada suhtlemist näiteks andmete vahetamisel. Seetõttu on lõime sünkroonimine protsesside ja lõimehalduse alamsüsteemi üks olulisi funktsioone.

Protsesside vaheline suhtlus toimub jagatud muutujate ja spetsiaalsete põhioperatsioonide abil primitiivid.

Protsessi- ja lõimehalduse alamsüsteem suudab protsessidega teha järgmisi toiminguid:

– protsessi loomine (kudemine)/hävitamine;

– protsessi peatamine/jätkamine;

– protsessi blokeerimine/äratamine;

– protsessi käivitamine;

– protsessi prioriteedi muutmine;

Protsesside ja lõimede haldamise allsüsteem vastutab protsesside varustamise eest vajalike ressurssidega. OS hoiab mälus spetsiaalseid teabestruktuure, milles ta salvestab, millised ressursid igale protsessile eraldatakse. Ressursi saab määrata protsessile ainsaks kasutamiseks või ühiskasutuseks teiste protsessidega. Osa ressursse eraldatakse protsessile selle loomisel ja osa eraldatakse dünaamiliselt käitusajal päringute alusel. Protsessile saab ressursse määrata kogu selle elueaks või ainult teatud perioodiks. Nende funktsioonide täitmisel suhtleb protsessihalduse alamsüsteem teiste ressursside haldamise eest vastutavate OS-i alamsüsteemidega, nagu mäluhalduse alamsüsteem, sisendi/väljundi alamsüsteem ja failisüsteem.

1. Protsesside ja lõimede loomine ja kustutamine

Protsessi loomine tähendab eelkõige loomist protsessi käepide, mis on üks või mitu teabestruktuuri, mis sisaldab kogu teavet protsessi kohta, mis on vajalik operatsioonisüsteemi haldamiseks. Seda küsimust arutati üksikasjalikult varem, nüüd meenutame lihtsalt, et selline teave võib sisaldada näiteks protsessi identifikaatorit, andmeid käivitatava mooduli asukoha kohta mälus, protsessi privileegi astet (prioriteet ja juurdepääsuõigused), jne.

Protsessi loomine hõlmab protsessi käivitatava programmi koodide ja andmete laadimist kettalt RAM-i. Sel juhul suhtleb protsessihalduse alamsüsteem mäluhalduse alamsüsteemi ja failisüsteemiga. Mitme lõimega süsteemis loob OS protsessi loomisel iga protsessi jaoks vähemalt ühe täitmislõime. Lõime loomisel, nagu ka protsessi loomisel, genereerib OS spetsiaalse infostruktuuri - lõime deskriptori, mis sisaldab lõime identifikaatorit, juurdepääsuõiguste ja prioriteedi andmeid, lõime olekut jne. Pärast loomist on lõim (või protsess) töövalmis olekus (või jõudeolekus, kui me räägime eriotstarbelise operatsioonisüsteemi kohta).

Ülesanded luuakse ja kustutatakse kasutajate asjakohaste taotluste või muude ülesannete alusel. Ülesanne võib sünnitada uue ülesande – paljudes süsteemides võib lõime OS-iga ühendust võtta palvega luua nn. lastevood. Loomisülesannet nimetatakse "esivanemaks" või "vanemaks" ja lapse ülesannet "järglaseks" või "lapseülesandeks". "Esivanem" saab oma alamülesande peatada või kustutada, samas kui "laps" ei saa "esivanemat" hallata.

Erinevad operatsioonisüsteemid struktureerivad alamlõimede ja nende vanemate vahelisi suhteid erinevalt. Mõnes operatsioonisüsteemis on nende täitmine sünkroonitud (pärast emalõime lõpetamist eemaldatakse kõik selle alamlõimed täitmisest), teistes aga sünkroonselt alamlõime.

Pärast protsessi lõppu "puhastab OS jäljed" selle olemasolust süsteemis - sulgeb kõik failid, millega protsess töötas, vabastab alad muutmälu, mis on eraldatud protsessi koodide, andmete ja süsteemiteabe struktuuride jaoks. OS-i järjekorrad ja ressursside loendid, mis sisaldasid viiteid lõpetatavale protsessile, parandatakse.

2. Protsesside ja lõimede ajastamine ja saatmine

Planeerimisstrateegia määrab, millised protsessid valitakse eesmärgi saavutamiseks elluviimiseks. Strateegiad võivad olla erinevad, näiteks:

– võimalusel lõpetage arvutused samas järjekorras, milles neid alustati;

– eelistada lühemaid protsesse;

– pakkuda kõigile kasutajatele (kasutaja ülesandeid) samu teenuseid, sealhulgas sama ooteaega.

Protsessi eluea jooksul võib selle lõimede täitmist mitu korda katkestada ja jätkata.

Üleminek ühe lõime täitmiselt teisele toimub selle tulemusena planeerimine Ja väljasaatmine.

Planeerimine lõime rakendatakse protsesside ja lõimede deskriptoritesse salvestatud teabe põhjal. Ajastamisel saab arvesse võtta lõimede prioriteeti, nende ooteaega, akumuleeritud täitmisaega, I/O juurdepääsu intensiivsust ja muid tegureid. OS ajastab lõime täitmise sõltumata sellest, kas need kuuluvad samasse või erinevatesse protsessidesse. Planeerimise all mõistetakse ülesannet valida selline protsesside kogum nii, et need täitumisel võimalikult vähe konfliktiks ja arvutussüsteemi võimalikult tõhusalt kasutaksid.

Erinevates teabeallikates on mõisteid "planeerimine" ja "saatmine" erinevalt tõlgendatud. Nii jagavad mõned autorid planeerimise pikaajaliseks (globaalne) ja lühiajaliseks (dünaamiliseks, s.t hetkel kõige efektiivsemaks jaotuseks) ning viimast nimetatakse dispetšerimiseks. Teiste allikate kohaselt mõistetakse lähetamise all planeerimisetapis tehtud otsuse elluviimist. Jääme selle valiku juurde.

Planeerimine sisaldab kahe probleemi lahendamist:

aktiivse lõime muutmise ajahetke määramine;

käivitatava lõime valimine valmis lõimede reast.

On palju ajastamisalgoritme, mis lahendavad need probleemid erineval viisil. Planeerimisfunktsioonid määravad operatsioonisüsteemi eripära. Vaatame neid veidi hiljem.

Enamikus operatsioonisüsteemides toimub ajastamine dünaamiliselt, st. otsused tehakse töö käigus hetkeolukorra analüüsi põhjal. Lõimed ja protsessid ilmuvad sisse juhuslikud hetked aega ja lõppu ettearvamatult.

Staatiline planeerimistüüpi saab kasutada spetsiaalsed süsteemid, milles on eelnevalt määratletud kogu samaaegselt täidetavate ülesannete komplekt (reaalajas süsteemid). Planeerija loob ajakava, mis põhineb teadmistel ülesannete komplekti omadustest. Seejärel kasutab operatsioonisüsteem seda ajakava ajastamiseks.

Ärasaatmine seisneb planeerimise tulemusena leitud lahenduse elluviimises, s.o. ühe protsessi teisele ümberlülitamisel. Saatmine taandub järgmisele:

praeguse lõime konteksti salvestamine, mida tuleb muuta;

uue lõime käivitamine täitmiseks.

Lõime kontekst peegeldab esiteks arvuti riistvara olekut katkestuse ajal (programmiloenduri väärtus, üldotstarbeliste registrite sisu, protsessori töörežiim, lipud, katkestusmaskid ja muud parameetrid ) ja teiseks töökeskkonna parameetrid (lingid aadressile failid avada, andmed lõpetamata sisend-/väljundoperatsioonide kohta, antud süsteemikõnede lõime sooritatud veakoodid jne).

Lõime kontekstis saame eristada osa, mis on ühine antud protsessi kõikidele lõimedele (lingid avatud failidele), ja osa, mis on seotud ainult antud lõimega (registrite sisu, programmiloendur, protsessori režiim). Näiteks NetWare'i keskkonnas on kolme tüüpi kontekste – globaalne kontekst (protsessikontekst), lõimerühma kontekst ja üksikute lõimede kontekst. Nende kontekstide andmete suhe on sarnane programmi globaalsete ja kohalike muutujate vahelisele suhtele. Kontekstide hierarhiline korraldus kiirendab lõimede vahetamist: lülitudes sama protsessi raames ühe rühma lõimelt teise rühma lõimele, ei muutu globaalne kontekst, vaid muutub ainult rühmakontekst. Globaalne kontekstivahetus toimub ainult siis, kui liigutakse ühe protsessi lõimelt teise protsessi lõimele.

3. Planeerimisalgoritmid

Esimese ajastamisprobleemi lahendamise (aktiivse lõime muutmise ajahetke valimine) seisukohast jagatakse ajastamisalgoritmid kahte suurde klassi - ennetavad ja mittepreemptiivsed algoritmid:

mitterepressiivne– aktiivne lõim saab käivituda seni, kuni ta ise kontrolli süsteemile üle annab, nii et see valib järjekorrast teise valmis lõime;

tõrjuv– operatsioonisüsteem otsustab teostatavat ülesannet muuta ja lülitab protsessori teisele lõimele.

Peamine erinevus nende ajastamisalgoritmide vahel on lõime ajastamise mehhanismi tsentraliseerituse aste. Vaatleme iga algoritmiklassi põhiomadusi, eeliseid ja puudusi.

Mitteennetavad algoritmid. Rakendusprogramm, olles saanud OS-ilt juhtimise, määrab ise selle täitmise järgmise tsükli lõppemise hetke ja alles seejärel annab juhtimise mõne süsteemikõne abil OS-ile üle. Järelikult kaob kasutaja kontroll rakenduse üle suvaliseks ajaks. Arendajad peavad sellega arvestama ja looma rakendused nii, et need töötaksid “osadena”, katkestades perioodiliselt ja andes juhtimise üle süsteemile, s.t. Arenduse käigus täidetakse ka planeerija funktsioone.

Eelised see lähenemine:

– voolu katkemine ebasobival hetkel on välistatud;

– lahendatakse andmete samaaegse kasutamise probleem, sest iga täitmistsükli jooksul kasutab ülesanne neid eranditult ja on kindel, et keegi teine ​​ei saa neid muuta;

- suurem kiirus voost voogu vahetamiseks.

Puudused on keeruline programmiarendus ja kõrgendatud nõuded programmeerija kvalifikatsioonile, samuti võimalus, et üks lõime võtab protsessori üle, kui see kogemata või tahtlikult loopib.

Ennetavad algoritmid– tsükliline või tsirkulaarne ajastamise tüüp, mille puhul operatsioonisüsteem ise otsustab aktiivse rakenduse katkestamise ja lülitab protsessori ühelt ülesandelt teisele vastavalt ühele või teisele kriteeriumile. Selliste algoritmidega süsteemis ei pea programmeerija muretsema selle pärast, et tema rakendus käivitatakse samaaegselt teiste ülesannetega. Näiteks operatsioonisüsteemid UNIX, Windows NT/2000, OS/2. Selle klassi algoritmid on keskendunud rakenduste suure jõudlusega täitmisele.

Ennetavad algoritmid võivad põhineda kvantiseerimise kontseptsioonil või prioriteedimehhanismil.

Kvantimisel põhinevad algoritmid. Igale lõimele antakse piiratud pidev protsessori ajalõik (selle väärtus ei tohiks olla väiksem kui 1 ms - tavaliselt mitukümmend ms). Lõim viiakse tööolekust valmisolekusse, kui kvant on ammendatud. Kvant võib olla kõigi voogude jaoks sama või erinev.

Kvantide määramisel lõimele saab kasutada erinevaid põhimõtteid: need kvantid võivad olla fikseeritud väärtusega või muutuda niidi eluea erinevatel perioodidel. Näiteks mõne konkreetse voo puhul võib esimene kvant olla üsna suur ja iga järgnev sellele eraldatud kvant võib olla lühema kestusega (vähendamine määratud piiridesse). See loob eelise lühemate lõimede jaoks ja kaua kestnud ülesanded nihkuvad tagaplaanile. Teine põhimõte põhineb asjaolul, et sageli I/O-operatsioone sooritavad protsessid ei kasuta täielikult ära neile eraldatud ajalõike. Selle ebaõigluse kompenseerimiseks võib sellistest protsessidest moodustada eraldi järjekorra, millel on privileegid teiste lõimede ees. Järgmise lõime täitmiseks valides skannitakse esmalt see järjekord ja ainult siis, kui see on tühi, valitakse üldisest järjekorrast täitmiseks valmis lõim.

Need algoritmid ei kasuta ülesannete kohta eelnevat teavet. Teenuste eristamine põhineb sel juhul süsteemi voo "eksistentsi ajalool".

Teise ajastamisprobleemi (järgmise lõime täitmise põhimõte) seisukohalt saab algoritme tinglikult jagada ka klassidesse: mitteprioriteetsed ja prioriteetsed algoritmid. Mitteprioriteetse hoolduse korral valitakse järgmine ülesanne kindlas etteantud järjekorras, arvestamata nende suhtelist tähtsust ja hooldusaega. Prioriteetsete distsipliinide rakendamisel antakse mõnele ülesandele täitmisolekusse sisenemiseks prioriteet.

Vaatame nüüd mõnda kõige levinumat planeerimisdistsipliini.


Teenus, kes ees, see mees. Protsessori jaotamisel kasutatakse FIFO (First In First Out) põhimõtet, st. teenusetaotluste saabumise järjekorras. See lähenemine võimaldab teil võimalusel rakendada strateegiat "arvutuste viimistlemine nende ilmumise järjekorras". Need ülesanded, mis täitmise ajal blokeeriti, pannakse pärast valmisolekusse sisenemist järjekorda nende ülesannete ette, mida pole veel täidetud. Seega luuakse kaks järjekorda: üks ülesannetest, mida pole veel täitnud, ja teine ​​ülesannetest, mis on ootelolekust üle läinud.

Seda distsipliini rakendatakse mitte-ennetavana, kui ülesanded vabastavad protsessori vabatahtlikult.

Väärikust Seda algoritmi on lihtne rakendada. Puudus– suure koormuse korral on lühikesed ülesanded sunnitud süsteemis kaua ootama. Järgmine lähenemisviis kõrvaldab selle puuduse.

Esmalt serveeritakse lühimat protsessi. Selle algoritmi järgi määratakse järgmisena täitmiseks lõim, mille töö lõpetamiseks kulub hinnanguliselt minimaalne aeg. See eelistab lõime, mille valmimiseni on jäänud vähe aega. See vähendab pooleli olevate ülesannete arvu süsteemis. Puudus on vajadus teada eeldatavaid aegu ette, mis ei ole alati võimalik. Ligikaudse hinnanguna võite mõnel juhul kasutada aega, mille lõime viimati juhtimise vastu võttis.

Algoritm kuulub mitteennetava, prioriteedivaba kategooriasse.

Nimetatud algoritme saab kasutada paketttöörežiimide jaoks, kui kasutaja ei oota, et süsteem reageeriks. Interaktiivse andmetöötluse jaoks on vaja eelkõige tagada vastuvõetav reageerimisaeg ja võrdne teenindus mitme terminaliga süsteemidele. Ühe kasutajaga süsteemide puhul on soovitav, et need programmid, millega nad otseselt töötavad, oleksid olemas parim aeg reaktsioonid kui taustatööd. Lisaks peavad mõned rakendused, töötades ilma kasutaja otsese sekkumiseta, siiski tagama, et nad saavad oma osa protsessori ajast (näiteks meiliprogramm). Selliste probleemide lahendamiseks kasutatakse prioriteetse teeninduse meetodeid ja kvantiseerimise kontseptsiooni.


Karusselli distsipliin, või ringikujulineR.R.(Round Robin). See distsipliin on seotud ennetavate algoritmidega ja põhineb kvantiseerimisel. Iga ülesanne saab protsessori aja osade kaupa – kvant. Pärast ajakvanti lõppu eemaldatakse ülesanne protsessorist ja asetatakse täitmiseks valmis protsesside järjekorra lõppu ning järgmine ülesanne võetakse protsessori poolt teenindamiseks vastu. Süsteemi optimaalseks toimimiseks on vaja õigesti valida seadus, mille järgi ülesannetele ajalõike eraldatakse.

Kvantväärtus valitakse kompromissina vastuvõetava süsteemi reageerimisaja vahel kasutaja päringutele (et nende lihtsamad päringud ei põhjustaks pikki ootamisi) ja sageli muutuvate ülesannete üldkulude vahel. Katkestuse korral peab OS salvestama piisavalt suure hulga teavet käimasoleva protsessi kohta, panema tühistatud ülesande käepideme järjekorda ja laadima uue ülesande konteksti. Väikese ajalõike ja sagedaste ümberlülituste korral muutub selliste üldkulude suhteline osakaal suureks ja see halvendab süsteemi kui terviku jõudlust. Kui ajalõik on suur ja valmis ülesannete järjekord pikeneb, muutub süsteemi reaktsioon kehvaks.

Mõnes operatsioonisüsteemis on võimalik selgesõnaliselt määrata ajalõigu väärtus või selle väärtuste lubatud vahemik. Näiteks operatsioonisüsteemis OS/2 kasutab fail CONFIG.SYS operaatorit TIMESLICE, et määrata ajalõigu minimaalsed ja maksimaalsed väärtused: TIMESLICE=32,256 näitab, et ajalõiku saab muuta 32 millisekundilt 256 millisekundile.

See teenindusdistsipliin on üks levinumaid. Mõnel juhul, kui OS ei toeta selgesõnaliselt ring-robin ajakava distsipliini, saab sellist hooldust kunstlikult korraldada. Näiteks kasutavad mõned RTOS-id absoluutsete prioriteetidega ajastamist ja kui prioriteedid on võrdsed, kehtib järjekorra põhimõte. See tähendab, et ainult kõrgema prioriteediga ülesanne saab ülesande täitmisest eemaldada. Vajadusel korraldada teenindus ühtlaselt ja võrdselt, s.o. Tagamaks, et kõik tööd saaksid ühesugused ajalõiked, saab süsteemihaldur sellise teeninduse ise juurutada. Selleks piisab, kui määrata kõikidele kasutajaülesannetele samad prioriteedid ja luua üks kõrge prioriteediga ülesanne, mis ei tohiks teha muud, kui ajastada taimeril teatud ajavahemike järel täitmiseks. See ülesanne eemaldab ainult praeguse rakenduse täitmisest, see liigub järjekorra lõppu ja ülesanne ise lahkub kohe protsessorist ja annab selle järjekorras järgmisele protsessile.

Kõige lihtsamas teostuses eeldab karussellteenuse distsipliin, et kõigil töökohtadel on sama prioriteet. Prioriteedi teenindamise mehhanismi kasutuselevõtu korral korraldatakse tavaliselt sõltuvalt prioriteetidest mitu järjekorda ning madalama prioriteediga järjekorra teenindamine toimub ainult siis, kui kõrgema prioriteediga järjekord on tühi. Seda algoritmi kasutatakse ajastamiseks OS/2 ja Windows NT süsteemides.

Planeerimine vastavalt prioriteetidele.

Paljude ennetavate algoritmide aluseks olev oluline kontseptsioon on ennetav teenus. Sellised algoritmid kasutavad voo deskriptoris leiduvat teavet – selle prioriteeti. IN erinevad süsteemid prioriteet on määratletud erineval viisil. Mõnes süsteemis võidakse kõrgeima prioriteediga väärtust arvestada arvuliselt kõrgeim väärtus, teistes, vastupidi, peetakse kõrgeimaks prioriteediks nulli.

Tavaliselt on lõime prioriteet otseselt seotud selle protsessi prioriteediga, milles lõime töötab. Protsessi prioriteet operatsioonisüsteem määrab selle loomisel, võttes arvesse, kas protsess on süsteemne või rakenduslik, milline on protsessi käivitanud kasutaja olek ja kas kasutajal oli selgesõnaline juhis teatud prioriteedi määramiseks protsessi juurde. Prioriteedi väärtus sisaldub protsessi käepidemes ja seda kasutatakse selle lõimedele prioriteedi määramisel. Kui lõime ei algata kasutaja käsk, vaid mõne teise lõime süsteemikutset täitva lõime tulemusena, siis peab OS sellele prioriteedi määramisel arvestama süsteemikutse parameetritega.

Eelkirjeldatud algoritmide järgi programmide hoolduse planeerimisel võib tekkida olukord, kui mõnda juhtimis- või juhtimisülesannet ei saa süsteemis (eriti RTOS-is) suureneva koormuse tõttu pikema aja jooksul realiseerida. Lisaks võivad selliste ülesannete enneaegse lõpetamise tagajärjed olla tõsisemad kui mõne kõrgema prioriteediga programmi täitmata jätmise tagajärjed. Sel juhul oleks soovitatav ajutiselt muuta "hädaabi" ülesannete prioriteeti (need, mille töötlemisaeg on möödas) ja pärast täitmist taastada eelmine väärtus. Dünaamiliselt muutuvate prioriteetide mehhanismide kasutuselevõtt võimaldab rakendada kiiremat süsteemi reageerimist kasutajate lühikestele päringutele (mis on interaktiivse töö käigus oluline), kuid samal ajal tagab mistahes päringute täitmise.

Nii et prioriteet võiks olla staatiline(fikseeritud) või dünaamiline(süsteemi muutmine olenevalt olukorrast selles). nn põhikeerme prioriteet sõltub otseselt selle tekitanud protsessi põhiprioriteedist. Mõnel juhul võib süsteem lõime prioriteetsust suurendada (ja erineval määral), näiteks kui sellele eraldatud protsessori ajalõik pole täielikult ära kasutatud, või muul viisil prioriteeti alandada. Näiteks eelistab OS rohkem klaviatuurisisendit ootavaid lõime ja vähem kettatoiminguid sooritavaid lõime. Mõnes süsteemis, mis kasutab dünaamilist prioriteedimehhanismi, kasutatakse prioriteedi muutmiseks üsna keerulisi valemeid, mis hõlmavad põhiprioriteetide väärtusi, arvutisüsteemi koormusastet, kasutaja määratud esialgset prioriteedi väärtust jne. .

Prioriteetne ajakava on kahte tüüpi: hooldus suhteliste prioriteetidega ja teenindus absoluutsete prioriteetidega. Mõlemal juhul toimub lõime valimine täitmiseks samal viisil - valitakse kõrgeima prioriteediga lõim ja aktiivse lõime muutmise hetk määratakse erinevalt. Suhtelise prioriteediga süsteemis töötab aktiivne lõim, kuni see protsessorist lahkub (kas ootab, ilmneb tõrge või lõim lõpeb). Absoluutsete prioriteetidega süsteemis esineb aktiivse lõime katkestus lisaks märgitud põhjustele ka siis, kui valmis lõimede järjekorda ilmub aktiivsest kõrgema prioriteediga lõim. Seejärel jooksev niit katkestatakse ja viiakse valmisolekusse.

Suhtelise prioriteediga ajakavaga süsteem minimeerib ümberlülituskulusid, kuid üks ülesanne võib protsessorit pikka aega hõivata. See teenindusrežiim ei sobi ajajagamise ja reaalajas süsteemide jaoks, kuid paketttöötlussüsteemides (näiteks OS/360) kasutatakse seda laialdaselt. Absoluutne prioriteetne ajakava sobib hoonehaldussüsteemidele, kus on oluline sündmustele kiire reageerimine.

Segaplaneerimise tüüp kasutatakse paljudes operatsioonisüsteemides: prioriteedipõhised ajastamisalgoritmid on kombineeritud kvantiseerimise kontseptsiooniga.

UNIX-i operatsioonisüsteemi süda on protsessihalduse alamsüsteem. Peaaegu kõik kerneli tegevused on seotud protsessidega, olgu selleks siis süsteemikõne teenindamine, signaali genereerimine, mälu eraldamine, protsesside täitmisest põhjustatud erandite käsitlemine või rakendusprotsessi nõutud sisend-väljundteenuste pakkumine.
Operatsioonisüsteemi kogu funktsionaalsuse määrab lõppkokkuvõttes teatud protsesside täitmine, nagu ka süsteemi käitamise tasemed pole muud kui mugav vorm töötavate protsesside rühma määratlemiseks. Terminali- või võrgujuurdepääsu võimalus süsteemile, erinevad UNIX-i jaoks traditsioonilised teenused - printimissüsteem, kaug-FTP-arhiivid, e-post ja pressikonverentsisüsteem - kõik see on teatud protsesside tulemus. UNIX-i protsessid on oma olemuselt seotud kahe süsteemi kõige olulisema ressursiga: protsessori ja RAM-iga. Reeglina pole neid ressursse kunagi “palju” ning operatsioonisüsteemis käib protsessori ja mälu omamise õiguse pärast aktiivne konkurents. Ja kuna UNIX on üldotstarbeline multitegumtöötlussüsteem, on selle ressursi võrdne jaotamine eri klasside ja erinevate nõuetega ülesannete vahel mittetriviaalne.
Kuna täitmiseks käivitatud programm loob ühe või mitu
protsessid (või ülesanded). Protsessi juhtimise alamsüsteem juhib:
  • Protsesside loomine ja kustutamine
  • Süsteemiressursside (mälu, arvutusressursside) jaotus protsesside vahel
  • Protsessi sünkroonimine
  • Protsessidevaheline suhtlus
On ilmne, et üldiselt ületab aktiivsete protsesside arv arvutiprotsessorite arvu,
kuid igal ajahetkel saab igal protsessoril töötada ainult üks protsess. Operatsioonisüsteem kontrollib protsesside juurdepääsu arvutusressurssidele,
mitme ülesande tunde tekitamine. Spetsiaalne kerneli ülesanne, mida nimetatakse protsesside planeerijaks, lahendab konfliktid süsteemiressursside (CPU, mälu, I/O-seadmete) pärast konkureerivate protsesside vahel. Planeerija käivitab protsessi täitmiseks, tagades, et protsess ei võtaks üle ainult jagatud süsteemiressursse. Protsess vabastab protsessori pika I/O operatsiooni ootamise ajal või pärast sedaaja kvantit. Sel juhul valib planeerija järgmise prioriteediga protsessi ja alustabsee hukkamiseks.

Mäluhaldusmoodul pakub rakendusülesannete jaoks RAM-i eraldamist Kui kõigi protsesside jaoks pole piisavalt mälu, liigutab kernel protsessi osi
või mitu protsessi sekundaarmällu (tavaliselt kõvaketta spetsiaalsesse piirkonda), vabastades tööprotsessi jaoks ressursse.

Kõik kaasaegsed süsteemid rakendada nn virtuaalmälu: protsess töötab oma loogilises aadressiruumis, mis võib oluliselt ületada olemasolevat füüsilist mälu. Mäluhaldusmooduli ülesanne on ka protsessi virtuaalmälu haldamine.
Protsessidevahelise suhtluse moodul vastutab protsesside teavitamise eest sündmustest signaalide abil ja annab võimaluse andmete ülekandmiseks erinevate protsesside vahel.

Protsessi juhtimise põhitõed

UNIX-protsess on programmi käivitatav kujutis, mis sisaldab kompileerimise tulemusena saadud käivitatava faili mälukaardistust, s.t. o on olemas programmimoodulite, keelte tõlked kõrge tase, keele samaväärseteks programmimooduliteksmadal tase, nagu see:pinu, teegi kood ja andmed, samuti mitmed protsessi juhtimiseks vajalikud tuuma andmestruktuurid, mis on üsna oluline punkt Mälu jaotuse põhimõtete kui protsesside “konkurentsi” ühe olulisema ressursi, st andmed on struktureeritud!, edasiseks mõistmiseks, tinglikult:
  • Virna (praegusest ) – mäluala, kuhu programm salvestab informatsiooni kutsutud funktsioonide, nende argumentide ja funktsioonide iga kohaliku muutuja kohta. Ala suurus võib programmi töötamise ajal muutuda. Funktsioonide kutsumisel pinn suureneb ja lõpetamisel väheneb.
  • Kuhja (õpetada ) on mäluala, kus programm saab teha mida iganes. Ala suurus võib olla erinev. Programmeerijal on võimalus malloc() funktsiooni abil kasutada osa kuhjamälust ja seejärel suurendatakse seda mäluala. Ressursid tagastatakse kasutades free() , mille järel hunnikut vähendatakse.
  • Kood (koodisegmendini ) on mäluala, kuhu salvestatakse kompileeritud programmi masinakäsud. Need genereerib kompilaator, kuid neid saab ka käsitsi kirjutada. Pange tähele, et selle mäluala saab jagada ka kolmeks osaks (tekst, andmed ja BSS). Sellel mälualal on kindel suurus, mille määrab kompilaator.UNIX. Professionaalne programmeerimiskunst 259

See määrab (muu hulgas) segmentide ja lehtede tekkimise (olemasolu). Protsess kasutab täitmise ajal erinevaid süsteemiressursse – mälu, protsessorit, faili alamsüsteemi teenuseid ja sisendi/väljundi alamsüsteemi teenuseid. Iga kaasaegse karm tõde arvutuskompleks on see, et üks protsessor saab teenindada ainult ühte protsessi ajaühiku kohta, mis omakorda on ette määratud“planeerija” tekkimine (olemasolu), mille abilUNIX-i operatsioonisüsteem loob illusiooni mitmest samaaegselt töötavast protsessist, jaotades süsteemiressursse tõhusalt aktiivsete protsesside vahel, takistades samal ajal ühelgi neist nende ressursside kasutamist monopoliseerimast.

Uus UNIX-i operatsioonisüsteem võimaldas ainult kahe protsessi täitmist, ühe iga PDP-7-ga ühendatud terminali jaoks. Aasta hiljem suurenes samal PDP-7-l protsesside arv märgatavalt, ilmus süsteemikõne kahvel. UNIX-i esimene väljaanne tutvustas kõnet endised, kuid operatsioonisüsteem lubas siiski korraga mällu paigutada ainult ühe protsessi. PDP-11 riistvaramälu haldamise alamsüsteemi rakendamisega muudeti operatsioonisüsteemi, et võimaldada korraga mällu laadida mitu protsessi, vähendades sellega protsessi kujutise sekundaarmällu (kettale) salvestamiseks kuluvat aega. ja lugege see ette, kui protsess jätkus. Kuid kuni 1972. aastani ei saanud UNIX-i nimetada tõeliselt multitegumtöötlussüsteemiks, kuna sisend-/väljundoperatsioonid jäid sünkroonseks ja muud protsessid ei saanud käivituda enne, kui nende “kolleeg” I/O operatsiooni lõpetas. Tõeline multitegumtöö tekkis alles siis, kui UNIX-kood 1973. aastal C-vormingus ümber kirjutati. Sellest ajast peale on protsessijuhtimise põhialused jäänud praktiliselt muutumatuks.


Protsessi täitmine võib toimuda kahes režiimis - kerneli režiimis ( kerneli režiim) või tegumirežiimis ( kasutaja režiim). Tegumirežiimis täidab protsess rakendusprogrammi käske, mis on lubatud protsessori mitteprivilegeeritud turbetasemel. Sel juhul pole süsteemi andmestruktuurid protsessile kättesaadavad. Kui protsess peab saama mis tahes kerneli teenuseid, teeb see süsteemikutse, mis täidab privilegeeritud tasemel tuumakäske.

Kuigi kerneli käske täidetakse, teevad nad seda süsteemikutse teinud protsessi nimel. Seejärel lülitub protsessi täitmine kerneli režiimi. Sel viisil kaitseb süsteemituum oma aadressiruumi rakendusprotsessi juurdepääsu eest, mis võib rikkuda tuuma andmestruktuuride terviklikkust ja viia operatsioonisüsteemi hävimiseni.

Lisaks saab mõnda protsessori käsku, näiteks mäluhaldusega seotud registrite muutmist, täita ainult kerneli režiimis.
Vastavalt sellele koosneb protsessi pilt kahest osast: kerneli režiimi andmed ja tegumirežiimi andmed. Tegumirežiimi protsessi kujutis koosneb koodi, andmete, viru, teekide ja muude andmestruktuuride segmendist, millele sellel on otse juurdepääs. Kerneli režiimis protsessi pilt koosneb andmestruktuuridest, mis pole tegumirežiimis protsessile juurdepääsetavad ja mida kernel kasutab protsessi juhtimiseks. See hõlmab riistvara dikteeritud andmeid, nagu registri olekud, mälu vastendamise tabelid jne, aga ka andmestruktuure, mida kernel vajab protsessi teenindamiseks. Üldiselt võib protsess tuumarežiimis pääseda juurde mis tahes mälupiirkonnale.

Protsessi andmestruktuurid

Iga protsessi esindab süsteemis kaks peamist andmestruktuuri proc Ja kasutaja,

vastavalt failides kirjeldatud sys/proc.h Ja sys/user.h. Nende struktuuride sisu ja vorming on UNIX-i versioonide lõikes erinev.

....................................................................................................

https://m.habr.com/ru/company/*nix<-----------
….................................................................................................
Struktureerige andmeid igal ajal proc kõik protsessid peavad olema mälus, kuigi ülejäänud andmestruktuure, sealhulgas protsessi kujutist, saab teisaldada sekundaarmällu, vahetusalasse. See võimaldab kernelil olla käepärast minimaalset teavet, mis on vajalik ülejäänud protsessi jaoks oluliste andmete leidmiseks, isegi kui need pole mälus. Struktuur proc on kirje süsteemi protsessitabelis, mis, nagu just märkasime, on alati RAM-is. Selle tabeli praegu töötava protsessi kirjet käsitleb süsteemimuutuja curproc. Iga kord toimub kontekstilüliti, kus protsessori ressursid teisaldatakse teisele
protsessi, muutub muutuja väärtus vastavalt curproc, mis osutab nüüd struktuurile proc aktiivne protsess. Teisena mainitud struktuur kasutaja, nimetatud ka u-ala või u-plokk, sisaldab täiendavaid protsessiandmeid, mida kernel vajab ainult protsessi täitmise ajal (st kui protsessor täidab protsessikäske kerneli või tegumirežiimis). Erinevalt struktuurist proc, mille kursor on adresseeritud curproc, andmed kasutaja paigutatakse
(täpsemalt kuvatakse) tuuma virtuaalmälus teatud kohas ja on adresseeritud muutujale u. Allpool on näidatud kaks peamist protsessiandmete struktuuri ja seda, kuidas UNIX-i kernel neid adresseerib.
IN u-ala Salvestatakse andmeid, mida kasutavad paljud kerneli alamsüsteemid ja mitte ainult protsesside juhtimiseks. Eelkõige sisaldab see teavet avatud failideskriptorite, signaali paigutuse, protsesside täitmise statistika ja salvestatud registriväärtuste kohta, kui protsessi täitmine on peatatud. Ilmselgelt ei tohiks protsess olla võimeline neid andmeid suvaliselt muutma, nii et u-ala on tegumirežiimis juurdepääsu eest kaitstud. Nagu jooniselt näha, u-ala sisaldab ka fikseeritud suurusega pinu, süsteemipinu või kerneli pinu. Kui protsess töötab kerneli režiimis, kasutab operatsioonisüsteem pigem seda pinu kui protsessi tavalist pinu.

Protsessi olekud

Protsessi elutsükli võib jagada mitmeks olekuks. Protsessi üleminek ühest olekust teise toimub sõltuvalt teatud sündmuste toimumisest süsteemis.
  • 1. Protsess töötab tegumirežiimis. Sel juhul täidab protsessor selle protsessi rakendusjuhised.
  • 2. Protsess töötab kerneli režiimis. Sel juhul täidab protsessor süsteemikäskeoperatsioonisüsteemi kernel protsessi nimel.
  • 3 . Protsess ei tööta, kuid on käivitamiseks valmis niipea, kui planeerijavalib selle (käivitatav olek). Protsess on täitmisjärjekorras ja sellel on kõikvajalikke ressursse, välja arvatud andmetöötluseks vajalikud.
  • 4. Protsess on uneseisundis (uinunud), oodates midagi kättesaamatutSel hetkel ressurss, näiteks I/O toimingu lõpetamine.
  • 5. Protsess naaseb kernelirežiimist tegumirežiimi, kuid kernel katkestab selle ja toodabkonteksti vahetamine kõrgema prioriteediga protsessi käivitamiseks.
  • 6. Protsess loodi just kahvli abil ja on üleminekulolek: see on olemas, kuid ei ole töövalmis ega ole puhkeolekus.
  • 7. Protsess käivitas väljumissüsteemi kutse ja sisenes olekussezombie (zombie, kadunud). Protsessi kui sellist ei ole, kuid dokumendid jäävad alles,mis sisaldab tagastuskoodi ja selle täitmise ajutist statistikat, mis on saadaval emaprotsessile.See olek on protsessi elutsükli viimane olek.
Tuleb märkida, et kõik protsessid ei läbi kogu ülaltoodud olekute kogumit. Protsess alustab oma eluteed olekust 6 kui vanemprotsess teeb süsteemikutse kahvel (). Kui protsessi loomine on täielikult lõpetatud, lõpetab protsess kõne "lapse" ja siseneb olekusse 3 stardivalmis, ootab oma
täitmisjärjekorrad. Kui planeerija valib käivitatava protsessi, siseneb see olekusse 1 ja töötab tegumirežiimis. Tegumirežiimi täitmine lõpeb süsteemikõne või katkestuse tulemusena ja protsess läheb kerneli režiimi, kus käivitatakse süsteemikõne või katkestuse kood. Pärast seda saab protsess naasta uuesti tegumirežiimi. Süsteemikõne käivitamisel kerneli režiimis võib protsess aga vajada ressurssi, mis pole praegu saadaval. Sellisele ressursile juurdepääsu ootamiseks kutsub protsess välja kerneli funktsiooni magama () ja läheb uneseisundisse 4 . Sel juhul vabastab protsess vabatahtlikult arvutusressursid, mis antakse järgmise prioriteediga protsessile. Kui ressurss muutub kättesaadavaks, "äratab kernel protsessi" funktsiooni abil Ärka üles() paneb selle täitmisjärjekorda ja protsess läheb olekusse "käivitamiseks valmis". 3 .
Kui protsess on varustatud arvutusressurssidega, toimub kontekstivahetus, mille tulemusena salvestatakse praeguse protsessi pilt ehk kontekst ja juhtimine viiakse üle uuele. Konteksti lülitus võib toimuda näiteks siis, kui protsess läheb unerežiimi või kui praegusest kõrgema prioriteediga protsess on töövalmis. Viimasel juhul ei saa kernel praegust protsessi kohe katkestada ja kontekstivahetust teha. Fakt on see, et kerneli režiimis käivitatud konteksti vahetamine võib põhjustada süsteemi enda terviklikkuse rikkumist.
Seetõttu viivitatakse kontekstilülitit, kuni protsess on siirdunud kernelirežiimist tegumirežiimi, kui kõik süsteemitoimingud on lõpule viidud ja tuuma andmestruktuurid on normaalses olekus.
Seega, pärast seda, kui planeerija on käivitamiseks valinud protsessi, alustab viimane oma
käivitamine kerneli režiimis, kus see lõpetab kontekstivahetuse. Edasine seisund
protsess sõltub selle ajaloost: kui protsess just loodi või katkestati, naastes tegumirežiimi, siseneb see kohe sellesse režiimi. Kui protsess alustab täitmist pärast puhkeolekut, jätkab see täitmist kerneli režiimis, viies lõpule süsteemikutse. Pange tähele, et selline protsess võib katkeda pärast süsteemikõne lõppemist tuumarežiimilt tegumirežiimile ülemineku ajal, kui järjekorras on kõrgema prioriteediga protsess. UNIX 4xBSD määratleb täiendavad protsessi olekud, mis on peamiselt seotud tööjuhtimissüsteemi ja protsessi interaktsiooniga terminaliga. Protsessi saab viia "peatatud" olekusse stoppsignaalide abil SIGSTOP, SIGTTIN või SIGTTOU. Erinevalt teistest signaalidest, mida töödeldakse ainult jooksva protsessi jaoks, põhjustab nende signaalide saatmine kohese oleku muutuse. Kui protsess on käimas või järjekorda pandud, muutub selle olek "peatatud". Kui protsess oli uneseisundis, muutub selle olek "peatatud uneseisundis". Nendest olekutest väljumine toimub jätkusignaali abil SIGCONT, sel juhul läheb protsess "peatatud" olekust olekusse "käivitamiseks valmis" ja puhkeolekus peatatud protsessi puhul on järgmiseks sihtkohaks "unerežiimi" jätkamine.
Kirjeldatud võimalused on SVR4-s täielikult rakendatud.

Unerežiimis olevate protsesside puhul on erand
madala prioriteediga sündmus, st sündmus, mille toimumise tõenäosus on suhteliselt väike (näiteks klaviatuurisisend, mis ei pruugi toimuda).

Lõpuks käivitab protsess süsteemikutse exit () ja lõpetab selle täitmise. Protsessi saab katkestada ka signaali vastuvõtmise tõttu. Mõlemal juhul kernel vabastab protsessile kuuluvad ressursid, välja arvatud selle tagastuskood ja täitmisstatistika, japaneb protsessi "zombie" olekusse. Protsess jääb sellesse olekusse seni, kuni vanemprotsess sooritab ühe süsteemikutsest, misjärel kogu protsessi puudutav info hävitatakse ning vanem saab lõppenud protsessi tagastuskoodi.

Mälu haldamise põhimõtted

Marshall Kirk McKusick FreeBSD – arhitektuur ja juurutamine<<-----------PDF ст.166

Mäluhaldus osa-1

12:51 - Aadressi eraldusvõime 34:21 - Ülekate, dünaamiline struktuur

59:26 - Lineaarne pidev kaardistamine - Tükkide kaupa lineaarne (artikkel 25)


Mäluhaldus osa-2

Mis juhtus alguses? OOP või virtuaalmälu.

51:44--> "Virtuaalne mälu";<-(стр. 18)->56:03--> "Segmendid";


Assotsiatiivne saatepuhver, Tõlkepuhver(TLB) on spetsiaalne protsessori vahemälu, mida kasutatakse virtuaalse mälu aadressi füüsiliseks mäluaadressiks tõlkimise kiirendamiseks.
https://ru.wikipedia.org
https://www.ibm.com/support/knowledgecenter/.performance/cache_tlbs.htm

Üks operatsioonisüsteemi põhifunktsioone on tõhus mäluhaldus.
RAM ehk põhimälu või muutmälu (Random Access Memory, RAM). RAM-i juurdepääsuaeg on vaid paar protsessoritsüklit, seega tagab mälus olevate andmetega töötamine maksimaalse jõudluse.
See ressurss on tavaliselt piiratud. Suuremal määral kehtib see üldotstarbelise multitegumtööga operatsioonisüsteemi kohta, milleks on UNIX.
Seetõttu asuvad andmed, mida ei saa RAM-i paigutada, sekundaarsetes salvestusseadmetes või sekundaarmälus, mille rolli täidavad tavaliselt
kettadraivid. Juurdepääsuaeg sekundaarsele mälule on mitu suurusjärku suurem kui juurdepääsuaeg RAM-ile ja nõuab operatsioonisüsteemi aktiivset abi.
UNIX-i mäluhalduse alamsüsteem vastutab õiglase ja tõhusa jaotamise eest
jagatud RAM-i ressurss protsesside vahel ning andmevahetuseks RAM-i ja sekundaarmälu vahel. Mõned toimingud tehakse riistvaras, seadme poolt
operatsioonisüsteemi kontrolli all oleva protsessori mäluhaldusüksus (MMU), saavutades seeläbi vajaliku jõudluse.
Primitiivne mäluhaldus vähendab oluliselt operatsioonisüsteemi funktsionaalsust. Sellised süsteemid võimaldavad reeglina laadida ühe ülesande RAM-i etteantud asukohta ja juhtida sellele üle. Sel juhul saab ülesanne vastu
kõigi arvutiressursside utiliseerimine (muidugi nende jagamine operatsioonisüsteemiga),
ja ülesandes kasutatavad aadressid on füüsilised RAM-aadressid.
Kuna selline ühe programmi käivitamise ja käivitamise meetod on kindlasti kõige kiirem, kasutatakse seda sageli spetsiaalsetes mikroprotsessorsüsteemides, kuid praktiliselt ei rakendata üldotstarbelistes operatsioonisüsteemides, näiteks UNIX.
Saame sõnastada mitmed võimalused, mida kaasaegse multitegumtöötlussüsteemi mäluhalduse alamsüsteem peaks pakkuma:

  • Ülesannete täitmine, mille suurus ületab operatiivtöö mahu mälu.
  • Minimeerimiseks täitke mälus osaliselt laaditud ülesandeidnende käivitamise aeg.
  • Protsessori tõhususe parandamiseks paigutage mällu korraga mitu ülesannet.
  • Ülesande paigutamine RAM-is suvalisse kohta.
  • Ülesande paigutamine RAM-i mitmesse erinevasse osasse.
  • Sama mäluala jagamine mitme ülesandega.Näiteks võivad mitu sama programmi töötavat protsessi jagada koodisegmenti.
  • võimalus luua masinast sõltumatuid koode, st a priori ei tohiks programmi ja füüsilise mälu vahel olla seost.
Kõik need funktsioonid on rakendatud UNIX-i kaasaegsetes versioonides Virtuaalne mälu, sõltub multitegumtöötlussüsteemi kui terviku jõudlus suuresti selle alamsüsteemi rakendamise ja toimimise tõhususest. See võimaldab rakendusel luua illusiooni suurest mälumahust, kuigi tegelikkuses võib arvutil olla vaid väike kogus RAM-i. Selleks on vaja määratleda "aadressiruumi" abstraktsioon, mis erineb mälu füüsilisest asukohast. Programm loob lingid oma aadressiruumis olevatele koodidele ja andmetele, sellised aadressid tuleb teisendada RAM-i rakkude aadressideks. Teabe edastamine põhimällu programmi kasutamiseks ja aadresside tõlkimine igas mälupöörduses sunnib nii arvuti tarkvara kui ka riistvara koos tegutsema.
PS: LINUX

Lisaks töötab protsess virtuaalsete, mitte füüsiliste aadressidega.

Teisendamine toimub arvutuste abil, kasutades deskriptortabeleid ja tabelikatalooge.

Linux toetab 3 tabelitasandit: esimese taseme tabelikataloog ( PGD- Lehekülje tabelikataloog),

teise taseme tabelite kataloog ( PMD- Medium Page Table Directory) ja lõpuks deskriptorite tabel (PTE- Lehekülje tabeli sisestus). Tegelikult ei pruugi konkreetne protsessor toetada kõiki tasemeid,kuid pearuum võimaldab teil toetada rohkem võimalikke arhitektuure (Intelil on 2 taset tabeleid, ja Alfa – tervelt 3).

Virtuaalse aadressi teisendamine füüsiliseks aadressiks toimub kolmes etapis. Osuti võetakse PGD, mis on iga protsessi kirjeldavas struktuuris olemas, teisendatakse kirje osutiks PMD, ja viimane teisendatakse deskriptorite tabelis osutiks PTE. Ja lõpuks päris aadressile,lehe algusesse osutamisel lisatakse selle algusest nihe. Hea näite sellisest protseduurist leiab kerneli funktsioonist< osaline_selge>.


Virtuaalne ja füüsiline mälu

RAM on arvutisüsteemi üks olulisi komponente. Varasemate UNIX-süsteemide käsutuses oli 64 KB RAM-i ja see kogus oli ilmselgelt ebapiisav kaasaegsetel arvutitel on gigabaiti RAM-i ja sellest on ikka veel vähe.
RAM-i saab esitada baitide jadana, millest igaühel on oma kordumatu aadress, mida nimetatakse füüsiliseks aadressiks. Just neid aadresse kasutab protsessor RAM-iga andmete vahetamisel. Protsessi aadressiruum erineb aga oluliselt füüsilise RAM-i aadressiruumist. Kujutagem ette, et protsessi aadressiruum kaardistati otse RAM-i ehk teisisõnu protsessis kasutatud aadressid olid füüsilised aadressid. Sellise lähenemise korral ootavad meid mitmed ületamatud takistused teel multitegumtöötlussüsteemi loomisele:
  • Esiteks on raske ette kujutada mehhanismi, mis kaitseks ühe protsessi aadressiruumi,teise aadressiruumist või, mis veelgi olulisem, operatsioonisüsteemi enda aadressiruumist.Kuna iga protsess töötab füüsilistel aadressidel, pole garantiid, et protsess ei pääse juurdemälurakud, mis kuuluvad muudesse protsessidesse või süsteemituuma.Sellise ravi tagajärjed on tõenäoliselt väga kohutavad.
  • Teiseks oleks vaja juba koostamise etapis ette näha jaotusolemasolev füüsiline aadressiruum. Alustamisel peab iga protsesshõivavad füüsiliste aadresside külgnevat ja mittekattuvat ala.
  • Kolmandaks on selline mälujaotus protsesside vahel ebatõenäolinevõib nimetada optimaalseks. Füüsilise töö mahtmälu piirab oluliselt protsesside arvutöötab samaaegselt süsteemis. Nii kaheksa protsessi,millest igaüks võtab 1 MB mälu, ammendab 8 MBRAM ja operatsioonisüsteem keskmise koormusegaon rohkem kui 80 protsessi!
Kõiki neid probleeme saab lahendada virtuaalmälu abil.
Rakenduste kasutatavad aadressid ja kernel ise ei pea aga vastama füüsilistele aadressidele. Virtuaalsed aadressid tõlgitakse või vastendatakse füüsilisteks aadressideks riistvara tasemel operatsioonisüsteemi tuuma aktiivsel osalusel.Virtuaalmälu mõte seisneb selles, et iga protsess töötab oma virtuaalses aadressiruumis.

Virtuaalne aadressiruum on protsessi paradiis.

  • Esiteks on protsessil eksklusiivsuse tunne – lõppude lõpuks kogu aadressiruumkuulub ainult temale.
  • Teiseks ei piira seda enam füüsilise mälu maht – virtuaalmälu võib oluliseltületada füüsilist Selle tulemusena muutuvad protsessid üksteisest isoleerituks ja neil puudubvõimalused (isegi soovi korral)"hosti" naabri aadressiruum. Füüsilist mälu eraldatakse nii palju kui võimaliktõhus – see ei sõltu üksiku protsessi virtuaalmälu paigutusest.
Ilmselgelt on virtuaalmälu rakendamiseks vaja hallatavat kaardistamismehhanismi
virtuaalne aadress füüsiliseks. Kaasaegsetes arvutisüsteemides toimub kuvamisprotsess riistvara tasemel (kasutades MMU)(MMU bitt ("kasutatavuse" bitt)) pakkudes suur kiirus saateid.
Operatsioonisüsteem haldab seda protsessi.

Kaasaegsed protsessorid toetavad reeglina aadressiruumi ühendamist (segment - lehemälu korraldus):

V muutuva suurusega alad - segmendid Ja

V fikseeritud suurusega alad - lehed,

lehe mõistet võib tõlgendada kui mälu korraldamise viisi, kui füüsiline mälu on jagatud kindla suurusega plokkideks (512-2Kb, 2-kordne), samuti mõistet "segment", "lehekülg" on üks põhilisi abstraktsioone operatsioonisüsteemide arhitektuuri ja toimimise mõistmisel. Sel juhul võib igal segmendil või lehel olla oma virtuaalaadresside vastendamine füüsiliste aadressidega.
Protsessi virtuaalne aadressiruum on tavaliselt struktureeritud järjestikku segmentide – kood, andmed, virn ja teegid – sees. Füüsilise mälu vastavate alade asukoht võib varieeruda killustatud iseloomu. Virtuaalmälu suurus võib sekundaarmälu või vahetusala kasutamise kaudu oluliselt ületada füüsilise mälu suurust – tavaliselt kettaruumi, kuhu saab salvestada protsessi aadressiruumi ajutiselt kasutamata osa. Näiteks kui protsess käivitab ja pääseb juurde virtuaalsele aadressile, millel on vastav füüsilise mälu leht, siis lugemis- või kirjutamisoperatsioon õnnestub. Kui RAM-is puudub leht, genereerib protsessor riistvarakatkestuse, mida nimetatakse lehe veaks ( lehe viga)
, millele vastusena määrab tuum vahetusalas salvestatud lehe sisu asukoha, loeb lehe mällu, määrab parameetrid virtuaalaadresside vastendamiseks füüsilistele ja teavitab protsessorit toimingu kordamise vajadusest. Kõik need toimingud on virtuaalmäluga töötavale rakendusele nähtamatud.

Mehhanism virtuaalsete aadresside vastendamiseks füüsilisteks (aadressi tõlkimine) on hädavajalik sõltub konkreetsest riistvararakendusest. Selles jaotises käsitletakse mehhanismi virtuaalsete aadresside vastendamiseks füüsilisteks aadressideks operatsioonisüsteemis SCO UNIX perekonna näitel Inteli protsessorid

. Kuid nagu ka teiste UNIX-i alamsüsteemide puhul, erinevad põhiprintsiibid vähe ning see esitlus aitab tutvustada mäluhaldusmehhanisme ja vajadusel mõista konkreetset teostust.

Segmendid
Inteli protsessorite perekond võimaldab jagada mälu mitmeks loogiliseks osaks, mida nimetatakse segmentideks. Sel juhul saab protsessi aadressiruumi esitada mitme loogilise segmendi kujul, millest igaüks koosneb pidevast aadresside jadast, mis asuvad antud vahemikus. Segmenteerimisel põhinev aadressi tõlkimine
tagab segmendi aadresside ühemõttelise kaardistamise pidevaks jadaks
füüsilised aadressid. Virtuaalne aadress koosneb kahest osast: segmendivalija ja nihe lõigu alguse suhtes. Valija (täpsemalt valija väli INDEX
) näitab
niinimetatud segmendi deskriptor, mis sisaldab selliseid parameetreid nagu selle asukoht mälus,
selleks ette nähtud töötlejaregistrid. Nende tabelite täitmise ja registriväärtuste seadistamise eest vastutab operatsioonisüsteemi tuum. Teisisõnu, tuum määrab vastenduse ja protsessor teostab riistvaras kaardistamise. Tänu sellele kaudsele adresseerimisele on loogilised segmendid üksteise eest kaitstud, mis tagab protsessi ja kerneli aadressiruumi terviklikkuse.
Segmendi deskriptorid asuvad kahes süsteemitabelis – kohalikus deskriptorite tabelis
(Kohaliku deskriptorite tabel – LDT) ja globaalne deskriptorite tabel – GDT).
Nagu nimigi ütleb, pakub LDT protsessisegmentide virtuaalset aadressi tõlkimist,
samas kui GDT teenindab tuuma aadressiruumi (näiteks süsteemi töötlemisel
igal protsessil on oma LDT, samas kui GDT
jagavad kõik protsessid. Teave tabeli kohta, millele valija osutab, on selektoris endas.

1 5 3 2 1 0

(täpsemalt valija väli T.I. VÕTA
Segmendi valija
  • Väli (täpsemalt valija väli on deskriptori tabelis oleva deskriptori number (indeks), mis peakskasutatakse lineaarse aadressi arvutamisel.
  • Natuke T.I. määrab, millist deskriptortabelit tuleks kasutadaØ - vastab GDT-le1 - vastab LDT-le
  • Väli VÕTA kasutatakse programmi juurdepääsuõiguste juhtimiseks segmendile. taotletakseprivileegitase ja on üks segmendi kaitse tagamise mehhanisme.Näiteks kui protsess proovib tegumirežiimis juurdepääsu segmendile,kernelile kuuludes genereerib protsessor erandi, millele vastuseks saadab kernel protsessile SIGSEGV signaali.
Iga LDT või GDT kirje on segmendi deskriptor. Määratletakse mitut tüüpi deskriptoreid, mida kasutatakse koodi, andmete ja virnasegmentide jaoks, aga ka mitmeid deskriptoreid,
mille abil pakutakse multitegumtöötlust ja juhtimise üleviimist privilegeerimata ülesandelt, näiteks tegumirežiimis protsessilt, privilegeeritud ülesandele, näiteks kernelile.
Viimasel juhul kasutatud deskriptoreid nimetatakse väravateks.

Segmendi deskriptoritel (kood, andmed, virn) on mitu välja:

  • Põhiaadress See väli salvestab segmendi alguse 32-bitise aadressi. Protsessor lisab sellelenihke ja saab 32-bitise lineaarse aadressi.
  • Piirang See väli määrab segmendi suuruse. Kui tulemuseksLineaarne aadress on väljaspool segmendi piire, protsessor genereerib erandi.Segmendi piirid võimaldavad protsessoril tuvastada levinud vigu, nagu pinu ületäitumine,valed näpunäited, valed kõneaadressid jaüleminekud. Juhul, kui operatsioonisüsteem seda usubväljaspool segmenti helistamine ei ole viga(näiteks virna ületäitumisel), võib see segmenti eraldades laiendadalisamälu ja nõuda käsu uuesti täitmist.
  • Privileegid See väli, mida nimetatakse deskriptori privileegitasemeks (DPL), määrab tasemesegmendi privileege ja seda kasutatakse koos valija RPL väljaga juurdepääsu lubamiseks või keelamisekssegmendi juurde. Segmendile juurdepääsu saamiseks peab ülesanne olema vähemalt samal tasemelprivileegid, nagusegment, st RPL DPL.
  • Kohaloleku märk. See bitt on üks virtuaalmälu rakendamise mehhanismidest.Kui bitt pole määratud, siis juurdepääsu proovimiselsegmendile genereerib protsessor puuduva erandisegment, mis võimaldab kernelil laadida segment sekundaarmälust ja korrata käsku uuesti,protsessi läbiviimist mõjutamata. Kuid enamikus kaasaegsetes versioonidesUNIX-i virtuaalmälu põhineb lehemehhanismil,milles segment on alati mälus olemas ning vahetus töö- jaSekundaarne mälu esineb lehe tasemel.
  • Tüüp See väli määrab segmendi tüübi. Protsessor kontrollib tüüpisegment käivitatava käsu täitmiseks. Eelkõige ei võimalda see meil tõlgendadaandmesegmendi teave protsessori juhistena.
  • Juurdepääsuõigused See väli määrab juurdepääsuõigused, mis piiravad kogumittoimingud, mida saab teha segmendiga. Näiteks,koodisegment on tavaliselt märgitud käivitatavaks ja loetavaks.Andmesegmentidel võivad olla kirjutuskaitstud juurdepääsuõigused,või lugemiseks ja kirjutamiseks.
Selektori ja nihke kombinatsioon moodustab loogilise aadressi. Protsessori mälu juhtseade
kasutab valijat oma vastava deskriptori määramiseks. Lisades deskriptorisse salvestatud segmendi baasaadressi koos nihkega, loob protsessor lineaarse aadressi. Kui otsimist ei kasutata, on tulemuseks olev lineaarne aadress füüsiline aadress, mida kasutatakse RAM-ile otseseks juurdepääsuks. Kuid ainult segmendipõhine virtuaalmälu rakendamine ei ole piisavalt paindlik ja seda ei kasutata tänapäevastes versioonides. Mäluhaldus põhineb enamikus süsteemides lehemehhanismil. Kernel kasutab segmente koodi, andmete ja protsessipinu paigutamiseks, millest igaühe baasaadress on null ja limiit 3 GB, st kogu adresseeritav virtuaalmälu miinus süsteemituuma poolt hõivatud 1 GB.
Virtuaalse aadressiruumi jaotust kerneli ja protsesside vahel käsitletakse jaotises "".

Lehekülje mehhanism

Ainult segmenteerimisel põhineva virtuaalmälu rakendamisel võib kogu segment RAM-is olla või puududa (täpsemalt sekundaarmälus või protsessi käivitatavas failis).
Kuna segmendi suurus võib olla üsna suur, põhjustab mitme suure protsessi samaaegne täitmine kõva konkurentsi mäluressursside pärast, mis omakorda
toob kaasa intensiivse andmevahetuse RAM-i ja sekundaarmälu vahel. Lisaks on muutuva suurusega alade, mis on segmendid, vahetamine üsna keeruline ja kuigi mälu killustatus on väike, toob see kaasa selle kasutamise madala efektiivsuse.
jättes palju kasutamata ruumi.

Lehekülje mehhanism pakub palju suuremat paindlikkust. Sel juhul jagatakse kogu virtuaalne aadressiruum (4 GB Inteli protsessoritele) võrdse suurusega plokkideks, mida nimetatakse lehtedeks. Enamik Inteli protsessoreid töötab 4 KB lehtedega. Nagu segmenteerimise puhul, võib leht olla kas RAM-is,
või olla protsessi vahetusalas või käivitatavas failis. Selle skeemi peamine eelis on see, et mäluhaldussüsteem töötab üsna väikestel aladel
suurus, et tagada mäluressursside tõhus jaotamine protsesside vahel.
Lehitsemismehhanism võimaldab osa segmendist olla RAM-is ja osa puududa. See annab kernelile võimaluse paigutada mällu ainult need lehed, mis on antud aega mida protsess kasutab, vabastades seeläbi oluliselt RAM-i. Teine eelis on see, et segmentlehed võivad paikneda füüsilises mälus igas kohas ja järjekorras, mis võimaldab vaba ruumi tõhusalt kasutada.
Selline lähenemine meenutab failide salvestusskeemi kettal – iga fail koosneb
mitmesugused andmesalvestusplokid, mis võivad asuda kettaseadme mis tahes vabas piirkonnas. See toob kaasa olulise killustatuse, kuid parandab oluliselt kettaruumi tõhusust.

Segmendi baasaadressi ja nihke liitmisel saadud lineaaraadress on otsingumehhanismi kasutamisel ühtlasi loogiline aadress, mida töötleb täiendavalt protsessori otsinguplokk. Sel juhul käsitleb protsessor lineaarset aadressi kolmest osast koosnevana.


Lehekülje kataloogi kirje, PDE- Esimene aadressiväli, bitid 22 kuni 31, osutab leheküljetabeli kataloogi kirjele PDE. Leheküljetabeli kataloog on ühe lehekülje pikkune ja sisaldab kuni 1024 leheküljetabeli osutit. Nii et esimene väli käsitleb konkreetset lehe tabelit.
Page Table Entry, RTE- Teine väli, mis hõlmab bitte 12 kuni 21, osutab leheküljetabeli elemendile RTE. Leheküljetabelid on samuti 4 KB pikad ja tabelielemendid käsitlevad kokku 1024 lehekülge. Teisisõnu, teine ​​väli käsitleb konkreetset lehte.
Lõpuks määrab lehekülje nihke kolmas väli, mis hõivab lineaarse aadressi alumised 12 bitti. Seega saab protsess adresseerida ühe tabelikataloogiga

1024 x 1024 x 4096 = 4 GB füüsilist mälu.

Ülaltoodud joonis näitab, kuidas protsessori lehe aadressiüksus teisendab lineaarse aadressi füüsiliseks aadressiks. Protsessor kasutab PDE aadressivälja (kõrge 10 bitti) tabelikataloogi indeksina. Leitudelement sisaldab lehe tabeli aadressi. Teine PTE lineaarne aadressiväli võimaldab protsessoril validasoovitud tabelielement, mis käsitleb füüsilist lehte. Lisades nihkega lehe alguse aadressi,salvestatud kolmandale väljale, saab protsessor 32-bitise füüsilise aadressi.

Enamik kaasaegseid protsessoreid, eriti Inteli protsessorite perekond, paigutavad andmed viimaste kasutatud lehtede kohta ülikiiresse vahemällu. Alles siis, kui protsessor ei leia sellest vahemälust vajalikku lehte, pääseb ta ligi kataloogi ja lehetabeleid. Reeglina jõuab 99-98% aadressilinkidest vahemällu, ilma et oleks vaja aadressi tõlkimist, et pääseda ligi RAM-ile, kus asuvad kataloog ja tabelid.
Iga lehe tabeli element sisaldab mitut erinevat kirjeldavat välja

lehe omadused. Väljad PTE:


P
RAM-i kohaloleku märk. Juurdepääs lehele, mida pole mälus (P=0), põhjustab lehe tõrke, erand, millest protsessor teavitab kerneli, mis seda vastavalt käsitleb.
R/W Õigus lugeda ainult lehte (R/W=0) või lugeda ja kirjutada (R/W=1)

U/S
Juurdepääsuõigused. Kui U/S=0, siis ainult privilegeeritud ülesanded(kernel) pääsevad ligi lehtede aadressidele. Vastasel juhul juurdepääslehel on kõik ülesanded.
Aadress Lehe alguse füüsiline aadress (baasaadress)

Protsessi aadressiruum

Kerneli aadressiruum on tavaliselt sama, mis parajasti töötava protsessi aadressiruum. Sel juhul väidetakse, et tuum asub protsessiga samas kontekstis. Iga kord, kui arvutusressursid protsessi üle kantakse, süsteem taastatakse
selle protsessi ülesande kontekst, sealhulgas üldotstarbeliste registrite väärtused, segmendiregistrid ja viidad lehetabelitele, mis kaardistavad tegumirežiimi protsessi virtuaalmälu. Samal ajal jääb süsteemi kontekst kõigi protsesside jaoks muutumatuks. Protsessi aadressiruumi vaade on näidatud alloleval joonisel.

Iga kaasaegse mitmeprogrammilise OS-i üks peamisi alamsüsteeme, mis mõjutab otseselt arvuti tööd, on protsesside ja lõimede haldamise alamsüsteem. Selle alamsüsteemi põhifunktsioonid:

    protsesside ja lõimede loomine;

    protsesside ja lõimede varustamine vajalike ressurssidega;

    protsessi isoleerimine;

    protsesside ja lõimede täitmise ajastamine (üldiselt tuleks rääkida ka ülesannete planeerimisest);

    niidi saatmine;

    protsessidevahelise interaktsiooni korraldamine;

    protsesside ja lõimede sünkroniseerimine;

    protsesside ja lõimede lõpetamine ja hävitamine.

1. Viis peamist sündmust viivad protsessi loomiseni:

    töötava protsessi taotluse täitmine protsessi loomiseks;

    kasutaja taotlus protsessi loomiseks, näiteks interaktiivsel sisselogimisel;

    algatada paketttöö;

    mis tahes teenuste toimimiseks vajaliku protsessi loomine operatsioonisüsteemi poolt.

Tavaliselt luuakse OS-i käivitamisel mitu protsessi. Mõned neist on kõrge prioriteediga protsessid, mis suhtlevad kasutajatega ja täidavad määratud tööd. Ülejäänud protsessid on taustprotsessid, need ei ole seotud konkreetsete kasutajatega, vaid täidavad erifunktsioone – näiteks seotud e-posti, veebilehtede, väljundiga pitsat, faili edastus Kõrval võrk, programmide perioodiline käivitamine (näiteks ketta defragmentimine) jne. Taustaprotsesse nimetatakse deemoniteks.

Võib luua uue protsessi Kõrval praeguse protsessi taotlus. Uute protsesside loomine on kasulik juhtudel, kui täidetava ülesande saab kõige hõlpsamini moodustada seotud, kuid siiski iseseisvate, interakteeruvate protsesside kogumina. Interaktiivsetes süsteemides kasutaja saab programmi käivitada, tippides klaviatuuril käsu või topeltklõpsates programmi ikoonil. Mõlemal juhul luuakse uus protsess ja käivitada seal on programmid. IN partii töötlemise süsteemid suurarvutites esitavad kasutajad töö (võib-olla kaugjuurdepääsu kasutades) ning OS loob uue protsessi ja alustab järgmine ülesanne järjekorrast, kui vajalikud ressursid vabanevad.

2. Tehnilisest vaatenurgast moodustub kõigil neil juhtudel uus protsess ühtemoodi: praegune protsess käivitab süsteemi nõuda uue protsessi loomiseks. Protsesside ja lõimede haldamise allsüsteem vastutab protsesside varustamise eest vajalike ressurssidega. OS hoiab mälus spetsiaalseid teabestruktuure, milles ta salvestab, millised ressursid igale protsessile eraldatakse. See võib määrata protsessile ressursse ainsaks kasutamiseks või ühiskasutuseks teiste protsessidega. Osa ressursse eraldatakse protsessile selle loomisel ja osa dünaamiliselt Kõrval päringud sisse ettevalmistusaeg. Protsessile võib ressursse eraldada kogu selle elueaks või ainult teatud perioodiks. Nende funktsioonide täitmisel suhtleb protsessijuhtimise alamsüsteem teiste OS-i alamsüsteemidega, mille eest vastutavad ressursside haldamine, nagu mäluhalduse alamsüsteem, sisend/väljund alamsüsteem, failisüsteem.

3. Et vältida protsesside segamist ressursside eraldamine ning samuti ei saanud kahjustada üksteise koode ja andmeid, OS-i kõige olulisem ülesanne on isoleerida üks protsess teisest. Selle jaoks operatsioonisüsteem annab igale protsessile eraldi virtuaalse aadressiruumi, nii et ükski protsess ei pääse otseselt juurde teise protsessi käskudele ja andmetele.

4. OS-is, kus on olemas protsessid ja lõimed, käsitletakse protsessi kui taotlust tarbida igat tüüpi ressursse, välja arvatud ühe protsessori aja. See kõige olulisem ressurss operatsioonisüsteem jaotab teiste tööüksuste vahel - lõimed, mis said oma nime tänu sellele, et nad esindavad käskude jadasid (käskude täitmislõime). Üleminek ühe lõime täitmiselt teisele toimub selle tulemusenaplaneerimine Javäljasaatmine . Töö Kõrval Praeguse lõime katkestamise ja käivitamise aja määramist nimetatakse ajastamiseks. Lõimede ajastamine toimub protsessi ja lõime deskriptoritesse salvestatud teabe põhjal. Planeerimisel arvestatakse sellega lõime prioriteet, nende ooteaeg järjekorras, kogunenud ettevalmistusaeg, I/O juurdepääsu intensiivsus ja muud tegurid.

5. Ärasaatmine seisneb planeerimise tulemusena leitud lahenduse elluviimises, s.o. protsessori vahetamisel ühelt lõimelt teisele. Saatmine toimub kolmes etapis:

    praeguse lõime konteksti salvestamine;

    uue lõime käivitamine täitmiseks.

6. Kui süsteem töötab korraga mitut sõltumatut ülesannet, tekivad lisaprobleemid. Kuigi lõimed tekivad ja käitatakse sünkroonselt, võivad nad vajada suhtlemist, näiteks andmete vahetamisel. Omavahel suhtlemiseks saavad protsessid ja lõimed kasutada laia valikut võimalusi: kanalid (in UNIX), postkastid ( Windows), kaugprotseduurikõne, pistikupesad (in Windowsühendada protsesse erinevatel masinatel). Niitide kiiruste sobitamine on väga oluline ka võistlustingimuste vältimiseks (kus mitu lõime üritavad sama muuta faili), ummikseisud ja muud kokkupõrked, mis tekivad ressursside jagamisel.

7. Sünkroonimine lõimed on protsesside ja lõimehalduse alamsüsteemi üks olulisemaid funktsioone. Kaasaegsed operatsioonisüsteemid pakuvad mitmesuguseid sünkroonimismehhanisme, sealhulgas semafore, mutexe, kriitilisi piirkondi ja sündmusi. Kõik need mehhanismid töötada lõimedega, mitte protsessidega. Sellepärast millal voolu semaforil olevad plokid, võivad selle protsessi teised lõimed töötamist jätkata.

8. Iga kord, kui protsess lõpeb, – ja see juhtub ühe järgmistest sündmustest: normaalne väljuda, väljuda Kõrval viga, väljuda Kõrval saatuslik viga, hävitamine teise protsessiga - OS astub samme, et "puhastada jäljed" selle olemasolust süsteemis. Protsessihalduse alamsüsteem sulgeb kõik failid, millega protsess töötas, vabastades RAM-i alad, mis on eraldatud protsessi koodide, andmete ja süsteemi infostruktuuride jaoks. Esitatud parandus kõikvõimalikud OS-i järjekorrad ja nimekirja ressursid, mis sisaldasid linke lõpetatavale protsessile.

protsessi isoleerimine;
  • protsesside ja lõimede täitmise ajastamine (üldiselt tuleks rääkida ka ülesannete planeerimisest);
  • niidi saatmine;
  • protsessidevahelise suhtluse korraldamine;
  • protsesside ja lõimede sünkroniseerimine;
  • protsesside ja lõimede lõpetamine ja hävitamine.
  • Viis peamist sündmust viivad protsessi loomiseni:

  • töötava protsessi taotluse täitmine protsessi loomiseks;
  • kasutaja taotlus protsessi loomiseks, näiteks interaktiivsel sisselogimisel;
  • algatada paketttöö;
  • mis tahes teenuste toimimiseks vajaliku protsessi loomine operatsioonisüsteemi poolt.
  • Tavaliselt luuakse OS-i käivitamisel mitu protsessi. Mõned neist on kõrge prioriteediga protsessid, mis suhtlevad kasutajatega ja täidavad määratud tööd. Ülejäänud protsessid on taustprotsessid, need ei ole seotud konkreetsete kasutajatega, vaid täidavad erifunktsioone - näiteks seotud e-posti, veebilehtede, printimise, failide üle võrgu edastamisega, programmide perioodilise käivitamisega (näiteks ketta defragmentimine) jne. Taustaprotsesse nimetatakse deemoniteks.

    Uue protsessi saab luua praeguse protsessi nõudmisel. Uute protsesside loomine on kasulik juhtudel, kui täidetava ülesande saab kõige hõlpsamini moodustada seotud, kuid siiski iseseisvate, interakteeruvate protsesside kogumina. Interaktiivsetes süsteemides saab kasutaja programmi käivitada, tippides klaviatuuril käsu või topeltklõpsates programmi ikoonil. Mõlemal juhul luuakse uus protsess ja programm käivitatakse selles. IN partiitöötlussüsteemid suurarvutites esitavad kasutajad töö (võimalik, et kaugjuurdepääsu kasutades) ning OS loob uue protsessi ja alustab vajalike ressursside vabanemisel järgmist tööd järjekorrast.

    Tehnilisest aspektist vaadatuna moodustub kõigil neil juhtudel uus protsess ühtemoodi: praegune protsess täidab süsteemipäringu uue protsessi loomiseks. Protsesside ja lõimede haldamise allsüsteem vastutab protsesside varustamise eest vajalike ressurssidega. OS hoiab mälus spetsiaalseid teabestruktuure, milles ta salvestab, millised ressursid igale protsessile eraldatakse. See võib määrata protsessile ressursse ainsaks kasutamiseks või ühiskasutuseks teiste protsessidega. Osa ressursse eraldatakse protsessile selle loomisel ja osa eraldatakse dünaamiliselt taotluste alusel ettevalmistusaeg. Protsessile võib ressursse eraldada kogu selle elueaks või ainult teatud perioodiks. Nende funktsioonide täitmisel suhtleb protsessijuhtimise alamsüsteem teiste OS-i alamsüsteemidega, mille eest vastutavad ressursside haldamine, nagu mäluhalduse alamsüsteem, sisend/väljund alamsüsteem, failisüsteem.

    Et vältida protsesside segamist ressursside eraldamine ning samuti ei saanud kahjustada üksteise koode ja andmeid, kõige tähtsam ülesanne OS on ühe protsessi isoleerimine teisest. Selle jaoks operatsioonisüsteem annab igale protsessile eraldi virtuaalse aadressiruumi, nii et ükski protsess ei pääse otseselt juurde teise protsessi käskudele ja andmetele.

    OS-is, kus on olemas protsessid ja lõimed, käsitletakse protsessi kui taotlust tarbida igat tüüpi ressursse, välja arvatud ühe protsessori aja. Seda kriitilist ressurssi jagab operatsioonisüsteem teiste tööüksuste - lõimede vahel, mis said oma nime tänu sellele, et nad esindavad käskude jadasid (käskude täitmislõime). Üleminek ühe lõime täitmiselt teisele toimub selle tulemusena planeerimine Ja väljasaatmine. Tööd, mille käigus määratakse kindlaks, millal praegune lõime katkestada ja millal lasta käitada, nimetatakse ajastamiseks. Lõimede ajastamine toimub protsessi ja lõime deskriptoritesse salvestatud teabe põhjal. Planeerimisel arvestatakse sellega lõime prioriteet, nende ooteaeg järjekorras, kogunenud ettevalmistusaeg, I/O juurdepääsu intensiivsus ja muud tegurid.

    Ärasaatmine seisneb planeerimise tulemusena leitud lahenduse elluviimises, s.o. protsessori vahetamisel ühelt lõimelt teisele. Saatmine toimub kolmes etapis:

    • praeguse lõime konteksti salvestamine;
    • ajastamise tulemusena valitud lõime konteksti laadimine;
    • uue lõime käivitamine täitmiseks.

    Kui süsteem töötab korraga mitut sõltumatut ülesannet, tekivad lisaprobleemid. Kuigi lõimed tekivad ja käitatakse sünkroonselt, võivad nad vajada suhtlemist, näiteks andmete vahetamisel. Omavaheliseks suhtlemiseks saavad protsessid ja lõimed kasutada väga erinevaid võimalusi: torud (UNIXis), postkastid (Windows), kaugprotseduuride kõned, pistikupesad (Windowsis ühendavad need protsessid erinevates masinates). Lõime kiiruste sobitamine on väga oluline ka võistlustingimuste (kus mitu lõime üritavad sama faili muuta), ummikseisude ja muude ressursside jagamisel tekkivate kokkupõrgete vältimiseks.

    Sünkroonimine lõimed on protsesside ja lõimehalduse alamsüsteemi üks olulisemaid funktsioone. Kaasaegsed operatsioonisüsteemid pakuvad mitmesuguseid sünkroonimismehhanisme, sealhulgas semafore, mutexe, kriitilisi piirkondi ja sündmusi. Kõik need mehhanismid töötavad lõimede, mitte protsessidega. Nii et kui lõime semafooril blokeerub, saavad teised selle protsessi lõimed tööd jätkata.

    Iga kord, kui protsess väljub – ühe järgmistest sündmustest: tavaline väljumine, veast väljumine, saatusliku veaga väljumine, teise protsessi poolt tapmine – võtab OS meetmeid oma jälgede puhastamiseks süsteemist. Protsessihalduse alamsüsteem sulgeb kõik failid, millega protsess töötas, vabastades RAM-i alad, mis on eraldatud protsessi koodide, andmete ja süsteemi infostruktuuride jaoks. Kõik võimalikud OS-i järjekorrad ja ressursside loend, millel olid lingid lõpetatava protsessiga, parandatakse.

    Nagu juba märgitud, toetada multiprogrammeerimine, OS peab ise kujundama need sisemised tööüksused, mille vahel protsessor ja muud arvutiressursid jaotatakse. Tekib küsimus: mida põhimõtteline erinevus need tööühikud, millise multiprogrammeerimise efekti saab nende kasutamisest ja millistel juhtudel tuleks neid operatsioonisüsteemi tööüksusi luua?

    Ilmselt koosneb igasugune arvutisüsteemi toiming mõne programmi täitmisest. Seetõttu on nii protsessi kui ka lõimega seotud teatud programmikood, mis väljastatakse käivitatava mooduli kujul. Lihtsamal juhul koosneb protsess ühest lõimest ja mõnel kaasaegsel operatsioonisüsteemil on see olukord endiselt olemas. Multiprogrammeerimine sellises OS-is viiakse see läbi protsessi tasemel. Kui interaktsioon on vajalik, pöörduvad protsessid operatsioonisüsteemi poole, mis vahendajana pakub neile protsessidevahelise suhtluse vahendeid - kanaleid, meili jagamisi, ühismälu sektsioone jne.

    Kuid süsteemides, millel pole lõime mõistet, tekivad protsessis paralleelsete arvutuste korraldamisel probleemid. Ja selline vajadus võib tekkida. Asi on selles, et üht protsessi ei saa kunagi kiiremini käivitada kui ühe programmi režiimis. Ühe protsessi sees töötaval rakendusel võib aga olla sisemine paralleelsus, mis põhimõtteliselt võiks selle lahendamist kiirendada. Kui programm näeb ette näiteks juurdepääsu välisseadmele, siis selle toimingu ajal on võimalik mitte blokeerida kogu protsessi täitmist, vaid jätkata arvutusi mõnes teises programmi harus.

    Mitme töö paralleelne teostamine ühes interaktiivne rakendus parandab kasutaja efektiivsust. Seega, kui töötate koos tekstiredaktor Soovitav on, et uue teksti tippimist oleks võimalik kombineerida selliste pikkade toimingutega nagu olulise osa teksti ümbervormindamine või salvestamine kohalikule või kaugkettale.

    Pole raske ette kujutada kompilaatori tulevast versiooni, mis suudab programmi tippimise pausi ajal automaatselt lähtekoodifaile kompileerida. Siis ilmuksid reaalajas hoiatused ja veateated ning kasutaja näeks kohe, kus ta valesti läks. Kaasaegsed tabelid arvutavad andmed taustal ümber niipea, kui kasutaja midagi muudab. Tekstitöötlusprogrammid jagavad teksti lehtedeks, kontrollivad selle õigekirja ja grammatilisi vigu, kirjutades taustal, salvestades teksti iga paari minuti järel jne. Kõigil neil juhtudel kasutatakse niite arvutuste paralleelseerimiseks.

    Need ülesanded võiks määrata programmeerijale, kes kirjutaks dispetšerprogrammi, mis rakendab paralleelsust ühes protsessis. See on aga väga raske ja programm ise oleks väga segane ja raskesti silutav.

    Teine lahendus on luua ühe rakenduse jaoks mitu protsessi iga paralleeli jaoks