Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Įvadas į operacines sistemas

Sveiki, Habr! Norėčiau atkreipti jūsų dėmesį į vienos, mano nuomone, įdomios literatūros - OSTEP - straipsnių-vertimų ciklą. Šioje medžiagoje gana nuodugniai aptariamas į unix panašių operacinių sistemų darbas, būtent darbas su procesais, įvairiais planuokliais, atmintimi ir kitais panašiais komponentais, kurie sudaro šiuolaikinę OS. Visų medžiagų originalus galite pamatyti čia čia. Atkreipkite dėmesį, kad vertimas atliktas neprofesionaliai (gana laisvai), bet tikiuosi, kad išlaikiau bendrą prasmę.

Laboratorinius darbus šia tema galite rasti čia:

Taip pat galite peržiūrėti mano kanalą adresu telegrama =)

Programos veikimas

Kas nutinka, kai programa veikia? Vykdoma programa atlieka vieną paprastą dalyką – vykdo instrukcijas. Kas sekundę procesorius iš RAM atgauna milijonus ir net milijardus instrukcijų, savo ruožtu jas iškoduoja (pavyzdžiui, atpažįsta, kokiam tipui šios instrukcijos priklauso) ir vykdo. Tai gali būti dviejų skaičių pridėjimas, prieiga prie atminties, būklės patikrinimas, perėjimas prie funkcijos ir pan. Įvykdęs vieną komandą, procesorius pradeda vykdyti kitą. Ir taip instrukcija po instrukcijos, jos vykdomos iki programos pabaigos.

Šis pavyzdys natūraliai laikomas supaprastintu – iš tiesų, norint pagreitinti procesorių, šiuolaikinė aparatinė įranga leidžia vykdyti komandas be eilės, skaičiuoti galimus rezultatus, vykdyti komandas vienu metu ir panašius triukus.

Von Neumann skaičiavimo modelis

Mūsų aprašyta supaprastinta darbo forma yra panaši į Von Neumann skaičiavimo modelį. Von Neumannas yra vienas iš kompiuterinių sistemų pradininkų, jis taip pat yra vienas iš žaidimų teorijos autorių. Programai veikiant, vyksta krūva kitų įvykių, daug kitų procesų ir trečiųjų šalių logikos darbų, kurių pagrindinis tikslas – supaprastinti sistemos paleidimą, veikimą ir priežiūrą.

Существует набор программного обеспечения, который ответственен за простоту запуска программ (или даже позволяющий запускать несколько программ одновременно), он позволяет программам разделять одну и ту же память, а так же взаимодействовать с различными устройствами. Такой набор ПО (программного обеспечения) по сути и называют операционной системой и в его задачи входит отслеживание того, чтобы система работала корректно и эффективно, а также обеспечение простоты управления этой системой.

Operacinė sistema

Operacinė sistema, sutrumpintai vadinama OS, yra tarpusavyje susijusių programų rinkinys, skirtas valdyti kompiuterio išteklius ir organizuoti vartotojo sąveiką su kompiuteriu..

OS efektyvumą pirmiausia pasiekia per svarbiausią techniką – techniką virtualizacija. OS sąveikauja su fiziniu ištekliu (procesoriumi, atmintimi, disku ir kt.) ir paverčia jį bendresne, galingesne ir lengviau naudojama forma. Todėl bendram supratimui galite labai grubiai palyginti operacinę sistemą su virtualia mašina.

Kad vartotojai galėtų duoti komandas operacinei sistemai ir taip naudotis virtualios mašinos galimybėmis (pvz., paleisti programą, paskirstyti atmintį, pasiekti failą ir pan.), operacinė sistema suteikia tam tikrą sąsają, vadinamą API (aplikacijų programavimo sąsaja) ir į kurią galite skambinti (skambinti). Įprasta operacinė sistema leidžia atlikti šimtus sistemos skambučių.

Galiausiai, kadangi virtualizavimas leidžia paleisti kelias programas (taip dalijantis centriniu procesoriumi) ir vienu metu pasiekti jų instrukcijas bei duomenis (taip dalintis atmintimi) ir pasiekti diskus (todėl bendrinti I/O įrenginius). ), operacinė sistema taip pat vadinama išteklių valdytojas. Kiekvienas procesorius, diskas ir atmintis yra sistemos resursas, todėl vienu iš operacinės sistemos vaidmenų tampa užduotis valdyti šiuos išteklius, atlikti tai efektyviai, sąžiningai arba atvirkščiai, priklausomai nuo užduoties, kuriai ši operacinė sistema yra suprojektuotas.

CPU virtualizacija

Apsvarstykite šią programą:
(https://www.youtube.com/watch?v=zDwT5fUcki4)

Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Jis neatlieka jokių ypatingų veiksmų, iš tikrųjų viskas, ką ji daro, yra iškviečiama funkciją suktis(), kurio užduotis yra patikrinti laiką ir grįžti praėjus vienai sekundei. Taigi ji neribotą laiką kartoja eilutę, kurią vartotojas perdavė kaip argumentą.

Paleiskite šią programą ir kaip argumentą perteikime jai simbolį „A“. Rezultatas nėra itin įdomus – sistema tiesiog vykdo programą, kuri periodiškai parodo simbolį „A“.

Dabar pabandykime parinktį, kai veikia daug tos pačios programos egzempliorių, tačiau išvedamos skirtingos raidės, kad būtų aiškiau. Tokiu atveju rezultatas bus šiek tiek kitoks. Nepaisant to, kad turime vieną procesorių, programa vykdoma vienu metu. Kaip tai atsitinka? Tačiau pasirodo, kad operacinė sistema, ne be techninės įrangos galimybių, sukuria iliuziją. Iliuzija, kad sistemoje yra keli virtualūs procesoriai, paverčiantys vieną fizinį procesorių teoriškai begaliniu skaičiumi ir taip leidžiantys iš pažiūros programoms veikti vienu metu. Ši iliuzija vadinama CPU virtualizacija.

Šis paveikslėlis kelia daug klausimų, pavyzdžiui, jei kelios programos nori veikti vienu metu, kuri iš jų bus paleista? Už šį klausimą atsako OS „politika“. Politika yra naudojama daugelyje OS vietų ir atsako į tokius klausimus. Tai yra pagrindiniai mechanizmai, kuriuos įgyvendina OS. Taigi OS, kaip išteklių valdytojo, vaidmuo.

Atminties virtualizavimas

Dabar pažiūrėkime į atmintį. Fizinis atminties modelis šiuolaikinėse sistemose vaizduojamas kaip baitų masyvas.. Norėdami skaityti iš atminties, turite nurodyti ląstelės adresasprie jo prieiti. Norėdami įrašyti ar atnaujinti duomenis, taip pat turite nurodyti duomenis ir langelio, kuriame juos norite įrašyti, adresą.

Vykdant programą, atmintis pasiekiama nuolat. Programa išsaugo visą savo duomenų struktūrą atmintyje ir pasiekia ją vykdydama įvairias instrukcijas. Tuo tarpu instrukcijos taip pat yra saugomos atmintyje, todėl ji taip pat pasiekiama kiekvienai kitos instrukcijos užklausai.

malloc() skambutis

Apsvarstykite šią programą, kuri iškvietimu paskiria atminties sritį malloc () (https://youtu.be/jnlKRnoT1m0):

Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Programa atlieka keletą dalykų. Pirma, ji paskiria dalį atminties (7 eilutė), tada išspausdina paskirtos ląstelės adresą (9 eilutė), įrašo nulį į pirmąjį skirtos atminties lizdą. Tada programa įveda kilpą, kurioje ji padidina atmintyje saugomą reikšmę „p“ kintamojo adresu. Jis taip pat išspausdina savo proceso ID. Proceso ID yra unikalus kiekvienam vykdomam procesui. Paleidę keletą kopijų, suklupsime įdomų rezultatą: Pirmuoju atveju, jei nieko nedarysite ir paleisite tik kelias kopijas, tada adresai skirsis. Bet tai nepatenka į mūsų teoriją! Teisingai, nes šiuolaikiniuose paskirstymuose pagal numatytuosius nustatymus įjungtas atsitiktinis atmintis. Jei jis išjungtas, gauname laukiamą rezultatą – sutaps dviejų vienu metu veikiančių programų atminties adresai.

Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Dėl to paaiškėja, kad dvi nepriklausomos programos veikia su savo privačiomis adresų erdvėmis, kurios savo ruožtu yra susietos operacinės sistemos fizinėje atmintyje.. Todėl atminties adresų naudojimas vienoje programoje niekaip neturės įtakos kitoms, ir kiekvienai programai atrodo, kad ji turi savo fizinės atminties dalį, visiškai jai skirtą. Tačiau realybė yra tokia, kad fizinė atmintis yra bendras išteklius, valdomas operacinės sistemos.

Nuoseklumas

Kita svarbių temų operacinėse sistemose yra − nuoseklumas. Šis terminas vartojamas kalbant apie sistemos problemas, kurios gali kilti dirbant su daugeliu dalykų tuo pačiu metu toje pačioje programoje. Nuoseklumo problemos kyla net pačioje operacinėje sistemoje. Ankstesniuose atminties ir procesoriaus virtualizavimo pavyzdžiuose supratome, kad OS vienu metu valdo daug dalykų – paleidžia pirmą procesą, paskui antrą ir t.t. Kaip paaiškėjo, toks elgesys gali sukelti tam tikrų problemų. Taigi, pavyzdžiui, šiuolaikinės kelių gijų programos susiduria su tokiais sunkumais.

Apsvarstykite šią programą:

Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Pagrindinės funkcijos programa, naudodama skambutį, sukuria dvi gijas pthread_create(). Šiame pavyzdyje giją galima įsivaizduoti kaip funkciją, veikiančią toje pačioje atminties erdvėje kartu su kitomis funkcijomis, kai vienu metu veikia daugiau nei viena funkcija. Šiame pavyzdyje kiekviena gija pradeda ir vykdo funkciją worker (), kuris savo ruožtu tiesiog padidina kintamąjį,.

Paleiskite šią programą su argumentu 1000. Kaip jau galėjote atspėti, rezultatas turėtų būti 2000, nes kiekviena gija padidino kintamąjį 1000 kartų. Tačiau viskas nėra taip paprasta. Pabandykime paleisti programą su eilės tvarka daugiau pakartojimų.

Operacinės sistemos: trys paprastos dalys. 1 dalis: įvadas (vertimas)

Įvedę skaičių, pavyzdžiui, 100000, tikimės išvestį matyti kaip skaičių 200000. Tačiau kelis kartus paleidę skaičių 100000 ne tik nepamatysime teisingo atsakymo, bet ir gausime skirtingus neteisingus atsakymus. Atsakymas slypi tame, kad norint padidinti skaičių, reikia atlikti tris operacijas – ištraukti skaičių iš atminties, padidinti ir vėl įrašyti skaičių. Kadangi visos šios instrukcijos nėra vykdomos atomiškai (visos vienu metu), gali nutikti tokių keistų dalykų. Ši problema vadinama programavimu lenktynių būklė. Kai nežinomos jėgos nežinomu momentu gali paveikti bet kurios jūsų operacijos atlikimą.

Šaltinis: www.habr.com

Добавить комментарий