Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

Sissejuhatus operatsioonisĂŒsteemidesse

Tere, Habr! Soovin tutvustada teile tĂ”lgitud artiklite seeriat, mis sisaldab ĂŒht huvitavat kirjandust — OSTEP. Selles materjalis kĂ€sitletakse sĂŒvitsi unix-sarnaste operatsioonisĂŒsteemide toimimist, nimelt protsesside haldamist, erinevaid planeerijaid, mĂ€lu ja muid sarnaseid komponente, mis moodustavad modernse operatsioonisĂŒsteemi. Originaali vĂ”ite vaadata siit siin. Palun arvestage, et tĂ”lge on tehtud mitteprofessionaalselt (piisavalt vabalt), kuid loodan, et olen pĂ”hisisu sĂ€ilitanud.

Laboritööd selle aine kohta leiate siit:
— originaal: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
— originaal: github.com/remzi-arpacidusseau/ostep-code
— minu isiklik kohandamine: github.com/bykvaadm/OS/tree/master/ostep

Lisaks vÔite minna minu kanalile Telegraam =)

Programmi töö

Mis juhtub, kui programm töötab? KĂ€ivitatud programm tĂ€idab ĂŒhte lihtsat asja — see tĂ€idab korraldusi. Iga sekundi jooksul tĂ”mbab protsessor miljonite ja isegi miljardite korralduste hulgast andmed töömĂ€lu, dekodeerib need (nĂ€iteks mÀÀrab, millist tĂŒĂŒpi need korraldused on) ja tĂ€idab need. Need vĂ”ivad olla kahe numbri liitmine, mĂ€lule ligipÀÀs, tingimuse kontrollimine, funktsiooni juurde ĂŒleminek ja nii edasi. PĂ€rast ĂŒhe korralduse tĂ€itmist lĂ€heb protsessor jĂ€rgmise tĂ€itmise juurde. Nii tĂ€idetakse korraldus jĂ€rgemööda seni, kuni programm lĂ”petatakse.
See nĂ€ide on loomulikult lihtsustatud — tegelikult vĂ”imaldab kaasaegne riistvara protsessori töö kiirendamiseks tĂ€ita korraldusi jĂ€rjekorrata, arvutada vĂ”imalikke tulemusi, tĂ€ita korraldusi samaaegselt ja teisi sarnaseid trikke.

Von Neumanni arvutusmudel

Kuwas toodulembavad kuulumise protsess sarnaneb Von Neumanni arvutusmudelile. Von Neumann on ĂŒks arvutussĂŒsteemide pioneeridest ning ka mĂ€nguteooria autoritest.. Programmide töö kĂ€igus toimub veel palju teisi sĂŒndmusi, töötab hulgaliselt teisi protsesse ja kolmanda osapoole loogikat, mille pĂ”hieesmĂ€rk on sĂŒsteemi kĂ€ivitamise, töö ning hoolduse lihtsustamine.
On olemas tarkvarade kogum, mis vastutab programmide lihtsa kĂ€ivitamise eest (vĂ”i isegi vĂ”imaldab mitme programmi samaaegset kĂ€ivitamist). See vĂ”imaldab programmide jagada sama mĂ€lu ning suhelda erinevate seadmetega. Sellist tarkvara (operatiivtarkvara) nimetatakse operatsioonisĂŒsteemiks, mille ĂŒlesanne on jĂ€lgida, et sĂŒsteem töötaks Ă”igesti ja efektiivselt, ning tagada, et sĂŒsteemi haldamine oleks lihtne.

OperatsioonisĂŒsteem

