Hyrje në sistemet operative
Përshëndetje, Habr! Dëshiroj t'ju prezantoj një seri artikujsh përkthimesh nga një literaturë mjaft interesante sipas mendimit tim — OSTEP. Në këtë material shqyrtohet thellësisht funksionimi i sistemeve operative të ngjashme me UNIX, sidomos — menaxhimi i proceseve, planifikuesve të ndryshëm, memorjeve dhe komponentëve të tjerë të ngjashëm që përbëjnë një sistem të modern operative. Origjinali i të gjitha materiale është i disponueshëm këtu . Ju lutem, mbani në mend se përkthimi është bërë në mënyrë jo profesionale (mjaft e lirë), por shpresoj se e kam ruajtur kuptimin e përgjithshëm.
Laboratorët për këtë lëndë mund t'i gjeni këtu:
— origjinali:
— origjinali:
— adaptimi im personal:
Po ashtu mund të dëshironi të vizitoni kanalin tim në =)
Puna e programit
Çfarë ndodh kur një program funksionon? Programi i ekzekutuar kryen një gjë të thjeshtë — ai zbatuan instruktionet. Çdo sekondë, miliona dhe madje miliarda instrukcionesh nxirren nga procesori nga memoria e operativ, i cili i dekodon (për shembull, njihet se cilit tip i përkasin këto instrukcione) dhe i ekzekuton. Këto mund të jenë një shumëzim i dy numrave, akses në memorie, kontrollimi i një kushti, kalimi në një funksion dhe kështu me radhë. Pas përfundimit të ekzekutimit të një instrukcioni, procesori kalon në ekzekutimin e një tjetri. Dhe kështu, instrukcion pas instrukcioni, ato ekzekutohen deri sa programa të përfundojë.
Ky shembull natyrisht është shqyrtuar në mënyrë të thjeshtuar — në të vërtetë, për të përshpejtuar punën e procesorit, pajisjet moderne lejojnë ekzekutimin e instrukcionesh jashtë rendit, llogaritjen e rezultateve të mundshme, ekzekutimin e instrukcionesh në mënyrë simultane dhe trukime të ngjashme.
Modeli i Von Neumann të llogaritjes
Forma e thjeshtuar e punës që kemi përshkruar është e ngjashme me modelin e Von Neumann të llogaritjeve. Fon Neiman është një nga pionierët e sistemeve kompjuterike, gjithashtu ai është një nga autorët e teorisë së lojërave.. Gjatë punës së programit ndodhin shumë ngjarje të tjera, punojnë shumë procese dhe logjika të jashtme, e cila ka si qëllim kryesor thjeshtëzimin e nisjes, funksionimit dhe mirëmbajtjes së sistemit.
Ekziston një grup softuerësh që është përgjegjës për thjeshtësinë e nisjes së programeve (ose madje lejon të ekzekutohen disa programe njëkohësisht), ai lejon programet të ndajnë të njëjtën memorie, si dhe të ndërveprojnë me pajisje të ndryshme. Ky grup softuresh (software) në esencë e quajnë sistemin operativ dhe detyrat e tij përfshijnë mbikëqyrjen që sistemi të funksionojë siç duhet dhe në mënyrë efektive, si dhe sigurimin e thjeshtësisë në menaxhimin e këtij sistemi.
Sistemi operativ
Sistemi operativ, për shkurtim OS — është një grup i lidhur i programeve, të destinuara për të menaxhuar burimet e kompjuterit dhe për të organizuar ndërveprimin e përdoruesit me kompjuterin..
OS arrin eficiencën e saj kryesisht përmes teknikës më të rëndësishme — teknikës së virtualizimit.. Sistemi operativ ndërvepron me burimet fizike (procesorin, memorien, diskin dhe të ngjashme) dhe e transformon atë në një formë më të përgjithshme, me më shumë mundësi dhe më të thjeshtë për t'u përdorur. Prandaj, për një kuptim të përgjithshëm, mund të krahasohet shumë shkurtimisht sistemi operativ me një makinë virtuale.
Për të lejuar përdoruesit të japin komanda për sistemin operativ dhe kështu të shfrytëzojnë mundësitë e makinës virtuale (si: ekzekutimi i programit, ndarja e memories, qasja në skedar etj.), sistemi operativ ofron një ndërfaqe të quajtur API (application programming interface) dhe nga e cila mund të kryhen thirrje (call). Një sistem operativ tipik ofron mundësinë për të kryer qindra thirrje sistemike.
Dhe, duke qenë se virtualizimi lejon shumë programe të funksionojnë (në këtë mënyrë, të ndajnë CPU-në) dhe gjithashtu të kenë akses në instrukcionet dhe të dhënat e tyre (në këtë mënyrë, të ndajnë memorinë), si dhe të kenë qasje në disqet (në këtë mënyrë, të ndajnë pajisjet e input-output), sistemi operativ quhet gjithashtu menaxher i burimeve. Çdo procesor, disk dhe memorie është një burim i sistemit dhe kështu një nga rolet e sistemit operativ bëhet menaxhimi i këtyre burimeve, duke e bërë këtë në mënyrë efikase, drejtësisht ose, përkundrazi, sipas detyrës për të cilën është zhvilluar ky sistem operativ.
Virtualizimi i CPU
Le ta shqyrtojmë programin në vijim:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Ai nuk kryen ndonjë veprim të veçantë, në thelb, gjithçka që bën është të thërrasë funksionin spin(), detyra e së cilës është kontrolli ciklik i kohës dhe kthimi, pasi të ketë kaluar një sekondë. Në këtë mënyrë, ajo përsërit pafundësisht rreshtin që përdoruesi e ka dërguar si argument.
Do ta fillojmë këtë program dhe do t'i kalojmë si argument simbolin “A”. Rezultati është jo shumë interesant — sistemi thjesht ekzekuton programin që periodikisht shfaq në ekran simbolin “A”.
Tani le të provojmë një variant kur janë aktivizuar shumë instanca të së njëjtës program, por që shfaqin letra të ndryshme për ta bërë më të qartë. Në këtë rast, rezultati do të jetë pak ndryshe. Pavarësisht se kemi një procesor, programi ekzekutohet njëkohësisht. Si ndodh kjo? Epo, ndodh që sistemi operativ, me ndihmën e mundësive të harduerit, krijon një iluzion. Iluzionin që në sistem ka disa procesorë virtualë, duke e transformuar një procesor fizik në një numër teorikisht të pafund dhe kështu duke lejuar që programet të duken si po ekzekutohen njëkohësisht. Këtë iluzion e quajnë Virtualizimi i CPU.
Një skenë e tillë lind shumë pyetje, për shembull, nëse disa programe duan të fillojnë njëkohësisht, cila do të ekzekutohet? Këtë pyetje e përgjigjin "politikat" e sistemit operativ. Politikat përdoren në shumë vende të sistemit operativ dhe përgjigjin në pyetje të tilla, gjithashtu janë mekanizmat thelbësorë që gjithashtu e realizon sistemi operativ. Kështu, roli i sistemit operativ si menaxher i burimeve është i qartë.
Virtualizimi i memorjes
Tani le të shqyrtojmë memorjen. Modeli fizik i memorjes në sistemet moderne paraqitet si një masiv bajtësh. Për të lexuar nga memoria, duhet të specifikohet adresa e qelisë, për të pasur qasje në të. Për të shkruar ose për të azhurnuar të dhënat, gjithashtu duhet të specifikohen të dhënat dhe adresa e qelisë ku do të shkruhen ato.
Qasjet në memorie ndodhin me vazhdimësi në procesin e punës së programit. Programi ruan në memorie të gjithë strukturën e të dhënave të tij dhe i qaset asaj duke ekzekutuar udhëzime të ndryshme. Udhëzimet po ashtu ruhen në memorie, kështu që qasja ndaj saj ndodh gjithashtu për çdo kërkesë për udhëzimin e ardhshëm.
Thirrja e malloc()
Le të shqyrtojmë programin e mëposhtëm, i cili alokon një zonë memorjeje duke përdorur thirrjen malloc() (https://youtu.be/jnlKRnoT1m0):

Programi bën disa gjëra. Së pari, ai rezervon një sasi të caktuar memorjeje (rreshti 7), pastaj jep adresën e qelizës së rezervuar (rreshti 9), shkruan zero në pozitën e parë të memorjes së rezervuar. Më pas, programi hyn në një cikël ku inkrementon vlerën e shkruar në memori në adresën e variablës “p”. Po ashtu, ai jep identifikuesin e procesit të tij. Identifikuesi i procesit është unik për secilin proces të aktivizuar.. Duke nisur disa kopje, përballemi me një rezultat interesant: Në rastin e parë, nëse nuk bëjmë asgjë dhe thjesht nisim disa kopje, adresat do të jenë të ndryshme. Por kjo nuk përputhet me teorinë tonë! E saktë, pasi në distribucione moderne është aktivizuar për default funksioni i randomizimit të memories. Nëse e çaktivizojmë, do të marrim rezultatin e pritur - adresat e memories te dy programeve që funksionojnë njëkohësisht do të përputhen.

Si rezultat, del që dy programe të pavarura punojnë me hapësira të tyre private të adresave, të cilat në këndvështrimin e sistemit operativ, i përkasin memories fizike.. Prandaj, përdorimi i adresave të memories brenda një programi nuk do të ndikojë asnjëherë në të tjerët, dhe çdo program e ndjen se ka një pjesë të vet të memories fizike, e cila i është dhënë plotësisht atij. Realiteti, megjithatë, është se memoria fizike është një burim i ndarë, menaxhimi i të cilit bëhet nga sistemi operativ.
Konsistenca
Një tjetër nga temat e rëndësishme në kuadër të sistemeve operative është konsistenca. Ky term përdoret kur flitet për problemet në sistem, të cilat mund të ndodhin gjatë punës me shumë gjëra në të njëjtën kohë brenda një programi. Problemet e konsistencës ndodhin edhe në vetë sistemin operativ. Në shembujt e mëparshëm me virtualizimin e memories dhe procesorit, ne kuptuam se OS menaxhon shumë gjëra në të njëjtën kohë - fillon procesin e parë, pastaj të dytin dhe kështu me radhë. Siç doli, ky përfundim mund të sjellë disa probleme. Për shembull, programet moderne shumëfishe përballen me këto vështirësi.
Le ta shqyrtojmë programin në vijim:

Programa në funksionin kryesor krijon dy fije, duke përdorur thirrjen Pthread_create(). Në këtë shembull, mund të mendoni për një rrjedhë si një funksion që ekzekutohet në një hapësirë të vetme memorie afër funksioneve të tjera, dhe numri i funksioneve të ekzekutuara njëkohësisht është më shumë se një. Në këtë shembull, çdo rrjedhë niste dhe ekzekuton funksionin worker() i cili thjesht inkrementon një variabël.,.
Tani do ta ekzekutojmë këtë program me argumentin 1000. Siç mund ta keni supozuar, rezultati duhet të jetë 2000, pasi çdo rrjedhë inkrementonte variablën 1000 herë. Megjithatë, nuk është aq e thjeshtë. Le të provojmë ta nisim programin me një numër përsëritjesh shumë më të lartë.

Duke dhënë si hyrje një numër, për shembull, 100000, ne presim të shohim si rezultat numrin 200000. Megjithatë, duke e ekzekutuar numrin 100000 disa herë, ne jo vetëm që nuk do të shohim përgjigjen e saktë, por do të marrim edhe përgjigje të ndryshme të gabuara. Zgjidhja është në atë se për të rritur numrin kërkohen tre operacione — nxjerrja e numrit nga memoria, inkrementimi dhe më pas shkrimi i numrit përsëri. Pasiqë të gjitha këto instruksione nuk realizohen atomikisht (të gjitha njëkohësisht), ndodhin këto gjëra të çuditshme. Ky problem quhet në programim gjendërrimi i garës — gjendje garash. Kur forca të panjohura në një moment të panjohur mund të ndikojnë në realizimin e ndonjë operacioni tuaj.
Burimi: habr.com
