Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

Sissejuhatus operatsioonisĂŒsteemidesse

Tere, Habr! Soovin esitleda teile huvitavate artiklite tĂ”lgitud seeriat — OSTEP. KĂ€esolevas materjalis uuritakse sĂŒgavalt unix-laadsete operatsioonisĂŒsteemide toimimist, nimelt — protsesside, erinevate planeerijate, mĂ€lu ja teiste sarnaste komponentide töötamist, mis koosnevad kaasaegsest operatsioonisĂŒsteemist. KĂ”iki materjale saate nĂ€ha siin siit. Palun arvestage, et tĂ”lge on tehtud mitteprofessionaalselt (piisavalt vaba), kuid loodan, et ĂŒldine mĂ”te on sĂ€ilinud.

KÀesoleva aine laboritöid saab leida siit:

Teised osad:

Ja vĂ”ite ka kĂŒlastada minu kanalit Telegramis =)

Vaatame kĂ”ige fundamentaalsemat abstraktsiooni, mida operatsioonisĂŒsteem kasutajatele pakub: protsess. Protsessi mÀÀratlemine on ĂŒsna lihtne — see on töötav programm. Programm iseenesest on elutu asi, mis paikneb kettal — see on juhiste kogum ja vĂ”ib-olla mĂ”ned staatilised andmed, oodates kĂ€ivitamise hetke. Just operatsioonisĂŒsteem vĂ”tab need baitid ja kĂ€ivitab need, muutes programmi millegi kasulikuks.
Sagedamini soovivad kasutajad kĂ€ivitada rohkem kui ĂŒhte programmi korraga, nĂ€iteks vĂ”ite oma sĂŒlearvutis avada brauseri, mĂ€ngu, meediapleieri, tekstiredaktori ja nii edasi. Tegelikult vĂ”ib tĂŒĂŒpiline sĂŒsteem kĂ€ivitada korraga kĂŒmneid ja sadu protsesse. See asjaolu muudab sĂŒsteemi kasutamise lihtsamaks, te ei pea kunagi muretsema, kas CPU on vaba, lihtsalt kĂ€ivitada programmid.

Sealt tuleneb probleem: kuidas tagada mitme CPU illusioon? Kuidas operatsioonisĂŒsteem loob illusiooni peaaegu piiramatust arvust CPU-dest, isegi kui teil on ainult ĂŒks fĂŒĂŒsiline CPU?

OperatsioonisĂŒsteem loob seda illusiooni CPU virtualiseerimise kaudu. KĂ€ivitades ĂŒhe protsessi, seejĂ€rel peatades selle, kĂ€ivitades teise protsessi jne, suudab operatsioonisĂŒsteem sĂ€ilitada mulje, et eksisteerib palju virtuaalseid CPU-sid, kuigi tegelikult on see ĂŒks vĂ”i mitu fĂŒĂŒsilist protsessorit. Seda tehnikat nimetatakse CPU ressursside ajajaotuseksSee tehnika vĂ”imaldab kasutajatel kĂ€ivitada nii palju samaseid protsesse kui nad soovivad. Sellise lahenduse hind on jĂ”udlus – kuna kui mitu protsessi jagavad CPU-d, siis iga protsess töödeldakse aeglasemalt.
Virtuaalsuse elluviimiseks on CPU-le vajalik nii madala kui ka kĂ”rge taseme tugi. Madala taseme toeks nimetatakse mehhanismideks — need on madala taseme meetodid vĂ”i protokollid, mis rakendavad vajaliku funktsionaalsuse osa. Üheks selliseks funktsionaalsuseks on konteksti vahetamine, mis annab operatsioonisĂŒsteemile vĂ”imaluse peatada ĂŒhe programmi ja kĂ€ivitada protsessoril teise programmi. Selline ajajagamine on rakendatud kĂ”igis kaasaegsetes operatsioonisĂŒsteemides.
Nende mehhanismide tipus on mĂ”ningane loogika, mis on kirjutatud operatsioonisĂŒsteemi, vormis „poliitika”. Poliitika on teatud otsuste tegemise algoritm operatsioonisĂŒsteemis. Sellised poliitikad otsustavad nĂ€iteks, millist programmi tuleks (kĂ€skude loendist) esmajĂ€rjekorras kĂ€ivitada. NĂ€iteks lahendab seda ĂŒlesannet poliitika, mida nimetatakse plaanijaks (scheduling policy) ja otsuste tegemisel tugineb ta sellistele andmetele nagu: kĂ€ivitamise ajalugu (milline programm on viimase minuti jooksul kĂ”ige kauem kĂ€ivitatud), millist koormust see protsess tekitab (milliseid tĂŒĂŒpe programme on kĂ€ivitatud), jĂ”udluse mÔÔdikud (kas sĂŒsteem on optimeeritud interaktiivseks suhtlemiseks vĂ”i lĂ€bilaskevĂ”imeks) jne.

Abstraktsioon: protsess

Abstraktsioon töötavast programmist, mida operatsioonisĂŒsteem tĂ€idab, on see, mida me nimetame protsess. Nagu varem mainitud, on protsess lihtsalt töötav programm, igal hetkel. Programm, mille abil saame saada kokkuvĂ”tlikku teavet erinevatest sĂŒsteemiressurssidest ja millele see programm viitab vĂ”i millele see programmi tĂ€itmise kĂ€igus juurdub.
Selleks, et mĂ”ista protsessi komponente, on oluline mĂ”ista sĂŒsteemi olekuid: mida programm oma töö ajal lugeda vĂ”i muuta saab. Igal hetkel tuleb mĂ”ista, millised sĂŒsteemi elemendid on programmi tĂ€itmiseks olulised.
Üks silmapaistvamaid sĂŒsteemi seisundi elemente, mida protsess sisaldab, on mĂ€lu. Juhised asuvad mĂ€lus. Andmed, mida programm loeb vĂ”i kirjutab, asuvad samuti mĂ€lus. SeetĂ”ttu on mĂ€lu, millele protsess saab juurdepÀÀsu (nn adresseerimisruum), osa protsessist.
SĂŒsteemi seisundi osana on ka registrid. Paljud juhised on suunatud registrite vÀÀrtuste muutmisele vĂ”i nende vÀÀrtuste lugemisele, mistĂ”ttu on registrid samuti olulised protsessi töö jaoks.
Peab mĂ€rkima, et masina seisund koosneb ka mĂ”nest spetsiaalsest registrist. NĂ€iteks IP — kĂ€skluse nĂ€itaja — juhib juhiseid, mida programm hetkel tĂ€idab. Veel on olemas stack pointer ja sellega seotud frame pointer, mida kasutatakse funktsioonide parameetrite, lokaalsete muutujate ja tagasipöördumisaadresside haldamiseks.
LĂ”puks pöörduvad programmid sageli pĂŒsivĂ€lemisse (ROM). Selline „I/O” (sisendi/vĂ€ljundi) teave peaks sisaldama loendit failidest, mis on protsessi kĂ€igus avatud.

Process API

Protsessi töö mĂ”istmise parandamiseks vaatleme sĂŒsteemikĂ”nede nĂ€iteid, mis peaksid olema mis tahes operatsioonisĂŒsteemi liideses. Need API-d on mingil kujul saadaval igas operatsioonisĂŒsteemis.

