KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

Sissejuhatus operatsioonisĂŒsteemidesse

Tere, Habr! Soovin teile tutvustada artiklite seeriat, mis on tĂ”lgitud huvitavast, minu arvates, kirjandusest - OSTEP. Selles materjalis kĂ€sitletakse sĂŒvitsi Unix-laadsete operatsioonisĂŒsteemide tööd, nimelt protsesside, erinevate ajastajate, mĂ€lu ja muude sarnaste komponentide tegemist, mis moodustavad kaasaegse OS-i. Originaali kĂ”iki materjale saate vaadata siit siit. Palun arvestage, et tĂ”lge on tehtud mitteprofessionaalselt (piisavalt vaba), kuid loodan, et ĂŒldine mĂ”te on sĂ€ilinud.

KÀesoleva aine laboritöid saab leida 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

Ja vĂ”ite ka kĂŒlastada minu kanalit Telegramis =)

Programmi töö

Mis toimub, kui mĂ”ni programm töötab? KĂ€ivitatud programm teeb ĂŒhte lihtsat asja - see tĂ€idab juhiseid. Iga sekundi jooksul tĂ”mbab protsessor mĂ€lust vĂ€lja miljonid ja isegi vĂ”imalik, et miljardid juhiseid, samal ajal dekodeerides neid (nĂ€iteks tuvastab, kuhu tĂŒĂŒpi need juhised kuuluvad) ja tĂ€idab. Need vĂ”ivad olla kahe numbri liitmine, mĂ€lu juurde pÀÀsemine, tingimuse kontrollimine, funktsiooni juurde ĂŒleminek ja nii edasi. PĂ€rast ĂŒhe juhise tĂ€itmist liigub protsessor jĂ€rgmise tĂ€itmise juurde. Ja nii juhis juhise jĂ€rel, nad tĂ€idetakse, kuni programm lĂ”petatakse.
Antud nÀide on loomulikult lihtsustatud - tegelikult vÔimaldab kaasaegne riistvara protsessori töötamise kiirusel tÀita juhiseid vÀljaspool jÀrjekorda, arvutada vÔimalikke tulemusi, tÀita juhiseid samaaegselt ja palju muid sarnaseid nippe.

Von Neumani arvutusmudel

Meie kirjeldatud lihtsustatud vorm töötab sarnaselt Von Neumani arvutusmudelile. Von Neumann on ĂŒks arvutussĂŒsteemide pioneeridest, samuti ĂŒks mĂ€nguteooria autoritest.. Programmi töötamise ajal toimub veel mitmeid muid sĂŒndmusi, töötavad paljusid teisi protsesse ja kĂ”rvalisi loogika, mille peamine eesmĂ€rk on sĂŒsteemi kĂ€ivitamine, toimimine ja hooldamine lihtsustamine.
On olemas tarkvarakomplekt, mis vastutab programmide kĂ€ivitamise lihtsuse eest (vĂ”i isegi vĂ”imaldab mitme programmi samaaegset kĂ€ivitamist); see vĂ”imaldab programmidel jagada ĂŒhte ja sama mĂ€lu ning suhelda erinevate seadmetega. Sellist tarkvarakomplekti nimetatakse operatsioonisĂŒsteemiks, mille ĂŒlesanne on jĂ€lgida, et sĂŒsteem töötaks korrektselt ja tĂ”husalt, ning tagada selle haldamise lihtsus.

OperatsioonisĂŒsteem

OperatsioonisĂŒsteem, lĂŒhendatult OS — omavahel seotud programmide kogum, mis on mĂ”eldud arvuti ressursside haldamiseks ja kasutaja suhtlemiseks arvutiga..
OS saavutab oma efektiivsuse peamiselt lĂ€bi kĂ”ige olulisema tehnika — tehnika virtualiseerimine. OS suhtleb fĂŒĂŒsiliste ressurssidega (protsessor, mĂ€lu, ketas jne) ja muudab need ĂŒldiseks, suuremate vĂ”imalustega ja kasutamiseks lihtsamaks vormiks. SeetĂ”ttu vĂ”ib operatsioonisĂŒsteemi ĂŒldiseks mĂ”istmiseks vĂ€ga jĂ€medalt vĂ”rrelda virtuaalmasinaga.
Kasutajate kĂ€su andmiseks operatsioonisĂŒsteemile ja seega virtuaalmaski vĂ”imaluste kasutamiseks (nt programmi kĂ€ivitamine, mĂ€lu eraldamine, faili juurde pÀÀsemine jne) pakub operatsioonisĂŒsteem mingit liidest, mida nimetatakse API (rakenduste programmeerimise liides) ja kellele saab teha vĂ€ljakutseid (call). TĂŒĂŒpiline operatsioonisĂŒsteem vĂ”imaldab teha sadu sĂŒsteemi vĂ€ljakutseid.
Ja lĂ”puks, kuna virtualiseerimine vĂ”imaldab paljude programmide töötamist (seega CPU jagamine) ja samal ajal juurdepÀÀsu nende juhistele ja andmetele (jagades seega mĂ€lu) ning juurdepÀÀsu ketastele (seega seadmete jagamine), nimetatakse operatsioonisĂŒsteemi veel ka ressursside halduriks. Iga protsessor, ketas ja mĂ€lu on sĂŒsteemi ressurss ning seega on operatsioonisĂŒsteemi ĂŒheks rolliks nende ressursside tĂ”hus ja Ă”iglane haldamine vĂ”i vastupidi, sĂ”ltuvalt ĂŒlesandest, mille jaoks operatsioonisĂŒsteem on loodud.

CPU virtualiseerimine

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

KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

See ei tee mingeid erilisi toiminguid, pĂ”himĂ”tteliselt teeb see vaid funktsiooni kutsumise spin(), milleks on ajavahemiku tsĂŒkliline kontrollimine ja tagasipöördumine pĂ€rast ĂŒhe sekundi möödumist. Seega kordab see lĂ”putult kasutaja antud argumenti.
KĂ€ivitame selle programmi ja viime sinna argumendiks sĂŒmboli 'A'. Tulemuseks on mitte kuigi huvitav — sĂŒsteem lihtsalt tĂ€idab programmi, mis perioodiliselt kuvab ekraanile sĂŒmbolit 'A'.
NĂŒĂŒd proovime varianti, kus töötavad mitu sama programmi eksemplari, aga nĂ€itavad erinevaid tĂ€hti, et asja selgemaks teha. Sellisel juhul saab tulemus veidi teistsugune. Ehkki meil on ainult ĂŒks protsessor, töötab programm samal ajal. Kuidas see vĂ”imalik on? See juhtub nii, et operatsioonisĂŒsteem, kasutades riistvara vĂ”imalusi, loob illusiooni. Illusiooni, et sĂŒsteemis on mitu virtuaalset protsessorit, muutes ĂŒhe fĂŒĂŒsilise protsessori teoreetiliselt lĂ”pmatuks hulgaks ja lubades seega programmidel nĂ€iliselt töötada samal ajal. Sellist illusiooni nimetatakse CPU virtualiseerimiseks.
Sarnane pilt tekitab palju kĂŒsimusi, nĂ€iteks kui mitu programmi soovivad samal ajal kĂ€ivituda, siis milline neist kĂ€ivitatakse? Selle kĂŒsimuse eest vastutavad operatsioonisĂŒsteemi “poliitikad”. Poliitikaid kasutatakse paljudes kohtades operatsioonisĂŒsteemis ja need vastavad sellistele kĂŒsimustele, ning on ka pĂ”himehanismid, mida operatsioonisĂŒsteem rakendab. Seega on operatsioonisĂŒsteemi roll ressursside haldurina.

MĂ€lu virtualiseerimine

NĂŒĂŒd vaatame mĂ€lu. Kaasaegsete sĂŒsteemide fĂŒĂŒsiline mĂ€lumudel esindab end kui baitide massi.MĂ€lust lugemiseks peab nĂ€itama mĂ€lurakenduse aadressi, et sellele juurde pÀÀseda. Andmete salvestamiseks vĂ”i uuendamiseks peab samuti nĂ€itama andmed ja see aadress, kuhu need salvestada.
MÀlu juurde pÀÀsemine toimub pidevalt programmi töö kÀigus. Programm salvestab mÀllu kogu oma andmestruktuuri ja pÀÀseb sellele juurde, tehes erinevaid juhiseid. Juhised ise salvestatakse mÀllu, seetÔttu juhtub mÀluga kontakteerumine samuti iga kord, kui jÀrgmise juhise jaoks tehtakse pÀring.

Kutsumine malloc()

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

KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

Programm teeb mitmeid asju. Esiteks eraldab see teatud hulga mĂ€lu (rida 7), seejĂ€rel prindib vĂ€lja eraldatud mĂ€luse vea aadressi (rida 9), salvestab nulli esimesse eraldatud mĂ€lu sloti. SeejĂ€rel siseneb programm tsĂŒklisse, milles suurendab vÀÀrtust, mis on salvestatud aadressil muutuja „p” jĂ€rgi. Samuti prindib see vĂ€lja enda protsessi identifikaatori. Protsessi identifikaator on iga kĂ€ivitatud protsessi jaoks ainulaadne. KĂ€ivitades mitu koopia, seisame silmitsi huvitava tulemusega: esimesel juhul, kui mitte midagi teha ja lihtsalt kĂ€ivitada mitu koopia, siis aadressid on erinevad. Kuid see ei sobi meie teooriaga! Õige, kuna kaasaegsetes jaotustes on vaikimisi lubatud mĂ€lu randomiseerimise funktsioon. Kui selle vĂ€lja lĂŒlitame, saame oodatud tulemuse - kahe samaaegselt töötava programmi mĂ€luaadressid kattuvad.

KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

KokkuvĂ”ttes töötab kaks sĂ”ltumatut programmi oma erakordsete aadressiruumidega, mis seejĂ€rel kaardistatakse operatsioonisĂŒsteemi poolt fĂŒĂŒsilisse mĂ€llu.. SeetĂ”ttu ei mĂ”juta mĂ€lu aadresside kasutamine ĂŒhes programmis kuidagi teisi ja igale programmile nĂ€ib, et tal on oma fĂŒĂŒsilise mĂ€lu osa, mis on tĂ€ielikult tema kĂ€sutuses. Kuid reaalsus on see, et fĂŒĂŒsiline mĂ€lu on jagatud ressurss, mille haldamise eest vastutab operatsioonisĂŒsteem.

JĂ€rjepidevus

Veel ĂŒks oluline teema operatsioonisĂŒsteemides on jĂ€rjepidevus. See termin kasutatakse, kui rÀÀgitakse sĂŒsteemi probleemidest, mis vĂ”ivad tekkida, kui töötatakse samaaegselt paljude asjadega ĂŒhe programmi piires. JĂ€rjepidevuse probleemid tekivad isegi operatsioonisĂŒsteemis endas. Eelmistes nĂ€idetes mĂ€lude ja protsessori virtualiseerimisega mĂ”istsime, et operatsioonisĂŒsteem haldab samaaegselt palju asju - kĂ€ivitab esmakordse protsessi, siis teise ja nii edasi. Selgus, et selline kĂ€itumine vĂ”ib pĂ”hjustada teatud probleeme. NĂ€iteks kannatavad kaasaegsed mitme lĂ€bipÀÀsuga programmid selliste raskuste all.

Vaatame jÀrgmist programmi:

KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

Peamine funktsioon loob kaks niiti, kasutades funktsiooni Pthread_create(). Selles nĂ€ites vĂ”ib niiti mĂ”ista kui funktsiooni, mis kĂ€ivitatakse ĂŒhes mĂ€luruumis koos teiste funktsioonidega, kusjuures samal ajal on selgelt rohkem kui ĂŒks kĂ€ivitatud funktsioon. Selles nĂ€ites kĂ€ivitab iga niit ja tĂ€idab funktsiooni worker(), mis omakorda lihtsalt suurendab mingit muutuja vÀÀrtust.,.

KÀivitame selle programmi argumendiga 1000. Nagu vÔisite arvata, peaks tulemuseks olema 2000, kuna iga niit suurendas muutuja vÀÀrtust 1000 korda. Kuid asi pole nii lihtne. Proovime kÀivitada programmi kordusega, mis on oluliselt suurem.

KasutussĂŒsteemid: Kolm lihtsat osa. Osa 1: Sissejuhatus (tĂ”lge)

Sisestades nĂ€iteks arvu 100000, loodame nĂ€ha vĂ€ljundis arvu 200000. Kuid kui kĂ€ivitame arvu 100000 mitu korda, ei saa me mitte ainult Ă”iget vastust, vaid saame ka erinevaid valesid vastuseid. Lahendus peitub selles, et numbri suurendamiseks on vajalik kolm sammu — arvu mĂ€lust lugemine, suurendamine ja seejĂ€rel numbri tagasi kirjutamine. Kuna kĂ”ik need juhised ei toimu aatomiliselt (korraga), vĂ”ivad toimuda kummalised asjad. Seda probleemi nimetatakse programmeerimises race condition — vĂ”idujooks. Kui tundmatud tegurid vĂ”ivad tundmatul hetkel mĂ”jutada mĂ”ne teie operatsiooni tĂ€itmist.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster