Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Hyrje në Sistemet Operative

Përshëndetje, Habr! Do të doja të paraqes në vëmendjen tuaj një seri artikujsh-përkthimesh të një letërsie që është interesante për mendimin tim - OSTEP. Ky material shqyrton mjaft thellë punën e sistemeve operative të ngjashme me unix, përkatësisht, punën me procese, planifikues të ndryshëm, memorie dhe komponentë të 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:
- origjinale: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- origjinale: github.com/remzi-arpacidusseau/ostep-code
- përshtatja ime personale: github.com/bykvaadm/OS/tree/master/ostep

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

Funksionimi i programit

Çfarë ndodh kur një program po ekzekutohet? Një program që funksionon bën një gjë të thjeshtë - ai ekzekuton udhëzimet. Çdo sekondë, miliona dhe ndoshta miliarda instruksione merren nga procesori nga RAM-i, nga ana tjetër ai i deshifron ato (për shembull, ai njeh se cilit lloj i përkasin këto instruksione) dhe i ekzekuton ato. Kjo mund të jetë shtimi i dy numrave, qasja në kujtesë, kontrollimi i një gjendjeje, kërcimi te një funksion etj. Pas ekzekutimit të një instruksioni, procesori vazhdon me ekzekutimin e një tjetri. Dhe kështu instruksion pas instruksioni, ato ekzekutohen derisa programi të përfundojë.
Ky shembull konsiderohet natyrshëm i thjeshtuar - në fakt, për të shpejtuar procesorin, pajisja moderne ju lejon të ekzekutoni udhëzime jashtë radhës, të llogaritni rezultatet e mundshme, të ekzekutoni udhëzime njëkohësisht dhe truke të ngjashme.

Modeli i llogaritjes Von Neumann

Forma e thjeshtuar e punës e përshkruar nga ne është e ngjashme me modelin e llogaritjes Von Neumann. Von Neumann është një nga pionierët e sistemeve kompjuterike, ai është gjithashtu një nga autorët e teorisë së lojës. Ndërsa programi po funksionon, ndodhin një mori ngjarjesh të tjera, shumë procese të tjera dhe funksionojnë logjikë të palëve të treta, qëllimi kryesor i të cilave është thjeshtimi i nisjes, funksionimit dhe mirëmbajtjes së sistemit.
Ekziston një grup softuerësh që janë përgjegjës për t'i bërë programet të lehta për t'u ekzekutuar (ose edhe lejimin e shumë programeve të ekzekutohen në të njëjtën kohë), duke i lejuar programet të ndajnë të njëjtën memorie, si dhe të komunikojnë me pajisje të ndryshme. Një grup i tillë softuerësh (softuerësh) në thelb quhet sistem operativ dhe detyrat e tij përfshijnë monitorimin që sistemi funksionon në mënyrë korrekte dhe efikase, si dhe sigurimin e lehtësisë së menaxhimit të këtij sistemi.

Sistem operativ

Një sistem operativ, i shkurtuar si OS, është një grup programesh të ndërlidhura të krijuara për të menaxhuar burimet e kompjuterit dhe për të organizuar ndërveprimin e përdoruesit me një kompjuter..
OS e arrin efektivitetin e tij në radhë të parë, përmes teknikës më të rëndësishme - teknikës virtualizimi. Sistemi operativ ndërvepron me një burim fizik (procesor, memorie, disk, etj.) dhe e transformon atë në një formë më të përgjithshme, më të fuqishme dhe më të lehtë për t'u përdorur. Prandaj, për një kuptim të përgjithshëm, mund të krahasoni shumë përafërsisht sistemin operativ me një makinë virtuale.
Për të lejuar përdoruesit të japin komanda në sistemin operativ dhe kështu të përdorin aftësitë e makinës virtuale (të tilla si ekzekutimi i një programi, shpërndarja e memories, qasja në një skedar, etj.), sistemi operativ ofron një ndërfaqe të quajtur API (ndërfaqja e programimit të aplikacionit) dhe në të cilën mund të bëni thirrje (thirrje). Një sistem tipik operativ lejon që të kryhen qindra thirrje sistemore.
Së fundi, meqenëse virtualizimi lejon që programe të shumta të ekzekutohen (duke ndarë kështu CPU-në), dhe njëkohësisht të kenë akses në udhëzimet dhe të dhënat e tyre (duke ndarë memorien) dhe të aksesojnë disqet (duke ndarë kështu pajisjet I/O). ), sistemi operativ quhet gjithashtu një menaxher burimesh. Çdo procesor, disk dhe memorie është një burim i sistemit, dhe kështu një nga rolet e sistemit operativ bëhet detyrë e menaxhimit të këtyre burimeve, duke e bërë atë në mënyrë efikase, me ndershmëri ose anasjelltas, në varësi të detyrës për të cilën ky sistem operativ. është projektuar.

