Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Hyrje në Sistemet Operative

Hej Habr! Do të doja të sjell në vëmendjen tuaj një seri artikujsh-përkthimesh të një letërsie interesante për mendimin tim - OSTEP. Ky material diskuton mjaft thellë punën e sistemeve operative të ngjashme me unix, domethënë punën me proceset, planifikuesit e ndryshëm, memorien dhe komponentët e tjerë të ngjashëm që përbëjnë një OS modern. Këtu mund të shihni origjinalin e të gjitha materialeve këtu. Ju lutem vini re se përkthimi është bërë në mënyrë joprofesionale (mjaft lirisht), por shpresoj se kam ruajtur kuptimin e përgjithshëm.

Punimet laboratorike mbi këtë temë mund të gjenden këtu:

Pjesë të tjera:

Ju gjithashtu mund të shikoni kanalin tim në telegram =)

Le të shohim abstraksionin më themelor që OS u ofron përdoruesve: procesin. Përkufizimi i procesit është mjaft i thjeshtë - është programi i ekzekutimit. Vetë programi është një gjë e pajetë e vendosur në disk - është një grup udhëzimesh dhe ndoshta disa të dhëna statike që presin të lansohen. Është OS që i merr ato bajt dhe i ekzekuton, duke e transformuar programin në diçka të dobishme.
Më shpesh, përdoruesit duan të ekzekutojnë më shumë se një program në të njëjtën kohë, për shembull, mund të ekzekutoni një shfletues, lojë, media player, redaktues teksti dhe të ngjashme në laptop. Në fakt, një sistem tipik mund të ekzekutojë dhjetëra ose qindra procese njëkohësisht. Ky fakt e bën sistemin më të lehtë për t'u përdorur, nuk duhet të shqetësoheni nëse CPU-ja është falas, thjesht ekzekutoni programe.

Kjo ngre problemin: si të sigurohet iluzioni i shumë CPU-ve? Si mundet OS të krijojë iluzionin e një numri pothuajse të pafund të CPU-ve, edhe nëse keni vetëm një CPU fizike?

Sistemi operativ e krijon këtë iluzion përmes virtualizimit të CPU-së. Duke filluar një proces, pastaj duke e ndaluar atë, duke filluar një proces tjetër, e kështu me radhë, OS mund të mbajë iluzionin se ka shumë CPU virtuale, kur në fakt do të ketë një ose më shumë procesorë fizikë. Kjo teknikë quhet ndarja e burimeve të CPU-së sipas kohës. Kjo teknikë i lejon përdoruesit të ekzekutojnë sa më shumë procese të njëkohshme që dëshirojnë. Kostoja e kësaj zgjidhjeje është performanca - pasi nëse CPU-ja ndahet nga disa procese, secili proces do të përpunohet më ngadalë.
Për të zbatuar virtualizimin e CPU-së, dhe veçanërisht për ta bërë atë mirë, OS ka nevojë për mbështetje të nivelit të ulët dhe të nivelit të lartë. Mbështetja e nivelit të ulët quhet mekanizmat janë metoda ose protokolle të nivelit të ulët që zbatojnë pjesën e kërkuar të funksionalitetit. Një shembull i një funksionaliteti të tillë është ndërrimi i kontekstit, i cili i jep OS mundësinë të ndalojë një program dhe të ekzekutojë një program tjetër në procesor. Kjo ndarje kohore zbatohet në të gjitha sistemet operative moderne.
Në krye të këtyre mekanizmave është një logjikë e integruar në OS, në formën e "politikave". Politikë është një algoritëm i caktuar vendimmarrës për sistemin operativ. Politika të tilla, për shembull, vendosin se cili program duhet të nisë së pari (nga një listë komandash). Kështu, për shembull, ky problem do të zgjidhet nga një politikë e quajtur planifikues (politika e planifikimit) dhe kur zgjedh një zgjidhje, ajo do të udhëhiqet nga të dhëna të tilla si: historia e fillimit (cili program u lançua më gjatë në minutat e fundit), çfarë ngarkese mbart ky proces (çfarë lloje programesh u nisën), matjet e performancës (nëse sistemi është optimizuar për ndërveprim ndërveprues ose për xhiro ) dhe kështu me radhë.

Abstraksion: proces

Abstraksioni i një programi ekzekutiv të ekzekutuar nga sistemi operativ është ajo që ne e quajmë procesi. Siç u përmend më herët, një proces është thjesht një program ekzekutiv, në çdo periudhë të menjëhershme kohore. Një program me të cilin ne mund të marrim informacion përmbledhës nga burime të ndryshme të sistemit që ky program i qaset ose ndikon gjatë ekzekutimit të tij.
Për të kuptuar komponentët e procesit, duhet të kuptoni gjendjet e sistemit: çfarë mund të lexojë ose ndryshojë programi gjatë funksionimit të tij. Në çdo kohë, ju duhet të kuptoni se cilët elementë të sistemit janë të rëndësishëm për ekzekutimin e programit.
Një nga elementet e dukshme të gjendjes së sistemit që përfshin procesi është kujtesa. Udhëzimet janë të vendosura në memorie. Të dhënat që programi lexon ose shkruan gjithashtu gjenden në memorie. Kështu, memoria që mund të adresojë një proces (e quajtur hapësira e adresave) është pjesë e procesit.
Gjithashtu pjesë e gjendjes së sistemit janë regjistrat. Shumë udhëzime synojnë ndryshimin e vlerës së regjistrave ose leximin e vlerës së tyre, dhe kështu regjistrat bëhen gjithashtu një pjesë e rëndësishme e funksionimit të procesit.
Duhet të theksohet se gjendja e makinës formohet edhe nga disa regjistra të veçantë. Për shembull, IP - treguesi i udhëzimeve — një tregues për udhëzimin që programi po ekzekuton aktualisht. Ka edhe tregues pirg dhe lidhur me të treguesi i kornizës, të cilat përdoren për të menaxhuar: parametrat e funksionit, variablat lokale dhe adresat e kthimit.
Së fundi, programet shpesh hyjnë në ROM (memorie vetëm për lexim). Ky informacion "I/O" (hyrje/dalje) duhet të përfshijë një listë të skedarëve të hapur aktualisht nga procesi.

API-ja e procesit

Për të përmirësuar të kuptuarit se si funksionon procesi, le të studiojmë shembuj të thirrjeve të sistemit që duhet të përfshihen në çdo ndërfaqe të sistemit operativ. Këto API janë të disponueshme në një formë ose në një tjetër në çdo OS.

Krijo (krijimi): OS duhet të përfshijë një metodë që ju lejon të krijoni procese të reja. Kur futni një komandë në terminal ose nisni një aplikacion duke klikuar dy herë mbi një ikonë, një telefonatë i dërgohet OS për të krijuar një proces të ri dhe më pas nis programin e specifikuar.
Largim: Meqenëse ekziston një ndërfaqe për krijimin e një procesi, OS duhet të ofrojë gjithashtu aftësinë për të detyruar heqjen e një procesi. Shumica e programeve natyrisht do të fillojnë dhe do të përfundojnë vetë ndërsa funksionojnë. Përndryshe, përdoruesi do të donte të ishte në gjendje t'i vriste ata dhe kështu një ndërfaqe për të ndaluar procesin do të ishte e dobishme.
Prit (në pritje): Ndonjëherë është e dobishme të prisni që një proces të përfundojë, kështu që ofrohen disa ndërfaqe që ofrojnë aftësinë për të pritur.
Kontroll i ndryshëm (kontrolli i ndryshëm): Përveç vrasjes dhe pritjes së procesit, ekzistojnë edhe metoda të tjera të ndryshme kontrolli. Për shembull, shumica e sistemeve operative ofrojnë aftësinë për të ngrirë një proces (të ndalojë ekzekutimin e tij për një periudhë të caktuar) dhe më pas ta rifillojë atë (vazhdoni ekzekutimin)
Statusi (gjendja): Ekzistojnë ndërfaqe të ndryshme për marrjen e disa informacioneve në lidhje me statusin e një procesi, si p.sh. sa kohë ka funksionuar ose në çfarë gjendje është aktualisht.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Procesi i krijimit: Detajet

Një nga gjërat interesante është se si saktësisht programet shndërrohen në procese. Sidomos se si OS e merr dhe e drejton programin. Si është krijuar saktësisht procesi.
Para së gjithash, OS duhet të ngarkojë kodin e programit dhe të dhënat statike në memorie (në hapësirën e adresave të procesit). Programet zakonisht ndodhen në një disk ose një disk të gjendjes së ngurtë në ndonjë format të ekzekutueshëm. Kështu, procesi i ngarkimit të programit dhe të dhënave statike në memorie kërkon që OS të jetë në gjendje t'i lexojë ato bajt nga disku dhe t'i vendosë ato diku në memorie.