OperatsioonisĂŒsteem, lĂŒhendatult OS — on omavahel seotud programmide kompleks, mis on mĂ”eldud arvuti ressursside haldamiseks ja kasutaja suhtlemise korraldamiseks arvutiga..
OS saavutab oma efektiivsuse eelkĂ”ige kĂ”ige olulisema tehnika kaudu — virtualiseerimise tehnika. virtualiseerimine. OperatsioonisĂŒsteem suhtleb fĂŒĂŒsiliste ressurssidega (protsessor, mĂ€lu, ketas jne) ja muudab need enda lihtsamaks ja universaalsemaks vormiks. SeetĂ”ttu vĂ”ib operatsioonisĂŒsteemi vĂ€ga ĂŒldiselt vĂ”rrelda virtuaalmasinaga.
Kasutajatele kĂ€skude andmiseks operatsioonisĂŒsteemile ning virtuaalmasina vĂ”imaluste (nt programmide kĂ€ivitamine, mĂ€lu eraldamine, failidele juurdepÀÀs jne) kasutamiseks vĂ”imaldab operatsioonisĂŒsteem teatud liidest, mida nimetatakse API (rakenduste programmeerimise liideseks) ja millele saab teha kutseid (call). TĂŒĂŒpiline operatsioonisĂŒsteem vĂ”imaldab teha sadu sĂŒsteemikutseid.
LĂ”puks, kuna virtualiseerimine vĂ”imaldab mitmetel programmidel töötada (seega jagada CPU-d) ja samal ajal ligipÀÀsu nende juhistele ja andmetele (jagades seega mĂ€lu), samuti ligipÀÀsule ketastele (seega jagades sisend-vĂ€ljund seadmeid), nimetatakse operatsioonisĂŒsteemi ka ressursside halduriks. Iga protsessor, ketas ja mĂ€lu on sĂŒsteemi ressurss ja seega ĂŒks operatsioonisĂŒsteemi rollidest on nende ressursside haldamine, tehes seda tĂ”husalt, Ă”iglaselt vĂ”i vastupidi, sĂ”ltuvalt ĂŒlesandest, milleks see operatsioonisĂŒsteem on loodud.

CPU virtualiseerimine

Vaatame jÀrgmist programmi:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

See ei tee midagi erilist, pĂ”himĂ”tteliselt kutsub see lihtsalt funktsiooni spin(), mille ĂŒlesanne on aegade tsĂŒkliline kontrollimine ja tagastamine pĂ€rast seda, kui ĂŒks sekund on möödunud. Seega kordab see lĂ”putult rida, mille kasutaja on argumendina edastanud.
KĂ€ivitame selle programmi ja anname sellele argumendiks sĂŒmboli “A”. Tulemuseks on midagi vĂ€ga huvitavat — sĂŒsteem tĂ€idab lihtsalt programmi, mis perioodiliselt kuvab ekraanile sĂŒmboli “A”.
NĂŒĂŒd proovime varianti, kus kĂ€ivitatakse mitu eksemplari ĂŒhest ja samast programmist, kuid need kuvavad erinevaid tĂ€hti, et oleks selgem. Sel juhul on tulemus veidi erinev. Ehkki meil on ĂŒks protsessor, töötab programm samaaegselt. Kuidas see vĂ”imalik on? Asi on selles, et opsĂŒsteem, kasutades riistvara vĂ”imalusi, loob illusiooni. Illusiooni, et sĂŒsteemis on mitu virtuaalset protsessorit, muutes ĂŒhe fĂŒĂŒsilise protsessori teoreetiliselt lĂ”pmatuks ja seelĂ€bi vĂ”imaldades programmide nĂ€iliselt samaaegset tĂ€itmist. Sellist illusiooni nimetatakse CPU virtualiseerimiseks.
Sarnane olukord tekitab palju kĂŒsimusi, nĂ€iteks, kui mitu programmi soovivad samal ajal kĂ€ivituda, siis milline neist kĂ€ivitub? Selle kĂŒsimuse eest vastutavad OS-i "poliitikad". Poliitikaid kasutatakse paljudes kohtades OS-is ja nad vastavad sellistele kĂŒsimustele, olles samuti pĂ”himehhanismid, mida OS rakendab. Seega on OS-i roll kui ressursihaldurit selgelt mÀÀratletud.

MĂ€lu virtualiseerimine

NĂŒĂŒd vaatame mĂ€lu. FĂŒĂŒsiline mĂ€lu mudel kaasaegsetes sĂŒsteemides esitatakse kui baitide massiiv.. MĂ€lu lugemiseks tuleb nĂ€idata mĂ€lu aadress, et sellele juurde pÀÀseda. Andmete kirjutamiseks vĂ”i vĂ€rskendamiseks tuleb samuti nĂ€idata andmed ja aadress, kuhu need salvestada.
MÀlu kasutamine toimub pidevalt programmi töötamise kÀigus. Programm salvestab mÀlu kogu oma andmestruktuuri ja kasutab seda erinevate kÀskude tÀitmiseks. KÀskude vahel hoitakse samuti mÀlu, seetÔttu toimub mÀlu juurde pÀÀsemine ka iga jÀrgneva kÀsu nÔudmisel.

malloc() vÀljakutse

Vaatame jÀrgmist programmi, mis eraldab mÀlualale, kasutades vÀljakutset malloc() (https://youtu.be/jnlKRnoT1m0):

Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

Programm teeb mitmeid asju. Esiteks eraldab ta teatud hulga mĂ€lu (rea 7), seejĂ€rel vĂ€ljastab eraldatud mĂ€luraku aadressi (rea 9) ja kirjutab nulli esimesse eraldatud mĂ€lu pesasse. Edasi liigub programm tsĂŒklisse, kus ta suurendab vÀÀrtust, mis on salvestatud mĂ€llu muutuja “p” aadressil. Samuti vĂ€ljastab ta enda protsessi ID. Protsessi ID on iga kĂ€ivitatud protsessi jaoks ainulaadne.. KĂ€ivitades mitu koopia, satume huvitavale tulemusele: esimeses variandis, kui mitte midagi teha ja lihtsalt kĂ€ivitada mitu koopia, siis aadressid on erinevad. Kuid see ei sobi meie teooriaga! Õige, kuna tĂ€napĂ€evastes jaotustes on vahemĂ€lu randomiseerimise funktsioon vaikimisi sisse lĂŒlitatud. Kui see vĂ€lja lĂŒlitada, saame oodatud tulemuse — kahel samal ajal töötaval programmil on mĂ€luaadressid samad.

Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

Seega selgub, et kaks sĂ”ltumatut programmi töötavad oma ainulaadsete privaatsete aadressiruumidega, mis omakorda kaardistatakse operatsioonisĂŒsteemi poolt fĂŒĂŒsilisse mĂ€llu.. SeetĂ”ttu ei mĂ”juta ĂŒhe programmi mĂ€luaadresse teiste toimimist ja igale programmile nĂ€ib, et tal on oma tĂŒkike fĂŒĂŒsilisest mĂ€lust, mis on tĂ€ielikult tema kĂ€sutuses. Kahjuks on reaalsus see, et fĂŒĂŒsiline mĂ€lu on jagatud ressurss, mille haldamise eest vastutab operatsioonisĂŒsteem.

Konsistentsus

Veel ĂŒks oluline teema operatsioonisĂŒsteemide raames on kooskĂ”la. Seda mĂ”istet kasutatakse, kui rÀÀgitakse probleemidest sĂŒsteemis, mis vĂ”ivad tekkida, kui mitmeid asju tehakse samaaegselt ĂŒhe programmi raames. KooskĂ”la probleemid esinevad isegi operatsioonisĂŒsteemis endas. Eelnevates nĂ€idetes, mis puudutavad mĂ€lu ja protsessori virtualiseerimist, mĂ”istsime, et operatsioonisĂŒsteem haldab palju asju samaaegselt — kĂ€ivitades esimese protsessi, seejĂ€rel teise ja nii edasi. Selgub, et selline kĂ€itumine vĂ”ib pĂ”hjustada teatud probleeme. NĂ€iteks kaasaegsed mitme lĂ”imega programmid kogevad selliseid raskusi.

Vaatame jÀrgmist programmi:

Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

Programm peafunktsioonis loob kaks lĂ”ime, kasutades kĂ€sku Pthread_create(). Selles nĂ€ites saab voogu mĂ”ista kui funktsiooni, mis töötab ĂŒhes mĂ€luruumis koos teiste funktsioonidega, kusjuures samaaegselt on kĂ€imas selgelt rohkem kui ĂŒks funktsioon. Igas nĂ€ites algab ja tĂ€idab iga voog funktsiooni worker(), mis omakorda lihtsalt inkrementeerib muutujat,.

KÀivitame selle programmi argumendiga 1000. Nagu sa juba arvasid, peaks tulemuseks olema 2000, kuna iga voog inkrementeeris muutujat 1000 korda. Ent asi ei olegi nii lihtne. Proovime programmi kÀivitada numbriga, mis on kordades suurem.

Töökeskkonnad: Kolm lihtsat tĂŒkki. Osa 1: Sissejuhatus (tĂ”lge)

Sisestades, nĂ€iteks, numbri 100000, ootame tulemuseks nĂ€ha arvu 200000. Kuid kui kĂ€ivitame numbri 100000 mitu korda, ei saa me mitte ainult vale vastust, vaid ka erinevaid vale vastuseid. Saladus peitub selles, et arvu suurendamiseks on vajalik kolm toimingut — arvu mĂ€lu meelest vĂ€lja vĂ”tma, inkrementeerima ja seejĂ€rel kirjutama arvu tagasi. Kuna kĂ”ik need juhised ei toimu atomaarsetena (samal ajal), vĂ”ivad aset leida sellised kummalised asjad. Seda probleemi nimetatakse programmeerimises vĂ”istlusolukord — olukord, kus tundmatud jĂ”ud vĂ”ivad tundmatul hetkel mĂ”jutada mĂ”ne teie toimingu tĂ€itmist..

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster