Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Introduktion til operativsystemer

Hej Habr! Jeg vil gerne præsentere for din opmærksomhed en række artikler-oversættelser af en interessant litteratur efter min mening - OSTEP. Dette materiale diskuterer ganske dybt arbejdet med unix-lignende operativsystemer, nemlig arbejde med processer, forskellige skemalæggere, hukommelse og andre lignende komponenter, der udgør et moderne OS. Du kan se originalen af ​​alle materialer her her. Bemærk venligst, at oversættelsen er lavet uprofessionelt (ganske frit), men jeg håber, at jeg har bevaret den generelle betydning.

Laboratoriearbejde om dette emne kan findes her:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- min personlige tilpasning: github.com/bykvaadm/OS/tree/master/ostep

Du kan også tjekke min kanal på telegram =)

Program drift

Hvad sker der, når et program kører? Et kørende program gør en simpel ting - det udfører instruktioner. Hvert sekund hentes millioner og endda muligvis milliarder af instruktioner af processoren fra RAM, til gengæld afkoder den dem (for eksempel genkender den, hvilken type disse instruktioner tilhører) og udfører dem. Dette kunne være at tilføje to tal, få adgang til hukommelsen, kontrollere en betingelse, springe til en funktion og så videre. Efter udførelsen af ​​en instruktion fortsætter processoren til udførelsen af ​​en anden. Og så instruktion efter instruktion udføres de indtil programmet slutter.
Dette eksempel anses naturligvis for at være forenklet - faktisk, for at fremskynde processoren, giver moderne hardware dig mulighed for at udføre instruktioner uden for tur, beregne mulige resultater, udføre instruktioner samtidigt og lignende tricks.

Von Neumann beregningsmodel

Den forenklede arbejdsform, der beskrives af os, ligner Von Neumann-beregningsmodellen. Von Neumann er en af ​​pionererne inden for computersystemer, han er også en af ​​forfatterne til spilteori. Mens programmet kører, finder en masse andre begivenheder sted, mange andre processer og tredjeparts logikarbejde, hvis hovedformål er at forenkle lanceringen, driften og vedligeholdelsen af ​​systemet.
Der er et sæt software, der er ansvarlig for at gøre programmer nemme at køre (eller endda tillade flere programmer at køre på samme tid), som tillader programmer at dele den samme hukommelse og kommunikere med forskellige enheder. Et sådant sæt software (software) kaldes i bund og grund et operativsystem, og dets opgaver omfatter overvågning af, at systemet fungerer korrekt og effektivt, samt at sikre nem administration af dette system.

Operativsystem