● Loo (loomine): OperatsioonisĂŒsteemis peab olema mĂ”ni meetod, mis vĂ”imaldab luua uusi protsesse. Kui sisestate kĂ€su terminalis vĂ”i kĂ€ivitate rakenduse ikoonile kahekordse klikiga, saadetakse operatsioonisĂŒsteemile pĂ€ring uue protsessi loomiseks ja mÀÀratud programmi kĂ€ivitamiseks.
● Kustutamine: Kui protsessi loomise liides on olemas, peab operatsioonisĂŒsteem ka vĂ”imaldama protsessi sunniviisilist kustutamist. Enamik programme kĂ€ivitatakse ja lĂ”petatakse loomulikult omaette nende töö kĂ€igus. Vastupidisel juhul sooviks kasutaja neid katkestada, mistĂ”ttu oleks protsessi peatamise liides teretulnud.
● Oota (oodamine): MĂ”nikord on kasulik oodata protsessi lĂ”petamist, seetĂ”ttu pakutakse mĂ”ningaid liideseid, mis vĂ”imaldavad ootamist.
● Muu juhtimine (erinev juhtimine): Lisaks protsessi lĂ”petamisele ja ootamisele on olemas ka muid erinevaid juhtimismeetodeid. NĂ€iteks pakuvad enamik operatsioonisĂŒsteeme vĂ”imalust protsessi kĂŒlmutada (st lĂ”petada selle tĂ€itmine teatud ajaks) ja hiljem taastada (tegevuse jĂ€tkamine)
● Oleku (olek): On olemas erinevad liideseed, et saada teavet protsessi oleku kohta, nĂ€iteks selle töö kestus vĂ”i millises olekus see praegu on.

Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

Protsessi loomine: ĂŒksikasjad

Üks huvitav asi on see, kuidas programmid tĂ€pselt protsessideks muudetakse. Eriti, kuidas operatsioonisĂŒsteem tĂ”stab ja kĂ€ivitab programmi. Kuidas tĂ€pselt protsess luuakse.
Esiteks peab operatsioonisĂŒsteem laadima programmi koodi ja staatilised andmed mĂ€llu (protsessi aadressiruumi). Programmid asuvad tavaliselt kettal vĂ”i tahkisketasel mingis kĂ€ivitatavas formaadis. Seega nĂ”uab programmi ja staatiliste andmete laadimine mĂ€llu, et operatsioonisĂŒsteem saaks lugeda neid baite kettalt ja paigutada need kuhugi mĂ€llu.

Varasemates operatsioonisĂŒsteemides tehti laadimist protsessi kĂ€rsitult (eagerly), see tĂ€hendab, et kood laaditi mĂ€llu tervikuna enne, kui programm kĂ€ivitati. Kaasaegsed operatsioonisĂŒsteemid teevad seda laiskalt (lazily), laadides koodi vĂ”i andmeid ainult siis, kui neid vajatakse programmi tĂ€itmise ajal.

PĂ€rast seda, kui kood ja staatilised andmed on mĂ€llu laetud, peab operatsioonisĂŒsteem enne protsessi kĂ€ivitamist veel mĂ”ned asjad Ă€ra tegema. Teatud hulk mĂ€lu peab olema eraldatud virnaks. Programmid kasutavad virna kohalikeks muutujateks, funktsioonide parameetriteks ja tagasituleku aadressideks.. OperatsioonisĂŒsteem eraldab selle mĂ€lu ja annab selle protsessile. Virn vĂ”ib samuti olla eraldatud teatud argumentidega, tĂ€pselt tĂ€idab see peafunktsiooni main() parameetreid, nĂ€iteks massiiviga argc ja argv.

OperatsioonisĂŒsteem vĂ”ib samuti eraldada teatud hulga mĂ€lu programmi kuhja (heap) jaoks. Kuhja kasutatakse programmide poolt selgelt kĂŒsitud dĂŒnaamiliselt eraldatud andmete jaoks.. Programmid kĂŒsivad seda ruumi, kutsudes vĂ€lja funktsiooni. malloc() ja puhastavad selgelt, kutsudes vĂ€lja funktsiooni. free(). Kuhja on vajalik selliste andmestructuuride jaoks nagu: seotud loendid, hajus-tabelid, puud ja teised. Alguses eraldatakse kuhja jaoks vĂ€ike kogus mĂ€lu, kuid aja jooksul vĂ”ib programmi töö kĂ€igus kuhja kaudu rohkem mĂ€lu taotleda, kasutades raamatukogu API kutset malloc(). OperatsioonisĂŒsteem on kaasatud protsessi, kus eraldatakse rohkem mĂ€lu, et aidata neid kutseid rahuldada.

