Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

Introduktion till operativsystem

Hej, Habr! Jag vill presentera en serie artiklar med översĂ€ttningar av en intressant litteratur — OSTEP. I detta material behandlas arbetet med Unix-liknande operativsystem pĂ„ djupet, speciellt — hantering av processer, olika schemalĂ€ggare, minne och andra liknande komponenter som utgör ett modernt OS. Originalet av allt material kan du se hĂ€r ). Ett typiskt exempel pĂ„ anvĂ€ndning:. Observera att översĂ€ttningen Ă€r utförd oprofessionellt (relativt fritt), men jag hoppas att jag har bevarat den övergripande meningen.

Laborationsarbeten för detta Àmne kan hittas hÀr:
— originalet: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
— originalet: github.com/remzi-arpacidusseau/ostep-code
— min personliga anpassning: github.com/bykvaadm/OS/tree/master/ostep

Och du kan ocksÄ kolla in min kanal pÄ telegram =)

Programmets arbete

Vad hĂ€nder egentligen nĂ€r ett program körs? Ett startat program utför en enkel uppgift — det exekverar instruktioner. Varje sekund hĂ€mtas miljoner, kanske till och med miljarder instruktioner av processorn frĂ„n det interna minnet, som sedan dekoderar dem (till exempel identifierar vilken typ av instruktioner detta Ă€r) och exekverar dem. Detta kan inkludera att addera tvĂ„ siffror, fĂ„ Ă„tkomst till minnet, kontrollera ett villkor, hoppa till en funktion och sĂ„ vidare. Efter att en instruktion har genomförts gĂ„r processorn vidare till att utföra nĂ€sta. PĂ„ sĂ„ sĂ€tt exekveras instruktionerna en efter en tills programmet avslutas.
Detta exempel Ă€r naturligtvis förenklat — i verkligheten gör modern hĂ„rdvara det möjligt för processorn att exekvera instruktioner utanför sin ordning, berĂ€kna möjliga resultat, exekvera instruktioner samtidigt och andra liknande knep för att snabba upp arbetet.

Von Neumann-modellen för berÀkning

Den förenklade form som vi har beskrivit liknar Von Neumann-modellen för berÀkningar. Von Neumann var en av pionjÀrerna inom datorsystem och en av författarna till spelteorin.. Under programkörningen intrÀffar mÄnga andra hÀndelser, mÄnga andra processer och extern logik arbetar, vars huvudsakliga syfte Àr att förenkla starten, driften och underhÄllet av systemet.
Det finns en uppsÀttning programvara som ansvarar för att förenkla körningen av program (eller till och med möjliggör körning av flera program samtidigt), den lÄter program dela samma minne samt interagera med olika enheter. Denna programuppsÀttning kallas i grunden operativsystem och dess uppgifter inkluderar att övervaka sÄ att systemet fungerar korrekt och effektivt, samt att sÀkerstÀlla att systemet Àr lÀtt att hantera.

Operativsystem

Operativsystem, förkortat OS, Àr en uppsÀttning relaterade program som Àr avsedda att hantera datorresurser och organisera anvÀndarens interaktion med datorn..
OS uppnĂ„r sin effektivitet frĂ€mst genom den viktigaste tekniken — tekniken för virtualisering.. OS interagerar med fysiska resurser (processor, minne, disk och liknande) och omvandlar dem till en mer generell, mer kapabel och enklare att anvĂ€nda form av sig sjĂ€lv. DĂ€rför kan man mycket grovt jĂ€mföra operativsystemet med en virtuell maskin för allmĂ€n förstĂ„else.
För att möjliggöra för anvÀndare att ge kommandon till operativsystemet och dÀrmed anvÀnda funktionerna hos den virtuella maskinen (sÄsom: köra program, tilldela minne, fÄ tillgÄng till filer och sÄ vidare), erbjuder operativsystemet ett grÀnssnitt som kallas API (application programming interface) och som man kan göra anrop (call) till. Ett typiskt operativsystem ger möjlighet att göra hundratals systemanrop.
Och slutligen, eftersom virtualisering tillÄter mÄnga program att fungera (pÄ sÄ sÀtt dela CPU), och samtidigt fÄ tillgÄng till deras instruktioner och data (dÀrigenom dela minnet), samt fÄ tillgÄng till diskar (pÄ sÄ sÀtt dela I/O-enheter), kallas operativsystemet ocksÄ för resursförvaltare. Varje processor, disk och minne Àr systemresurser och dÀrför blir en av operativsystemets roller att hantera dessa resurser, pÄ ett effektivt, rÀttvist eller, tvÀrtom, beroende pÄ uppgiften, som det operativsystemet Àr utvecklat för.

Virtualisering av CPU

LÄt oss titta pÄ följande program:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

Det utför inga sÀrskilda ÄtgÀrder, allt det gör Àr att anropa funktionen spin(), vars uppgift Àr att cykliskt kontrollera tiden och returnera efter att en sekund har passerat. PÄ sÄ sÀtt upprepar den oÀndligt den strÀng som anvÀndaren skickade som argument.
LĂ„t oss köra detta program och ge den argumentet tecknet “A”. Resultatet blir inte sĂ€rskilt intressant — systemet kör helt enkelt programmet som periodiskt skriver ut tecknet “A”.
Nu ska vi prova ett alternativ dÀr flera instanser av samma program körs men skriver ut olika bokstÀver för att göra det tydligare. I detta fall kommer resultatet att bli nÄgot annat. Trots att vi har en processor kör programmen samtidigt. Hur kan det vara sÄ? Det Àr sÄ att operativsystemet, med hjÀlp av hÄrdvarans möjligheter, skapar en illusion. Illusionen av att det finns flera virtuella processorer i systemet, vilket gör att en fysisk processor teoretiskt kan fungera som oÀndligt mÄnga och dÀrmed lÄta programmen se ut som om de körs samtidigt. Denna illusion kallas CPU-virtualisering.
Denna bild ger upphov till mĂ„nga frĂ„gor, till exempel, om flera program vill starta samtidigt, vilket program kommer att startas? Denna frĂ„ga besvaras av “policyer” inom operativsystemet. Policyer anvĂ€nds pĂ„ mĂ„nga stĂ€llen i operativsystemet och svarar pĂ„ liknande frĂ„gor, och de Ă€r Ă€ven de grundlĂ€ggande mekanismer som operativsystemet implementerar. HĂ€rifrĂ„n kommer operativsystemets roll som resurshanterare.