Në sistemet e hershme operative, procesi i ngarkimit bëhej me padurim, që do të thotë se i gjithë kodi u ngarkua në memorie përpara se të niste programi. Sistemet operative moderne e bëjnë këtë me përtesë, domethënë ngarkojnë pjesë të kodit ose të dhënave vetëm kur programi i kërkon ato gjatë ekzekutimit të tij.

Pasi kodi dhe të dhënat statike të ngarkohen në memorien e OS, ka disa gjëra të tjera që duhen bërë përpara se procesi të mund të ekzekutohet. Duhet të ndahet një sasi memorie për pirgun. Programet përdorin pirgun për variablat lokale, parametrat e funksionit dhe adresat e kthimit. Sistemi operativ e alokon këtë memorie dhe ia jep procesit. Stack-i gjithashtu mund të ndahet me disa argumente, veçanërisht ai plotëson parametrat e funksionit main(), për shembull me një grup të argc dhe argv.

Sistemi operativ gjithashtu mund të ndajë pak memorie në grumbullin e programit. Grumbullimi përdoret nga programet për të kërkuar në mënyrë eksplicite të dhëna të alokuara në mënyrë dinamike. Programet e kërkojnë këtë hapësirë ​​duke thirrur funksionin malloc () dhe e fshin atë në mënyrë eksplicite duke thirrur funksionin falas (). Grumbullimi është i nevojshëm për strukturat e të dhënave si fletët e lidhura, tabelat hash, pemët dhe të tjera. Në fillim, një sasi e vogël memorie i ndahet grumbullit, por me kalimin e kohës, ndërsa programi funksionon, grumbulli mund të kërkojë më shumë memorie përmes thirrjes malloc() të API-së së bibliotekës. Sistemi operativ është i përfshirë në procesin e ndarjes së më shumë memorie për të ndihmuar në përmbushjen e këtyre thirrjeve.

Sistemi operativ do të kryejë gjithashtu detyra të inicializimit, veçanërisht ato që lidhen me I/O. Për shembull, në sistemet UNIX, çdo proces si parazgjedhje ka 3 përshkrues të skedarëve të hapur, për hyrjen, daljen dhe gabimin standard. Këto doreza lejojnë programet të lexojnë hyrjen nga terminali si dhe të shfaqin informacionin në ekran.

Kështu, duke ngarkuar kodin dhe të dhënat statike në memorie, duke krijuar dhe inicializuar stackin dhe duke bërë punë të tjera që lidhen me kryerjen e detyrave I/O, OS përgatit fazën që procesi të ekzekutohet. Më në fund, ka mbetur edhe një detyrë e fundit: ekzekutimi i programit përmes pikës së tij të hyrjes, i quajtur funksioni main(). Duke ekzekutuar funksionin main(), OS transferon kontrollin e CPU-së në procesin e krijuar rishtazi, kështu programi fillon të ekzekutohet.

Gjendja e procesit

Tani që kemi kuptuar pak se çfarë është një proces dhe si krijohet, le të rendisim gjendjet e procesit në të cilat mund të jetë. Në formën e tij më të thjeshtë, një proces mund të jetë në një nga këto gjendje:
drejtimin. Kur funksionon, procesi funksionon në procesor. Kjo do të thotë që udhëzimet janë duke u ekzekutuar.
Gati. Në gjendje gatishmërie, procesi është gati për të ekzekutuar, por për ndonjë arsye OS nuk e ekzekuton atë në kohën e caktuar.
I bllokuar. Në gjendjen e bllokuar, një proces kryen disa operacione që e pengojnë atë të jetë gati për t'u ekzekutuar derisa të ndodhë ndonjë ngjarje. Një shembull i zakonshëm është kur një proces fillon një operacion IO, ai bllokohet në mënyrë që një proces tjetër të mund të përdorë procesorin.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Ju mund t'i imagjinoni këto gjendje në formën e një grafiku. Siç mund ta shohim në foto, gjendja e procesit mund të ndryshojë midis RUNNING dhe READY sipas gjykimit të OS. Kur gjendja e një procesi ndryshon nga GATI në EKZEKUTIM, kjo do të thotë se procesi është planifikuar. Në drejtim të kundërt - hiqet nga paraqitja. Në momentin kur një proces bëhet BLOCK, për shembull, unë inicioj një operacion IO, OS do ta mbajë atë në këtë gjendje derisa të ndodhë ndonjë ngjarje, për shembull përfundimi i IO. në këtë moment kalimi në gjendjen READY dhe mundësisht menjëherë në gjendjen RUNNING nëse OS vendos kështu.
Le të shohim një shembull se si dy procese lëvizin nëpër këto gjendje. Për të filluar, le të imagjinojmë që të dy proceset janë duke u ekzekutuar dhe secili përdor vetëm CPU-në. Në këtë rast, shtetet e tyre do të duken kështu.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Në shembullin e mëposhtëm, procesi i parë, pas një kohe ekzekutimi, kërkon IO dhe hyn në gjendjen e BLOCKED, duke lejuar një proces tjetër të ekzekutohet (Figura 1.4). Sistemi operativ sheh që procesi 0 nuk po përdor CPU-në dhe fillon procesin 1. Ndërsa procesi 1 po ekzekutohet, IO është përfunduar dhe statusi i procesit 0 ndryshon në GATI. Më në fund, procesi 1 ka përfunduar, dhe pas përfundimit, procesi 0 fillon, ekzekuton dhe përfundon punën e tij.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Struktura e të dhënave

Vetë OS është një program dhe ashtu si çdo program tjetër, ai ka disa struktura kryesore të të dhënave që mbajnë gjurmët e informacioneve të ndryshme përkatëse. Për të gjurmuar gjendjen e secilit proces, OS do të mbështesë disa listën e proceseve për të gjitha proceset në gjendjen GATI dhe disa informacione shtesë për të gjurmuar proceset që janë duke u ekzekutuar aktualisht. Gjithashtu, OS duhet të monitorojë proceset e bllokuara. Pasi të përfundojë IO, OS duhet të zgjojë procesin e kërkuar dhe ta vendosë atë në një gjendje gati për ekzekutim.

Për shembull, OS duhet të ruajë gjendjen e regjistrave të procesorit. Në momentin që procesi ndalon, gjendja e regjistrave ruhet në hapësirën e adresave të procesit dhe në momentin që funksionimi i tij vazhdon, vlerat e regjistrave rikthehen dhe kështu vazhdon ekzekutimi i këtij procesi.

Përveç gjendjeve të gatshme, të bllokuara, të funksionimit, ka edhe disa shtete të tjera. Ndonjëherë, në kohën e krijimit, një proces mund të jetë në gjendjen INIT. Së fundi, një proces mund të vendoset në gjendjen FINAL kur ai tashmë ka përfunduar, por informacioni i tij nuk është pastruar ende. Në sistemet UNIX kjo gjendje quhet procesi i zombies. Kjo gjendje është e dobishme për rastet kur një proces prind dëshiron të dijë kodin e kthimit të një fëmije, për shembull, zakonisht 0 sinjalizon një sukses dhe 1 një gabim, por programuesit mund të lëshojnë kode shtesë dalëse për të sinjalizuar probleme të ndryshme. Kur procesi prind përfundon, ai bën një telefonatë përfundimtare të sistemit, si p.sh. wait(), për të pritur që procesi fëmijë të përfundojë dhe t'i sinjalizojë OS që mund të pastrojë çdo të dhënë që lidhet me procesin e përfunduar.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 2: Abstraksion: Procesi (përkthim)

Pikat kryesore të ligjëratës:

proces — abstraksioni kryesor i një programi që funksionon në OS. Në çdo kohë, një proces mund të përshkruhet nga gjendja e tij: përmbajtja e memories në hapësirën e adresës së tij, përmbajtja e regjistrave të procesorit, duke përfshirë treguesin e udhëzimeve dhe treguesin e stivës, dhe informacionin IO, si për shembull skedarët e hapur që lexohen ose shkruhen.
API-ja e procesit përbëhet nga thirrje që programet mund t'i bëjnë proceseve. Zakonisht këto janë thirrje për krijimin, fshirjen ose të tjera.
● Procesi është në një nga shumë gjendjet, duke përfshirë ekzekutimin, gatishmërinë, bllokimin. Ngjarje të ndryshme si planifikimi, përjashtimet nga planifikimi ose pritjet mund të ndryshojnë gjendjen e një procesi nga njëri në tjetrin.
Lista e proceseve përmban informacion për të gjitha proceset në sistem. Çdo hyrje në të quhet bllok i kontrollit të procesit, i cili në realitet është një strukturë që përmban të gjithë informacionin e nevojshëm për një proces specifik. 

Burimi: www.habr.com

Shto një koment