Virtualizimi i CPU-së

Konsideroni programin e mëposhtëm:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Ai nuk kryen ndonjë veprim të veçantë, në fakt, gjithçka që bën është të thërrasë një funksion tjerr(), detyra e të cilit është të kalojë kontrollin e kohës dhe të kthehet pasi të ketë kaluar një sekondë. Kështu, ai përsërit pafundësisht vargun që përdoruesi kaloi si argument.
Le të ekzekutojmë këtë program dhe t'i kalojmë karakterin "A" si argument. Rezultati nuk është veçanërisht interesant - sistemi thjesht ekzekuton një program që shfaq periodikisht karakterin "A".
Tani le të provojmë opsionin kur ekzekutohen shumë raste të të njëjtit program, por nxjerrin shkronja të ndryshme për ta bërë më të qartë. Në këtë rast, rezultati do të jetë disi i ndryshëm. Përkundër faktit se kemi një procesor, programi ekzekutohet njëkohësisht. Si ndodh? Por rezulton se sistemi operativ, jo pa ndihmën e aftësive harduerike, krijon një iluzion. Iluzioni se sistemi ka shumë procesorë virtualë, duke e kthyer një procesor të vetëm fizik në një numër teorikisht të pafund dhe duke lejuar kështu që programet në dukje të funksionojnë njëkohësisht. Ky iluzion quhet Virtualizimi i CPU-së.
Kjo foto ngre shumë pyetje, për shembull, nëse disa programe duan të ekzekutohen në të njëjtën kohë, cili do të hapet? “Politikat” e OS janë përgjegjëse për këtë pyetje. Politikat përdoren në shumë vende në OS dhe u përgjigjen pyetjeve si kjo, dhe janë mekanizmat bazë që zbaton OS. Prandaj roli i OS si menaxher burimesh.

Virtualizimi i memories

Tani le të shohim kujtesën. Modeli fizik i memories në sistemet moderne paraqitet si një grup bajtësh.. Për të lexuar nga kujtesa, duhet të specifikoni adresa e qelisëpër të hyrë në të. Për të shkruar ose përditësuar të dhënat, duhet të specifikoni gjithashtu të dhënat dhe adresën e qelizës ku do t'i shkruani ato.
Memoria aksesohet vazhdimisht gjatë ekzekutimit të programit. Një program ruan të gjithë strukturën e tij të të dhënave në memorie dhe i qaset asaj duke ekzekutuar instruksione të ndryshme. Ndërkohë, udhëzimet ruhen edhe në memorie, kështu që aksesohet edhe për çdo kërkesë për instruksionin e radhës.

thirrje malloc().