Minnevirtualisering

Nu lÄt oss titta pÄ minnet. Den fysiska modellen av minnet i moderna system representeras som en matris av byte. För att lÀsa frÄn minnet mÄste man ange adress för cellen, för att fÄ tillgÄng till den. För att skriva eller uppdatera data behöver man ocksÄ ange data samt adressen pÄ cellen dÀr de ska skrivas.
Åtkomster till minnet sker kontinuerligt under programmets körning. Programmet lagrar hela sin dataskruktur i minnet och kommer Ă„t den medan det utför olika instruktioner. Instruktioner lagras ocksĂ„ i minnet, sĂ„ Ă„tkomst sker ocksĂ„ vid varje begĂ€ran för nĂ€sta instruktion.

Anrop av malloc()

LÄt oss övervÀga följande program som allokerar minne genom ett anrop malloc() (https://youtu.be/jnlKRnoT1m0):

Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

Programmet gör flera saker. Först allokerar det en viss mĂ€ngd minne (rad 7), sedan skriver det ut adressen för den allokerade cellen (rad 9), och skriver noll i den första sloten av det allokerade minnet. DĂ€refter gĂ„r programmet in i en loop dĂ€r det inkrementerar vĂ€rdet som skrivs i minnet vid adressen i variabeln “p”. Det skriver ocksĂ„ ut processens eget ID. Process-ID:t Ă€r unikt för varje körd process. Om vi kör flera instanser av programmet kommer vi att stöta pĂ„ ett intressant resultat: I det första fallet, om vi inte gör nĂ„got sĂ€rskilt och bara kör flera kopior, sĂ„ kommer adresserna att vara olika. Men det hĂ€r stĂ€mmer inte med vĂ„r teori! RĂ€tt, eftersom den moderna distributionen har funktionen för minnesrandomisering aktiverad som standard. Om vi stĂ€nger av den, fĂ„r vi det förvĂ€ntade resultatet — minnesadresserna för tvĂ„ program som körs samtidigt kommer att överensstĂ€mma.

Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

SÄ det visar sig att tvÄ oberoende program arbetar med sina egna privata adressutrymmen, som i sin tur tilldelas av operativsystemet i det fysiska minnet.. DÀrför kommer anvÀndningen av minnesadresser inom ett program inte att pÄverka andra, och varje program tror att det har sin egen bit av det fysiska minnet till sjÀlvkostnadspris. Verkligheten Àr dock att det fysiska minnet Àr en delad resurs, vars hantering utförs av operativsystemet.

Konsistens

En annan viktig frĂ„ga inom operativsystem Ă€r konsistens. Detta begrepp anvĂ€nds nĂ€r man talar om problem i systemet som kan uppstĂ„ nĂ€r man arbetar med mĂ„nga saker samtidigt inom ett och samma program. Konsistensproblem kan uppstĂ„ Ă€ven i sjĂ€lva operativsystemet. I de tidigare exemplen med minnes- och processorvirtualisering förstod vi att operativsystemet hanterar mĂ„nga saker samtidigt — det startar den första processen, sedan den andra och sĂ„ vidare. Det visar sig att detta beteende kan leda till vissa problem. Till exempel upplever moderna flermĂ„lsprogram sĂ„dana svĂ„righeter.

LÄt oss titta pÄ följande program:

Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

Programmet i huvudfunktionen skapar tvÄ trÄdar genom ett anrop Pthread_create(). I det hÀr exemplet kan vi tÀnka pÄ en trÄd som en funktion som körs i ett minnesutrymme bredvid andra funktioner, dÀr antalet funktioner som körs samtidigt tydligt Àr mer Àn en. I det hÀr exemplet startar varje trÄd och utför funktionen worker() som i sin tur helt enkelt inkrementerar en variabel.,.

Vi kör detta program med argumentet 1000. Som du kanske har gissat, bör resultatet bli 2000, eftersom varje trÄd inkrementerade variabeln 1000 gÄnger. Men allt Àr inte sÄ enkelt. LÄt oss försöka köra programmet med ett antal upprepningar som Àr en ordning större.

Operativsystem: Tre enkla delar. Del 1: Introduktion (översÀttning)

Genom att mata in ett nummer, till exempel 100000, förvĂ€ntar vi oss att se ett utgĂ„ngsvĂ€rde pĂ„ 200000. Men nĂ€r vi kör nummer 100000 flera gĂ„nger, ser vi inte bara fel svar, utan vi fĂ„r olika felaktiga svar. GĂ„tan ligger i att för att öka talet krĂ€vs tre operationer — att hĂ€mta talet frĂ„n minnet, inkrementera och sedan skriva tillbaka talet. Eftersom dessa instruktioner inte utförs atomĂ€rt (alla samtidigt), kan sĂ„dana konstiga saker hĂ€nda. Detta problem kallas i programmering race condition — tĂ€vlingsvillkor. NĂ€r okĂ€nda krafter vid okĂ€nda tidpunkter kan pĂ„verka utförandet av vissa av dina operationer.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster