Hyrja në sistemet operative
PĂ«rshĂ«ndetje, Habr! Dua t'ju prezantoj njĂ« seri artikujsh pĂ«rkthimesh nga njĂ« literaturĂ« interesante sipas mendimit tim â OSTEP. Ky material shqyrton nĂ« mĂ«nyrĂ« tĂ« thellĂ« funksionimin e sistemeve operative tĂ« ngjashme me Unix, veçanĂ«risht â menaxhimin e proceseve, planifikuesit e ndryshĂ«m, memorjen dhe komponentĂ«t e tjerĂ« tĂ« ngjashĂ«m qĂ« pĂ«rbĂ«jnĂ« njĂ« sistem operativ modern. Origjinali i tĂ« gjitha materialeve mund ta shihni kĂ«tu . Ju lutem, merrni parasysh se pĂ«rkthimi Ă«shtĂ« realizuar nĂ« mĂ«nyrĂ« jo profesionale (mjaft lirshĂ«m), por shpresoj se kuptimi i pĂ«rgjithshĂ«m e kam ruajtur.
Për laboratorët në këtë lëndë mund të gjeni këtu:
â origjinali:
â origjinali:
â adaptimi im personal:
Dhe gjithashtu mund të shikoni kanalin tim në =)
Funksioni i programit
ĂfarĂ« ndodh kur njĂ« program ekzekutohet? Programi i nisur kryen njĂ« veprim tĂ« thjeshtĂ« â ai ekzekuton instruktionet. Ădo sekondĂ« miliona dhe ndoshta miliarda instrukcionesh eksportohet nga procesori nga memorie operative, i cili nĂ« tĂ« njĂ«jtĂ«n kohĂ« i dekodon (p.sh., njeh se cilit lloj i pĂ«rkasin kĂ«to instrukcione) dhe i ekzekuton. KĂ«to mund tĂ« jenĂ« shkallĂ«zimi i dy numrave, qasje nĂ« memorie, kontrollim kushti, kalim nĂ« funksion dhe kĂ«shtu me radhĂ«. Pasi tĂ« pĂ«rfundojĂ« ekzekutimi i njĂ« instrukcioni, procesori kalon nĂ« ekzekutimin e njĂ« tjetĂ«r. Dhe kĂ«shtu, instrukcioni pas instrukcioni, ato ekzekutohen derisa programi tĂ« pĂ«rfundojĂ«.
Ky shembull sigurisht Ă«shtĂ« shqyrtuar nĂ« mĂ«nyrĂ« tĂ« thjeshtuar â nĂ« tĂ« vĂ«rtetĂ«, pĂ«r tĂ« pĂ«rshpejtuar punĂ«n e procesorit, hardueri modern lejon ekzekutimin e instrukcioneve jashtĂ« rendit, llogaritjen e rezultateve tĂ« mundshme, ekzekutimin e instrukcioneve nĂ« njĂ« kohĂ« dhe truqet e tjera tĂ« ngjashme.
Modeli i llogaritjes së Von Neumann
Forma e thjeshtuar e funksionimit që kemi përshkruar ngjan me modelin e llogaritjes së Von Neumann. Von Neumann është një nga pioneerët e sistemeve kompjuterike, gjithashtu është një nga autorët e teorisë së lojërave. Gjatë punës së programit ndodhin shumë ngjarje të tjera, punojnë shumë procese të tjera dhe logjika anësore, qëllimi kryesor i të cilave është thjeshtimi i nisjes, funksionimit dhe mirëmbajtjes së sistemit.
Ekziston një grup softuerësh që është përgjegjës për lehtësinë e nisjes së programeve (ose madje lejon ekzekutimin e disa programeve njëherësh), ai lejon që programet të ndajnë të njëjtin kujtesë dhe gjithashtu të bashkëveprojnë me pajisje të ndryshme. Ky grup softuerësh (software) quhet në thelb sistem operativ dhe detyrat e tij përfshijnë monitorimin për të siguruar që sistemi të funksionojë saktë dhe efikas, si dhe të sigurojë lehtësinë e menaxhimit të këtij sistemi.
Sistemi operativ
Sistemi operativ, shkurt si OS â Ă«shtĂ« njĂ« grup i ndĂ«rlidhur programesh qĂ« janĂ« tĂ« destinuara pĂ«r tĂ« menaxhuar burimet e kompjuterit dhe pĂ«r tĂ« organizuar ndĂ«rveprimin e pĂ«rdoruesit me kompjuterin..
OS arrin efektivitetin e saj kryesisht pĂ«rmes teknikĂ«s mĂ« tĂ« rĂ«ndĂ«sishme â teknikĂ«s virtualizimit. OS ndĂ«rvepron me burimet fizike (procesori, kujtesa, disku dhe tĂ« ngjashme) dhe e transformon atĂ« nĂ« njĂ« formĂ« mĂ« tĂ« pĂ«rgjithshme, me mundĂ«si mĂ« tĂ« mĂ«dha dhe mĂ« tĂ« lehtĂ« pĂ«r t'u pĂ«rdorur. Prandaj, pĂ«r tĂ« kuptuar nĂ« mĂ«nyrĂ« tĂ« pĂ«rgjithshme, mund tĂ« krahasohet nĂ« njĂ« mĂ«nyrĂ« shumĂ« tĂ« thjeshtĂ« sistemin operativ me njĂ« makinĂ« virtuale.
Për të lejuar përdoruesit të japin komandat sistemit operativ dhe kështu të shfrytëzojnë mundësitë e makinës virtuale (siç janë: ekzekutimi i programeve, shpërndarja e kujtesës, qasja në skedar dhe kështu me radhë), sistemi operativ ofron një ndërfaqe të caktuar, të quajtur API (application programming interface) e cila mund të thirret (call). Një sistem operativ tipik ofron mundësinë për të realizuar qindra thirrje sistemike.
Dhe nĂ« fund, pĂ«rderisa virtualizimi lejon qĂ« shumĂ« programe tĂ« punojnĂ« (nĂ« kĂ«tĂ« mĂ«nyrĂ«, tĂ« ndajnĂ« CPU-nĂ«), dhe njĂ«kohĂ«sisht tĂ« kenĂ« qasje nĂ« udhĂ«zimet dhe tĂ« dhĂ«nat e tyre (ndĂ«rsa ndajnĂ« kujtesĂ«n), si dhe tĂ« kenĂ« qasje nĂ« disqet (nĂ« kĂ«tĂ« mĂ«nyrĂ«, tĂ« ndajnĂ« pajisjet e hyrjes dhe daljes), sistemi operativ njihet gjithashtu si menaxher i burimeve. Ădo procesor, disk dhe kujtesĂ« Ă«shtĂ« 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, tĂ« ndershme ose, pĂ«rkundrazi, nĂ« varĂ«si tĂ« detyrĂ«s pĂ«r tĂ« cilĂ«n ky sistem operativ Ă«shtĂ« krijuar.
Virtualizimi i CPU
Le të shqyrtojmë programin e mëposhtëm:
(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(), i cili ka si detyrë të kontrollojë koha në cikël dhe të kthehet, pasi të ketë kaluar një sekondë. Në këtë mënyrë, ai përsërit pafundësisht string-un që përdoruesi e kaloi si argument.
TĂ« lançojmĂ« kĂ«tĂ« program dhe t'i kalojmĂ« si argument simbolin âAâ. Rezultati nuk Ă«shtĂ« shumĂ« interesant â sistemi thjesht ekzekuton programin, i cili periodicisht shfaq simbolin âAâ nĂ« ekran.
Tani, le të provojmë një variant kur janë të lançuar shumë instanca të të njëjtit program, por që shfaqin letra të ndryshme, për të qenë më e qartë. Në këtë rast, rezultati do të jetë disi ndryshe. Megjithëse kemi një procesor, programi ekzekutohet njëkohësisht. Si është e mundur kjo? E mundshme është që sistemi operativ, me ndihmën e kapaciteteve të pajisjes, krijon iluzionin. Iluzionin se në sistem ka disa procesorë virtualë, duke e kthyer një procesor fizik në një numër teorikisht të pafund, dhe kështu duke lejuar që, programet të duken se ekzekutohen njëkohësisht. Ky iluzion quhet Virtualizimi i CPU.
NjĂ« pamje e tillĂ« ngjall shumĂ« pyetje, pĂ«r shembull, nĂ«se disa programe dĂ«shirojnĂ« tĂ« lancohen njĂ«kohĂ«sisht, cili nĂ« tĂ« vĂ«rtetĂ« do tĂ« lançohen? Ky pyetje zgjidhet nga âpolitikĂ«â tĂ« OS. Politikat pĂ«rdoren nĂ« shumĂ« vende tĂ« OS dhe pĂ«rgjigjen ndaj pyetjeve tĂ« tilla, si dhe janĂ« mekanizma bazĂ« qĂ« OS i realizon. KĂ«shtu qĂ« roli i OS si menaxher burimesh Ă«shtĂ« i rĂ«ndĂ«sishĂ«m.
Virtualizimi i memories
Tani le të shqyrtojmë memorien. Modeli fizik i memories në sistemet moderne paraqitet si një masiv bitësh. Për të lexuar nga memoria, duhet të specifikohet adresa e qelizës, për të aksesuar atë. Për të shkruar ose për të përditësuar të dhënat, gjithashtu duhet të specifikohet të dhënat dhe adresa e qelizës ku do të shkruhen.
Aksesi në memorie ndodh vazhdimisht gjatë punës së programit. Programi ruan në memorie të gjithë strukturën e të dhënave dhe i qaset asaj duke ekzekutuar instruksione të ndryshme. Instruksionet gjithashtu ruhen në memorie, prandaj aksesi në të ndodh gjithashtu me çdo kërkesë për instruksionin tjetër.
Thirrja malloc()
Le të shqyrtojmë programin e mëposhtëm, i cili alokon një zonë memorie duke përdorur thirrjen malloc() (https://youtu.be/jnlKRnoT1m0):

Programi kryen disa veprime. Së pari, alokon një sasi të caktuar memorjeje (rreshti 7), më pas shfaq adresën e qelisë së alokuar (rreshti 9), shkruan zero në slotin e parë të memorjes së alokuar. Më pas, programi hyn në një cikël ku inkrementon vlerën e shkruar në memorie në adresën e variablës "p". Gjithashtu, ai tregon identifikuesin e procesit të vet. Identifikuesi i procesit është unik për çdo proces të akorduar. Duke ekzekutuar disa kopje, do të ndeshni një rezultat interesant: Në rastin e parë, nëse nuk bëni asgjë dhe thjesht ngjallni disa kopje, adresat do të jenë të ndryshme. Por kjo nuk shkon me teorinë tonë! E saktë, sepse në shpërndarjet moderne është aktivizuar në mënyrë të paracaktuar funksioni i randomizimit të memorjes. Nëse e çaktivizoni, do të merrni rezultatin e pritur - adresat e memorjes për dy programe që funksionojnë njëkohësisht do të përputhen.

Siç rezulton, dy programe të pavarura punojnë me hapësira adrese private të tyre, të cilat më pas reflektohen nga sistemi operativ në memorjen fizike. Prandaj, përdorimi i adresave të memorjes brenda një programi nuk do të ndikojë në të tjerat dhe çdo program i duket se ka një copë të vetme të memorjes fizike, plotësisht në dispozitën e tij. Realiteti, megjithatë, është se memorja fizike është një burim i ndarë, i cili administrohet nga sistemi operativ.
Konsistenca
Një tjetër temë e rëndësishme në kuadër të sistemeve operative është konsistenca. Ky term përdoret kur bëhet fjalë për problemet në sistem, të cilat mund të lindin gjatë punës me shumë gjëra njëkohësisht brenda një programi. Problemet e konsistencës ndodhin edhe në vetë sistemin operativ. Në shembujt e mëparshëm me virtualizimin e memorjes dhe procesorit, kuptuam se sistemi operativ menaxhon shumë gjëra njëkohësisht - fillon procesin e parë, pastaj të dytin dhe kështu me radhë. Siç duket, ky sjellje mund të çojë në disa probleme. Për shembull, programet moderne shumëthesare përjetojnë këto vështirësi.
Le të shqyrtojmë programin e mëposhtëm:

Programi nĂ« funksionin kryesor krijon dy thread-e, duke pĂ«rdorur thirrjen Pthread_create(). NĂ« kĂ«tĂ« shembull, mund tĂ« mendojmĂ« pĂ«r thread-in si njĂ« funksion tĂ« ekzekutuar nĂ« njĂ« hapĂ«sirĂ« ââmemorjeje pĂ«rgjatĂ« funksioneve tĂ« tjera, ku numri i funksioneve tĂ« ekzekutuara nĂ« tĂ« njĂ«jtĂ«n kohĂ« Ă«shtĂ« mĂ« shumĂ« se njĂ«. NĂ« kĂ«tĂ« shembull, çdo thread niset dhe realizon funksionin worker() i cili thjesht inkrementon njĂ« variabĂ«l,.
. Le të nisim këtë program me argumentin 1000. Siç e keni kuptuar, rezultati duhet të jetë 2000, pasi çdo thread inkrementoi variablin 1000 herë. Megjithatë, nuk është aq e thjeshtë. Le të provojmë të ekzekutojmë programin me një numër përsëritjesh shumë më të madh.

Duke futur njĂ« numĂ«r, pĂ«r shembull, 100000, ne presim tĂ« shohim nĂ« dalje numrin 200000. MegjithatĂ«, duke ekzekutuar numrin 100000 disa herĂ«, jo vetĂ«m qĂ« nuk do tĂ« shohim pĂ«rgjigje tĂ« saktĂ«, por do tĂ« marrim pĂ«rgjigje tĂ« ndryshme tĂ« gabuara. Zgjidhja qĂ«ndron nĂ« faktin se pĂ«r tĂ« rritur numrin kĂ«rkohen tre operacione - nxjerrja e numrit nga memoria, inkrementimi dhe pastaj shkarkimi i numrit pĂ«rsĂ«ri. Duke qenĂ« se tĂ« gjitha kĂ«to instruksione nuk realizohen nĂ« mĂ«nyrĂ« atomike (tĂ« gjitha njĂ«herĂ«sh), gjĂ«ra tĂ« çuditshme mund tĂ« ndodhin. Kjo problematikĂ« quhet nĂ« programim race condition â gjendje garash. Kur forca tĂ« panjohura nĂ« njĂ« moment tĂ« panjohur mund tĂ« ndikojnĂ« nĂ« ekzekutimin e ndonjĂ« prej operacioneve tuaja.
Burimi: habr.com