Et operativsystem, forkortet som et OS, er et sæt indbyrdes forbundne programmer designet til at styre computerressourcer og organisere brugerinteraktion med en computer..
OS opnår sin effektivitet i første omgang gennem den vigtigste teknik - teknikken virtualisering. OS interagerer med en fysisk ressource (processor, hukommelse, disk osv.) og transformerer den til en mere generel, mere kraftfuld og lettere at bruge form af sig selv. Derfor kan du for en generel forståelse meget groft sammenligne operativsystemet med en virtuel maskine.
For at give brugerne mulighed for at give kommandoer til operativsystemet og dermed bruge den virtuelle maskines muligheder (såsom at køre et program, allokere hukommelse, få adgang til en fil osv.), giver operativsystemet en eller anden grænseflade kaldet API (applikationsprogrammeringsgrænseflade), og som du kan foretage opkald til (opkald). Et typisk operativsystem gør det muligt at foretage hundredvis af systemopkald.
Endelig, da virtualisering tillader flere programmer at køre (og dermed dele CPU'en) og samtidig få adgang til deres instruktioner og data (derved dele hukommelse) og få adgang til diske (derved dele I/O-enheder). ), kaldes operativsystemet også en ressourcechef. Hver processor, disk og hukommelse er en ressource i systemet, og dermed bliver en af ​​operativsystemets roller opgaven med at administrere disse ressourcer, gøre det effektivt, ærligt eller omvendt, afhængigt af den opgave, som dette operativsystem til er designet.

CPU virtualisering

Overvej følgende program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Den udfører ingen specielle handlinger, faktisk er alt, hvad den gør, at kalde en funktion spinde(), hvis opgave er at cykle gennem tidskontrollen og vende tilbage efter et sekund er gået. Således gentager den på ubestemt tid den streng, som brugeren sendte som et argument.
Lad os køre dette program og give det tegnet "A" som et argument. Resultatet er ikke specielt interessant - systemet udfører simpelthen et program, der med jævne mellemrum viser tegnet "A".
Lad os nu prøve muligheden, når mange forekomster af det samme program kører, men udskriver forskellige bogstaver for at gøre det klarere. I dette tilfælde vil resultatet være noget anderledes. På trods af at vi har én processor, udføres programmet samtidigt. Hvordan sker det? Men det viser sig, at operativsystemet, ikke uden hjælp fra hardwarefunktioner, skaber en illusion. Illusionen om, at systemet har flere virtuelle processorer, der gør en enkelt fysisk processor til et teoretisk uendeligt antal og derved tillader tilsyneladende programmer at køre samtidigt. Denne illusion kaldes CPU virtualisering.
Dette billede rejser mange spørgsmål, for eksempel hvis flere programmer ønsker at køre på samme tid, hvilket af dem vil blive lanceret? OS'ets "politikker" er ansvarlige for dette spørgsmål. Politikker bruges mange steder i OS og besvarer spørgsmål som dette, og er de grundlæggende mekanismer, som OS implementerer. Deraf OS'ets rolle som ressourcemanager.

Hukommelsesvirtualisering

Lad os nu se på hukommelsen. Den fysiske model af hukommelse i moderne systemer er repræsenteret som en række bytes.. For at læse fra hukommelsen skal du angive celleadresseat få adgang til det. For at skrive eller opdatere data skal du også angive dataene og adressen på den celle, hvor de skal skrives.
Hukommelsen tilgås konstant under programafvikling. Et program gemmer hele sin datastruktur i hukommelsen og får adgang til den ved at udføre forskellige instruktioner. Instruktionerne er i mellemtiden også gemt i hukommelsen, så den er også tilgået for hver anmodning om den næste instruktion.

malloc() opkald

Overvej følgende program, som tildeler et område af hukommelsen ved hjælp af opkaldet malloc () (https://youtu.be/jnlKRnoT1m0):

Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Programmet gør flere ting. Først allokerer den noget hukommelse (linje 7), udskriver derefter adressen på den allokerede celle (linje 9), skriver nul til den første slot i den allokerede hukommelse. Dernæst går programmet ind i en løkke, hvori det øger værdien, der er gemt i hukommelsen på adressen i "p"-variablen. Den udskriver også selve proces-id'et. Proces-id'et er unikt for hver kørende proces. Efter at have lanceret flere kopier, vil vi snuble over et interessant resultat: I det første tilfælde, hvis du ikke gør noget og bare kører flere kopier, vil adresserne være anderledes. Men dette falder ikke ind under vores teori! Korrekt, da moderne distributioner har hukommelsesrandomisering aktiveret som standard. Hvis det er deaktiveret, får vi det forventede resultat - hukommelsesadresserne på to programmer, der kører samtidigt, vil matche.

Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Som et resultat viser det sig, at to uafhængige programmer arbejder med deres egne private adresserum, som igen er kortlagt af operativsystemet i fysisk hukommelse. Derfor vil brugen af ​​hukommelsesadresser inden for et program ikke påvirke andre på nogen måde, og det ser ud til, at hvert program har sit eget stykke fysiske hukommelse, der er givet til det. Virkeligheden er imidlertid, at fysisk hukommelse er en delt ressource, som styres af operativsystemet.

Konsistens

Et andet af de vigtige emner indenfor operativsystemer er − konsistens. Dette udtryk bruges, når man taler om problemer i systemet, der kan opstå, når man arbejder med mange ting på samme tid inden for samme program. Konsistensproblemer opstår selv inden for selve operativsystemet. I de tidligere eksempler på hukommelses- og processorvirtualisering indså vi, at operativsystemet styrer mange ting på samme tid - det starter den første proces, derefter den anden, og så videre. Som det viste sig, kan denne adfærd føre til nogle problemer. Så for eksempel oplever moderne multi-threaded-programmer sådanne vanskeligheder.

Overvej følgende program:

Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Programmet i hovedfunktionen opretter to tråde ved hjælp af opkaldet pthread_create(). I dette eksempel kan en tråd opfattes som en funktion, der kører i samme hukommelsesplads sammen med andre funktioner, med klart mere end én funktion, der kører på samme tid. I dette eksempel starter hver tråd og udfører funktionen worker() som igen blot øger variablen,.

Lad os køre dette program med et argument på 1000. Som du måske har gættet, skulle resultatet være 2000, fordi hver tråd øgede variablen 1000 gange. Alt er dog ikke så simpelt. Lad os prøve at køre programmet med en størrelsesorden flere gentagelser.

Operativsystemer: Tre nemme stykker. Del 1: Intro (oversættelse)

Ved at indtaste et tal, for eksempel 100000, forventer vi at se output som tallet 200000. Men hvis vi kører tallet 100000 flere gange, vil vi ikke blot ikke se det rigtige svar, men også få forskellige forkerte svar. Svaret ligger i det faktum, at for at øge antallet, kræves der tre operationer - at udtrække tallet fra hukommelsen, øge tallet og derefter skrive tallet tilbage. Da alle disse instruktioner ikke udføres atomisk (alle på samme tid), kan mærkelige ting som dette ske. Dette problem kaldes i programmering race tilstand. Når ukendte styrker på et ukendt tidspunkt kan påvirke udførelsen af ​​enhver af dine operationer.

Kilde: www.habr.com

Tilføj en kommentar