Konsideroni programin e mëposhtëm, i cili shpërndan një rajon memorie duke përdorur thirrjen malloc () (https://youtu.be/jnlKRnoT1m0):

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Programi bën disa gjëra. Së pari, alokon pak memorie (rreshti 7), pastaj printon adresën e qelizës së caktuar (rreshti 9), shkruan zero në slotin e parë të memories së ndarë. Më pas, programi hyn në një lak në të cilin rrit vlerën e ruajtur në memorie në adresën në variablin "p". Ai gjithashtu printon vetë ID-në e procesit. ID-ja e procesit është unike për çdo proces që po ekzekutohet. Pasi kemi lëshuar disa kopje, do të ngecim në një rezultat interesant: Në rastin e parë, nëse nuk bëni asgjë dhe thjesht ekzekutoni disa kopje, atëherë adresat do të jenë të ndryshme. Por kjo nuk bie në teorinë tonë! E saktë, pasi shpërndarjet moderne kanë të aktivizuar rastësi të kujtesës si parazgjedhje. Nëse është i çaktivizuar, marrim rezultatin e pritur - adresat e kujtesës të dy programeve që funksionojnë njëkohësisht do të përputhen.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Si rezultat, rezulton se dy programe të pavarura punojnë me hapësirat e tyre private të adresave, të cilat nga ana e tyre janë hartuar nga sistemi operativ në memorien fizike.. Prandaj, përdorimi i adresave të memories brenda një programi nuk do të ndikojë në asnjë mënyrë të tjerët, dhe secilit program i duket se ai ka pjesën e tij të memories fizike, tërësisht të dhënë. Realiteti, megjithatë, është se memoria fizike është një burim i përbashkët i menaxhuar nga sistemi operativ.

Konsistenca

Një tjetër temë e rëndësishme brenda sistemeve operative është qëndrueshmëri. Ky term përdoret kur flasim për probleme në sistem që mund të ndodhin kur punoni me shumë gjëra në të njëjtën kohë brenda të njëjtit program. Çështjet e konsistencës lindin edhe brenda vetë sistemit operativ. Në shembujt e mëparshëm të virtualizimit të memories dhe procesorit, kuptuam se OS menaxhon shumë gjëra në të njëjtën kohë - fillon procesin e parë, pastaj të dytin, e kështu me radhë. Siç doli, kjo sjellje mund të çojë në disa probleme. Kështu, për shembull, programet moderne me shumë fije përjetojnë vështirësi të tilla.

Konsideroni programin e mëposhtëm:

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Programi në funksionin kryesor krijon dy thread duke përdorur thirrjen pthread_create(). Në këtë shembull, një thread mund të konsiderohet si një funksion që ekzekutohet në të njëjtën hapësirë ​​memorie krahas funksioneve të tjera, me qartësisht më shumë se një funksion që ekzekutohet në të njëjtën kohë. Në këtë shembull, çdo thread fillon dhe ekzekuton funksionin worker() i cili nga ana tjetër thjesht rrit variablin,.

Le ta ekzekutojmë këtë program me një argument prej 1000. Siç mund ta keni marrë me mend, rezultati duhet të jetë 2000 sepse çdo thread e rriti variablin 1000 herë. Megjithatë, gjithçka nuk është aq e thjeshtë. Le të përpiqemi ta ekzekutojmë programin me një rend të madhësisë më shumë përsëritje.

Sistemet Operative: Tre Pjesë të Lehta. Pjesa 1: Hyrje (përkthim)

Duke futur një numër, për shembull, 100000, ne presim të shohim daljen si numrin 200000. Megjithatë, nëse e ekzekutojmë numrin 100000 disa herë, jo vetëm që nuk do të shohim përgjigjen e saktë, por do të marrim edhe përgjigje të ndryshme të pasakta. Përgjigja qëndron në faktin se për të rritur numrin, kërkohen tre operacione - nxjerrja e numrit nga kujtesa, rritja dhe më pas kthimi i numrit. Meqenëse të gjitha këto udhëzime nuk ekzekutohen në mënyrë atomike (të gjitha në të njëjtën kohë), gjëra të çuditshme si kjo mund të ndodhin. Ky problem quhet në programim gjendja e garës. Kur forca të panjohura në një moment të panjohur mund të ndikojnë në performancën e ndonjë prej operacioneve tuaja.

Burimi: www.habr.com

Shto një koment