OperatsioonisĂŒsteem tĂ€idab ka initsialiseerimise ĂŒlesandeid, eriti neid, mis on seotud sisendi-vĂ€ljundi funktsioonidega. NĂ€iteks UNIX sĂŒsteemides on igal protsessil vaikimisi 3 avatud failikĂ€sitletajat, mis on seotud standardse sisendi, vĂ€ljundi ja vigadega. Need kĂ€sitletajad vĂ”imaldavad programmidel lugeda sisendit terminalist ja vĂ€ljastada teavet ekraanile.

Seega, laadides koodi ja staatilisi andmeid mĂ€llu, luues ja initsialiseerides kuhja ning tehes teisi sisendi-vĂ€ljundi ĂŒlesandeid, valmistab operatsioonisĂŒsteem ette keskkonna protsessi kĂ€ivitamiseks. LĂ”puks jÀÀb viimane ĂŒlesanne: kĂ€ivitada programm selle sisenemispunktist, mida nimetatakse funktsiooniks main(). Funktsioonile main() ĂŒleminekul annab operatsioonisĂŒsteem juhtimise CPU-le, mis oli just loodud protsess, mistĂ”ttu programm hakkab töötama.

Protsessi seisund

NĂŒĂŒd, kui meil on mingisugune arusaam sellest, mis on protsess ja kuidas see luuakse, loetleme protsessi seisundid, milles see vĂ”ib asuda. KĂ”ige lihtsamal kujul vĂ”ib protsess olla ĂŒhes jĂ€rgmistest seisunditest:
● KĂ€imas. KĂ€ivitamise seisundis tĂ€idetakse protsess protsessoril. See tĂ€hendab, et toimub kĂ€su tĂ€itmine.
● Valmis. Valmiduse seisundis on protsess valmis kĂ€ivituma, kuid mingil pĂ”hjusel operatsioonisĂŒsteem ei tĂ€ida seda antud hetkel.
● Blokeeritud. Blokeeritud seisundis tĂ€idab protsess mingeid toiminguid, mis ei lase tal olla valmis tĂ€itmiseks, kuni mingisugune sĂŒndmus toimub. Üks levinud nĂ€ide on see, kui protsess initsialiseerib IO-operatsiooni, muutub see blokeerituks ning seega vĂ”ib mĂ”ni teine protsess kasutada protsessorit.

Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

Kujutame vaimu need seisundid graafina. Nagu pildilt nĂ€ha, vĂ”ib protsessi olek varieeruda RUNNING ja READY vahel operatsioonisĂŒsteemi (OS) valikul. Kui protsessi olek muutub READY-lt RUNNING-iks, tĂ€hendab see, et protsess on kavandatud. Vastupidises suunas — on kavandamisest eemaldatud. Hetkel, kui protsess muutub BLOCKED-iks, nĂ€iteks IO operatsiooni algatamise korral, hoiab OS seda olekut kuni mingi sĂŒndmuse toimumiseni, nĂ€iteks IO lĂ”petamiseni. Sel hetkel toimub ĂŒleminek olekusse READY ja vĂ”imalik, et koheselt olekusse RUNNING, kui OS nii otsustab.
Vaatame nĂ€idet, kuidas kaks protsessi lĂ€bivad neid olekuid. Esiteks kujutame ette, et mĂ”lemad protsessid on kĂ€ivitatud ja igaĂŒks kasutab ainult CPU-d. Sel juhul nĂ€evad nende seisundid vĂ€lja jĂ€rgmiselt.

Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

JĂ€rgmisel nĂ€itel kĂŒsib esimene protsess pĂ€rast teatud töö tegemist IO-d ja lĂ€heb BLOCKED olekusse, andes teisele protsessile vĂ”imaluse kĂ€ivituda (Joonis 1.4). OS nĂ€eb, et protsess 0 ei kasuta CPU-d ning kĂ€ivitab protsessi 1. Protsessi 1 tĂ€itmise ajal — IO lĂ”ppeb ja protsessi 0 staatus muutub READY-ks. LĂ”puks lĂ”petab protsess 1 oma töö ja selle lĂ”petamisel kĂ€ivitatakse protsess 0, kes tĂ€idab oma ĂŒlesande ja lĂ”petab töö.

Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

Andmestruktuur

OS ise on programm ja nagu iga teine programm, omab ka teatud vÔtme andmestruktuure, mis jÀlgivad erinevat vastavat teavet. Iga protsessi oleku jÀlgimiseks toetatakse OS-is teatud protsesside nimekirja kÔigi READY olekus olevate protsesside kohta ja teatud lisainfot tööprotsesside jÀlgimiseks, mis on hetkel kÀimas. Samuti peab OS jÀlgima ka blokeeritud protsesse. PÀrast IO lÔpetamist peab OS Àratama vajaliku protsessi ja viima selle kÀivitamiseks valmisolekusse.

Seega peab OS sÀilitama protsessori registrite oleku. Protsessi peatamise hetkel salvestatakse registrite olek protsessi aadressiruumi ja selle jÀtkamine toimub registrite vÀÀrtuste taastamisega, vÔimaldades selle protsessi jÀtkamist.

Lisaks olekutele ready, blocked, running on veel mĂ”ned teised olekud. MĂ”nikord loomise hetkel vĂ”ib protsess olla olekus INIT. LĂ”puks vĂ”ib protsess olla viidud olekusse FINAL, kui see on juba lĂ”petatud, kuid informatsioon selle kohta ei ole veel kustutatud. UNIX-sĂŒsteemides nimetatakse seda seisundiks zombi-protsess. See olek on kasulik juhtudel, kui vanemprotsess soovib teada jĂ€rglase tagastuskoodi, nĂ€iteks tavaliselt 0 signaali Ă”nnestumise kohta, ja 1 vea korral, kuid programmeerijad vĂ”ivad kasutada tĂ€iendavaid vĂ€ljastuskoode, signaalides erinevaid probleeme. Protsessi lĂ”petamisel teeb vanemprotsess viimase sĂŒsteemikĂ”ne, nĂ€iteks wait(), et oodata jĂ€rglase töö lĂ”petamist ja teavitada operatsioonisĂŒsteemi, et on vĂ”imalik kustutada kĂ”ik hiljuti lĂ”petatud protsessiga seotud andmed.

Operating Systems: Three Easy Pieces. Part 2: Abstraktsioon: Protsess (tÔlge)

Loengu vÔtmeletked:

● Protsess — peamine abstraktsioon töötavast programmist operatsioonisĂŒsteemis. Igal hetkel saab protsessi kirjeldada selle oleku jĂ€rgi: mĂ€lu sisu selle aadressiruumis, protsessori registrite sisu, sealhulgas instruction pointer ja stack pointer, samuti IO teave, nĂ€iteks avatud failid, millega tegeletakse lugemise vĂ”i kirjutamisega.
● Process API koosneb kutsetest, mida programmid vĂ”ivad protsesside suhtes teha. Tavaliselt on need kutsed loomise, kustutamise vĂ”i teistega.
● Protsess on ĂŒhes paljusid olekuid, sealhulgas running, ready, blocked. Erinevad sĂŒndmused, nagu ajakava muutmine, ajakava vĂ€ljaarvamine vĂ”i ootamine, vĂ”ivad protsessi olekut ĂŒhest teise muuta.
● Protsesside loend sisaldab teavet sĂŒsteemis olevate kĂ”igi protsesside kohta. Iga kirje selles on tuntud kui protsessi juhtimise plokk, mis reaalsuses on struktuur, mis sisaldab kogu vajalikku teavet konkreetse protsessi kohta. 

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster