Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

Introduktion til operativsystemer

Hej, Habr! Jeg vil gerne præsentere for dig en serie af artikeloversættelser af en interessant litteratur — OSTEP. Dette materiale undersøger grundigt, hvordan unix-lignende operativsystemer fungerer, nemlig hvordan man arbejder med processer, forskellige scheduler, hukommelse og andre lignende komponenter, der udgør et moderne OS. Originalen af alt materiale kan du se her her. Vær opmærksom på, at oversættelsen er lavet uprofessionelt (temmelig frit), men jeg håber, at jeg har bevaret den overordnede mening.

Laboratoriearbejder om dette emne kan findes her:

Andre dele:

Og du kan også tjekke min kanal på telegram =)

Lad os overveje den mest fundamentale abstraktion, som operation systemet tilbyder brugere: processen. Definitionen af en proces er ret simpel - det er et kørende program. Programmet i sig selv er en livløs ting, der ligger på disken - det er en samling af instruktioner og muligvis nogle statiske data, der venter på at blive startet. Det er netop OS, der tager disse bytes og starter dem, omdanner programmet til noget nyttigt.
Ofte ønsker brugerne at køre mere end ét program samtidigt, for eksempel kan du starte en browser, et spil, en medieafspiller, en tekstbehandler og så videre på din bærbare computer. Faktisk kan et typisk system køre titusinder af processer samtidigt. Denne kendsgerning gør systemet lettere at bruge, du behøver aldrig at bekymre dig om, hvorvidt CPU'en er ledig, du skal blot starte programmerne.

Her opstår problemet: hvordan skaber man illusionen af flere CPU'er? Hvordan kan OS skabe illusionen af et næsten uendeligt antal CPU'er, selvom du kun har én fysisk CPU?

OS skaber denne illusion gennem CPU-virtualisering. Ved at starte én proces, derefter stoppe den, starte en anden proces og så videre, kan OS opretholde illusionen om, at der findes mange virtuelle CPU'er, selvom det faktisk kun vil være en eller flere fysiske processorer. Denne teknik kaldes tidsmæssig ressourceopdeling af CPU'en. Denne teknik tillader brugerne at køre så mange samtidige processer, de ønsker. Prisen for en sådan løsning er ydeevne - eftersom hvis CPU'en deles af flere processer, vil hver proces blive behandlet langsommere.
For at realisere CPU-virtualisering, og især for at gøre dette godt, har OS brug for både lavniveau- og højniveau-understøttelse. Lavniveauunderstøttelse kaldes mekanismer — det er lavniveau metoder eller protokoller, der implementerer den nødvendige del af funktionaliteten. Et eksempel på en sådan funktionalitet er konteksskift, som giver OS mulighed for at stoppe ét program og starte et andet program på processoren. Denne tidsmæssige opdeling er implementeret i alle moderne OS.
På toppen af disse mekanismer ligger der en vis logik, indlejret i operativsystemet, i form af 'politikker'. Politik er en algoritme til beslutningstagning i operativsystemet. Sådanne politikker bestemmer for eksempel, hvilket program der skal starte (fra kommandoernes liste) først. For eksempel vil denne opgave blive løst af politikken kaldet planlægningspolitik (scheduling policy) og ved valget af løsning vil den styres af data som: opstartshistorik (hvilket program har kørt længst i det sidste minut), hvilken belastning denne proces har (hvilke typer programmer der er blevet kørt), præstationsmetrikker (er systemet optimeret til interaktivt samspil eller båndbredde) og så videre.

Abstraktion: proces

Abstraktionen af et kørende program, udført af operativsystemet, er det, vi kalder en proces. Som nævnt tidligere er en proces blot et kørende program i et hvilket som helst øjeblik. Programmet, med hvilket vi kan få samlet information fra forskellige systemressourcer, som det tilgår, eller som dette program berører i løbet af sin udførelse.
For at forstå komponenterne i en proces er det nødvendigt at forstå systemets tilstand: hvad programmet kan læse eller ændre under sin kørsel. På ethvert tidspunkt skal man forstå, hvilke systemelementer der er vigtige for programmets udførelse.
Et af de åbenlyse elementer i systemets tilstand, som processen inkluderer — er hukommelse.Instruktioner opbevares i hukommelsen. De data, som programmet læser eller skriver, opbevares også i hukommelsen. På denne måde er den hukommelse, som processen kan adressere (det såkaldte adressrum), en del af processen.
Registrene er også en del af systemets tilstand. Mange instruktioner er rettet mod at ændre værdien af registrene eller læse deres værdier, og således bliver registrene også en vigtig del af processearbejdet.
Det skal bemærkes, at maskinens tilstand også består af nogle specielle registre. For eksempel, IP — instruction pointer — en peg til den instruktion, som programmet udfører i øjeblikket. Der er også stack pointer og den tilknyttede frame pointer, som bruges til at styre: funktionsparametre, lokale variabler og returadresser.
Endelig henvender programmerne sig ofte til ROM (permanent hukommelse). Sådanne oplysninger om “I/O” (ind- og uddata) skal inkludere en liste over filer, der er åbnet af processen i øjeblikket.

Process API

For bedre at forstå arbejdet med processen, lad os se på eksempler på systemopkald, som skal inkluderes i enhver grænseflade til operativsystemet. Disse API'er er på en eller anden måde tilgængelige på ethvert operativsystem.

● Opret (oprettelse): OS'en skal indeholde en metode, der gør det muligt at oprette nye processer. Når du indtaster en kommando i terminalen eller åbner et program ved at dobbeltklikke på dens ikonen, sendes der en anmodning til OS'en for at oprette en ny proces og derefter starte det angivne program.
● Sletning: Da der er en grænseflade til oprettelse af processer, skal OS'en også give mulighed for at tvinge en proces til at blive slettet. De fleste programmer vil naturligt blive startet og afsluttet af sig selv, mens de kører. Ellers vil brugeren gerne have muligheden for at dræbe dem, og derfor vil en grænseflade til at stoppe processen ikke være overflødig.
● Vent (venting): Nogle gange er det nyttigt at vente på, at en proces afsluttes, og derfor tilbydes der nogle grænseflader, der giver mulighed for venting.
● Forskellig kontrol (forskellig kontrol): Foruden at dræbe og vente på en proces findes der også andre forskellige kontrollerende metoder. For eksempel giver de fleste operativsystemer mulighed for at fryse en proces (stoppe dens udførelse i en periode) og derefter genoptage (fortsætte udførelsen).
● Status (status): Der findes forskellige grænseflader til at få nogle oplysninger om status for en proces, såsom hvor længe den har været kørende, eller hvilken tilstand den befinder sig i nu.

Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

Oprettelse af proces: detaljer

En af de interessante ting er, hvordan programmer konkret omdannes til processer. Især hvordan operativsystemet starter og kører et program. Hvordan en proces konkret oprettes.
Først og fremmest skal operativsystemet indlæse programmets kode og statiske data i hukommelsen (i procesens adresseområde). Programmer ligger typisk på disk eller solid-state drive i en eller anden eksekverbar format. Således kræver indlæsningsprocessen af programmet og de statiske data i hukommelsen, at operativsystemet kan læse disse bytes fra disken og placere dem et sted i hukommelsen.

I tidligere operativsystemer blev indlæsningsprocessen udført ivrigt, hvilket betyder, at koden blev indlæst i hukommelsen i sin helhed, før programmet blev kørt. Moderne operativsystemer gør dette doven, dvs. de indlæser kode- eller datastykker kun, når de er nødvendige for programmet under udførelsen.

Efter at koden og de statiske data er indlæst i hukommelsen, skal operativsystemet udføre yderligere nogle opgaver, før det kan starte processen. En vis mængde hukommelse skal være tildelt til stakken. Programmer bruger stakken til lokale variabler, funktionsparametre og returadresser.. Operativsystemet tildeler denne hukommelse og giver den til processen. Stakken kan også tildeles med nogle argumenter, især den fylder funktionsparametrene main(), f.eks. med arrayet argc og argv.

Operativsystemet kan også tildele en vis mængde hukommelse til programmets bunke (heap). Bunken bruges af programmer til eksplicit anmodede dynamisk tildelte data.. Programmer anmoder om dette rum ved at kalde funktionen. malloc() og renser det eksplicit ved at kalde funktionen. free(). Bunken er nødvendig for sådanne datastrukturer som: sammenkædede lister, hash-tabeller, træer og andre. I starten tildeles en lille mængde hukommelse til bunken, men over tid, under programmets kørsel, kan bunken anmode om mere hukommelse gennem biblioteks-API-kaldet malloc(). Operativsystemet er involveret i processen med at tildele mere hukommelse for at hjælpe med at opfylde disse anmodninger.

Operativsystemet vil også udføre initialiseringsopgaver, især dem der vedrører input-output. For eksempel har hver proces som standard 3 åbne filbeskrivelser i UNIX-systemer til standard input-, output- og fejllinjer. Disse beskrivelser gør det muligt for programmer at læse input fra terminalen samt at sende oplysninger til skærmen.

På den måde, ved at indlæse koden og de statiske data i hukommelsen, oprette og initialisere stakken samt udføre andet arbejde relateret til ind- og uddataopgaver, forbereder OS platformen til at udføre processen. Til sidst er der den sidste opgave: at starte programmet gennem dets indgangspunkt, kaldet funktionen main(). Når OS går videre til at udføre funktionen main(), overgiver det styringen til CPU'en til den nyoprettede proces, og dermed begynder programmet at køre.

Processens tilstand

Nu hvor vi har en vis forståelse af, hvad en proces er, og hvordan den oprettes, lad os liste de tilstande, en proces kan være i. I sin enkleste form kan en proces være i en af disse tilstande:
● Kørende. I den kørende tilstand kører processen på CPU'en. Det betyder, at instruktionerne udføres.
● Klar. I klar-tilstand er processen klar til at køre, men af en eller anden grund udfører OS den ikke på det pågældende tidspunkt.
● Blokeret. I den blokerede tilstand udfører processen nogle operationer, der forhindrer den i at være klar til at blive udført, indtil der sker en eller anden begivenhed. Et almindeligt eksempel er, når processen initierer en IO-operation, bliver den blokeret, og dermed kan en anden proces bruge CPU'en.

Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

Man kan forestille sig disse tilstande som en graf. Som vi kan se på billedet, kan processens tilstand ændre sig mellem KØRENDE og KLAR efter OS's skøn. Når processens tilstand ændrer sig fra KLAR til KØRENDE, betyder det, at processen er blevet planlagt. Omvendt, hvis den er fjernet fra planlægningen. I det øjeblik, hvor processen bliver BLOKERET, for eksempel ved at initialisere en IO-operation, vil OS holde den i denne tilstand, indtil en bestemt begivenhed, for eksempel afslutningen af IO, finder sted. På dette tidspunkt vil den skifte til KLAR-tilstand og muligvis straks til KØRENDE, hvis OS beslutter det.
Lad os se på et eksempel på, hvordan to processer bevæger sig gennem disse tilstande. For at begynde med, lad os forestille os, at begge processer kører, og hver bruger kun CPU'en. I dette tilfælde vil deres tilstande se således ud.

Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

I det næste eksempel anmoder den første proces efter en tid om IO og går i tilstanden BLOKKERET, hvilket giver en anden proces mulighed for at starte (FIG 1.4). OS ser, at proces 0 ikke bruger CPU og starter proces 1. Under udførelsen af proces 1 afsluttes IO, og status for proces 0 ændres til KLAR. Til sidst er proces 1 færdig, og efter dens afslutning starter proces 0, udfører og afslutter sin opgave.

Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

Datastruktur

OS er i sig selv et program, og ligesom enhver anden program har det nogle nøgledatastrukturer, der sporer forskellige relevante oplysninger. For at holde styr på tilstanden af hver proces vil OS opretholde en vis procesliste for alle processer i tilstanden KLAR og nogle yderligere informationer til at holde styr på de processer, der kører i øjeblikket. Derudover skal OS også holde øje med de blokerede processer. Efter IO afsluttes, skal OS vække den nødvendige proces og skifte den til en tilstand, der er klar til at køre.

For eksempel skal OS gemme tilstanden af processorregistret. I øjeblikket for at stoppe processen gemmes registerværdierne i procesens adresserum, og når processen genoptages, genfindes registerværdierne for dermed at fortsætte udførelsen af denne proces.

Udover tilstandene klar, blokeret og kørende findes der også nogle andre tilstande. Nogle gange kan en proces have tilstand INIT ved oprettelsen. Til sidst kan en proces placeres i tilstanden FINAL, når den allerede er afsluttet, men oplysningerne om den er endnu ikke blevet fjernet. I UNIX-systemer kaldes denne tilstand zombie-proces. Denne tilstand er nyttig i tilfælde, hvor den parent proces ønsker at vide retur koden for efterkommeren. For eksempel signalerer 0 normalt en succesfuld afslutning, mens 1 signalerer en fejl. Programmører kan dog lave yderligere udgangskoder, der signalerer om forskellige problemer. Når en parent-proces afsluttes, foretager den det sidste systemopkald, som f.eks. wait(), for at vente på, at efterkommerprocessen afsluttes og signalere til OS, at det er muligt at rydde eventuelle data relateret til den afsluttede proces.

Operating Systems: Three Easy Pieces. Part 2: Abstraktion: Proces (oversættelse)

Nøglepunkter fra forelæsningen:

● Proces — den primære abstraktion af et kørende program i et operativsystem. På ethvert tidspunkt kan en proces beskrives ud fra dens tilstand: indholdet af hukommelsen i dens adresserum, indholdet af CPU-registerne, inklusive instruction pointer og stack pointer samt oplysninger om I/O, såsom åbne filer, der bliver læst eller skrevet.
● Process API består af kald, som programmer kan foretage i forhold til processer. Normalt omfatter dette oprettelses-, sletnings- eller andre kald.
● En proces er i en af mange tilstande, herunder kørende, klar, blokeret. Forskellige hændelser, såsom planlægning, undtagelse fra planlægning eller venten, kan ændre en proces' tilstand fra én tilstand til en anden.
● Procesliste indeholder information om alle processer i systemet. Hver post i listen kaldes en process control block, som i virkeligheden er en struktur, der indeholder al nødvendig information om en bestemt proces.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster