Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Ievads operētājsistēmās

Čau Habr! Es vēlos vērst jÅ«su uzmanÄ«bu uz vienas, manuprāt, interesantas literatÅ«ras - OSTEP - rakstu sēriju-tulkojumiem. Å ajā materiālā diezgan dziļi aplÅ«kots unix lÄ«dzÄ«gu operētājsistēmu darbs, proti, darbs ar procesiem, dažādiem plānotājiem, atmiņu un citiem lÄ«dzÄ«giem komponentiem, kas veido modernu OS. Visu materiālu oriÄ£inālus varat apskatÄ«t Å”eit Å”eit. LÅ«dzu, ņemiet vērā, ka tulkojums tika veikts neprofesionāli (diezgan brÄ«vi), bet es ceru, ka es saglabāju vispārējo nozÄ«mi.

Laboratorijas darbus par Å”o tēmu var atrast Å”eit:
- oriģināls: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- oriģināls: github.com/remzi-arpacidusseau/ostep-code
- mana personīgā adaptācija: github.com/bykvaadm/OS/tree/master/ostep

Varat arī apskatīt manu kanālu vietnē telegramma =)

Programmas darbība

Kas notiek, kad programma darbojas? DarbojoÅ”a programma veic vienu vienkārÅ”u lietu - tā izpilda instrukcijas. Katru sekundi procesors no operatÄ«vās atmiņas izgÅ«st miljoniem un pat, iespējams, miljardus instrukciju, savukārt tās atkodē (piemēram, atpazÄ«st, kādam tipam Ŕīs instrukcijas pieder) un izpilda. Tas varētu bÅ«t divu skaitļu pievienoÅ”ana, piekļūŔana atmiņai, stāvokļa pārbaude, pāreja uz funkciju un tā tālāk. Pēc vienas instrukcijas izpildes procesors pāriet uz citas instrukcijas izpildi. Un tā instrukcija pēc instrukcijas tiek izpildÄ«ta lÄ«dz programmas beigām.
Å is piemērs, protams, tiek uzskatÄ«ts par vienkārÅ”otu ā€“ patiesÄ«bā, lai paātrinātu procesoru, modernā aparatÅ«ra ļauj izpildÄ«t instrukcijas ārpus kārtas, aprēķināt iespējamos rezultātus, izpildÄ«t instrukcijas vienlaicÄ«gi un tamlÄ«dzÄ«gus trikus.

Fon Neimana aprēķinu modelis

MÅ«su aprakstÄ«tā vienkārÅ”otā darba forma ir lÄ«dzÄ«ga fon Neimaņa aprēķinu modelim. Fon Noimans ir viens no datorsistēmu pionieriem, viņŔ ir arÄ« viens no spēļu teorijas autoriem. Kamēr programma darbojas, notiek virkne citu notikumu, daudzi citi procesi un treŔās puses loÄ£ikas darbs, kuru galvenais mērÄ·is ir vienkārÅ”ot sistēmas palaiÅ”anu, darbÄ«bu un apkopi.
Ir programmatÅ«ras komplekts, kas ir atbildÄ«gs par programmu vieglu palaiÅ”anu (vai pat ļauj vairākām programmām darboties vienlaikus), kas ļauj programmām koplietot to paÅ”u atmiņu un sazināties ar dažādām ierÄ«cēm. Šāds programmatÅ«ras komplekts (programmatÅ«ra) pēc bÅ«tÄ«bas tiek saukts par operētājsistēmu un tās uzdevumi ietver uzraudzÄ«bu, lai sistēma darbotos pareizi un efektÄ«vi, kā arÄ« Ŕīs sistēmas vadÄ«bas viegluma nodroÅ”ināŔana.

Operētājsistēmas

Operētājsistēma, saÄ«sināti kā OS, ir savstarpēji saistÄ«tu programmu kopums, kas paredzēts datora resursu pārvaldÄ«bai un lietotāja mijiedarbÄ«bas ar datoru organizÄ“Å”anai..
OS sasniedz savu efektivitāti, pirmkārt, izmantojot vissvarÄ«gāko tehniku ā€‹ā€‹- tehniku virtualizācija. OS mijiedarbojas ar fizisko resursu (procesoru, atmiņu, disku utt.) un pārveido to vispārÄ«gākā, jaudÄ«gākā un vieglāk lietojamā formā. Tāpēc vispārējai izpratnei jÅ«s varat ļoti aptuveni salÄ«dzināt operētājsistēmu ar virtuālo maŔīnu.
Lai ļautu lietotājiem dot komandas operētājsistēmai un tādējādi izmantot virtuālās maŔīnas iespējas (piemēram, palaist programmu, pieŔķirt atmiņu, piekļūt failam un tā tālāk), operētājsistēma nodroÅ”ina kādu interfeisu, ko sauc. API (lietojumprogrammu interfeiss) un uz kuru var veikt zvanus (zvans). Tipiska operētājsistēma ļauj veikt simtiem sistēmas zvanu.
Visbeidzot, tā kā virtualizācija ļauj darboties vairākām programmām (tādējādi dalot centrālo procesoru) un vienlaikus piekļūt to norādÄ«jumiem un datiem (tādējādi koplietot atmiņu) un piekļūt diskiem (tādējādi koplietot I/O ierÄ«ces). ), operētājsistēmu sauc arÄ« par resursu pārvaldnieks. Katrs procesors, disks un atmiņa ir sistēmas resurss, un lÄ«dz ar to viena no operētājsistēmas lomām kļūst par Å”o resursu pārvaldÄ«bu, veicot to efektÄ«vi, godÄ«gi vai otrādi, atkarÄ«bā no uzdevuma, kuram Ŕī operētājsistēma. ir izstrādāts.

CPU virtualizācija

Apsveriet Ŕādu programmu:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Tas neveic nekādas Ä«paÅ”as darbÄ«bas, patiesÄ«bā viss, ko tas dara, ir izsaukt funkciju grieÅ”anās(), kura uzdevums ir iziet cauri laika pārbaudei un atgriezties pēc vienas sekundes. Tādējādi tas neierobežoti atkārto virkni, ko lietotājs nodeva kā argumentu.
PalaidÄ«sim Å”o programmu un nodosim tai rakstzÄ«mi "A" kā argumentu. Rezultāts nav Ä«paÅ”i interesants - sistēma vienkārÅ”i izpilda programmu, kas periodiski parāda rakstzÄ«mi "A".
Tagad izmēģināsim iespēju, kad darbojas daudzas vienas un tās paÅ”as programmas gadÄ«jumi, bet tiek izvadÄ«ti dažādi burti, lai padarÄ«tu to skaidrāku. Å ajā gadÄ«jumā rezultāts bÅ«s nedaudz atŔķirÄ«gs. Neskatoties uz to, ka mums ir viens procesors, programma tiek izpildÄ«ta vienlaicÄ«gi. Kā tas notiek? Taču izrādās, ka operētājsistēma ne bez aparatÅ«ras iespēju palÄ«dzÄ«bas rada ilÅ«ziju. IlÅ«zija, ka sistēmai ir vairāki virtuālie procesori, pārvērÅ”ot vienu fizisko procesoru par teorētiski bezgalÄ«gu skaitu un tādējādi ļaujot Ŕķietami programmām darboties vienlaicÄ«gi. Å o ilÅ«ziju sauc CPU virtualizācija.
Å is attēls rada daudz jautājumu, piemēram, ja vairākas programmas vēlas darboties vienlaikus, kura tiks palaista? Par Å”o jautājumu ir atbildÄ«ga OS ā€œpolitikaā€. Politikas tiek izmantotas daudzās OS vietās, un tās atbild uz Ŕādiem jautājumiem, un tās ir pamata mehānismi, ko OS ievieÅ”. LÄ«dz ar to OS kā resursu pārvaldnieka loma.

Atmiņas virtualizācija

Tagad apskatÄ«sim atmiņu. Atmiņas fiziskais modelis mÅ«sdienu sistēmās tiek attēlots kā baitu masÄ«vs.. Lai lasÄ«tu no atmiņas, jānorāda Ŕūnas adreselai tai piekļūtu. Lai rakstÄ«tu vai atjauninātu datus, jānorāda arÄ« dati un Ŕūnas adrese, kur tos rakstÄ«t.
Programmas izpildes laikā atmiņai tiek piekļūts pastāvīgi. Programma saglabā visu savu datu struktūru atmiņā un piekļūst tai, izpildot dažādas instrukcijas. Tikmēr instrukcijas tiek saglabātas arī atmiņā, tāpēc tai tiek piekļūts arī katram nākamās instrukcijas pieprasījumam.

malloc() izsaukums

Apsveriet Ŕādu programmu, kas, izmantojot zvanu, pieŔķir atmiņas reÄ£ionu malloc () (https://youtu.be/jnlKRnoT1m0):

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Programma veic vairākas darbÄ«bas. Pirmkārt, tas pieŔķir daļu atmiņas (7. rinda), pēc tam izdrukā pieŔķirtās Ŕūnas adresi (9. rinda), ieraksta nulli pirmajā pieŔķirtās atmiņas slotā. Pēc tam programma ievada cilpu, kurā tā palielina atmiņā saglabāto vērtÄ«bu mainÄ«gā ā€œpā€ adresē. Tas arÄ« izdrukā sava procesa ID. Procesa ID ir unikāls katram darbÄ«bas procesam. Pēc vairāku eksemplāru izlaiÅ”anas mēs nonāksim pie interesanta rezultāta: pirmajā gadÄ«jumā, ja jÅ«s neko nedarÄ«sit un tikai palaižat vairākas kopijas, adreses bÅ«s atŔķirÄ«gas. Bet tas neietilpst mÅ«su teorijā! Pareizi, jo mÅ«sdienu izplatÄ«jumos pēc noklusējuma ir iespējota atmiņas nejauÅ”ināŔana. Ja to izslēdzat, mēs iegÅ«stam gaidÄ«to rezultātu - divu vienlaikus darbojoÅ”os programmu atmiņas adreses sakritÄ«s.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Rezultātā izrādās, ka divas neatkarÄ«gas programmas strādā ar savām privātajām adreÅ”u telpām, kuras savukārt kartē operētājsistēma fiziskajā atmiņā.. Tāpēc atmiņas adreÅ”u izmantoÅ”ana vienas programmas ietvaros nekādā veidā neietekmēs citas, un katrai programmai Ŕķiet, ka tai ir sava fiziskās atmiņas daļa, kas tai ir pilnÄ«bā atvēlēta. Tomēr realitāte ir tāda, ka fiziskā atmiņa ir kopÄ«gs resurss, ko pārvalda operētājsistēma.

Konsekvence

Vēl viena no svarÄ«gākajām tēmām operētājsistēmās ir āˆ’ konsekvenci. Å o terminu lieto, runājot par problēmām sistēmā, kas var rasties, strādājot ar daudzām lietām vienlaikus vienas programmas ietvaros. Konsekvences problēmas rodas pat paŔā operētājsistēmā. IepriekŔējos atmiņas un procesora virtualizācijas piemēros mēs sapratām, ka OS vienlaikus pārvalda daudzas lietas - tā sāk pirmo procesu, pēc tam otro un tā tālāk. Kā izrādÄ«jās, Ŕāda uzvedÄ«ba var radÄ«t dažas problēmas. Tā, piemēram, mÅ«sdienu daudzpavedienu programmas saskaras ar Ŕādām grÅ«tÄ«bām.

Apsveriet Ŕādu programmu:

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Programma galvenajā funkcijā, izmantojot zvanu, izveido divus pavedienus pthread_create(). Å ajā piemērā pavedienu var uzskatÄ«t par funkciju, kas darbojas tajā paŔā atmiņas telpā lÄ«dzās citām funkcijām, un nepārprotami vienlaikus darbojas vairākas funkcijas. Å ajā piemērā katrs pavediens sāk un izpilda funkciju worker (), kas savukārt vienkārÅ”i palielina mainÄ«go,.

PalaidÄ«sim Å”o programmu ar argumentu 1000. Kā jau varēja uzminēt, rezultātam jābÅ«t 2000, jo katrs pavediens palielināja mainÄ«go 1000 reizes. Tomēr viss nav tik vienkārÅ”i. Mēģināsim palaist programmu ar lielu skaitu vairāk atkārtojumu.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 1. daļa: ievads (tulkojums)

Ievadot skaitli, piemēram, 100000, mēs sagaidām, ka izvadā tiks parādÄ«ts skaitlis 200000. Taču, ja mēs vairākas reizes izpildÄ«sim skaitli 100000, mēs ne tikai neredzēsim pareizo atbildi, bet arÄ« saņemsim dažādas nepareizas atbildes. Atbilde slēpjas faktā, ka, lai palielinātu skaitli, ir nepiecieÅ”amas trÄ«s darbÄ«bas - skaitļa izņemÅ”ana no atmiņas, palielināŔana un pēc tam skaitļa ierakstÄ«Å”ana. Tā kā visas Ŕīs instrukcijas netiek izpildÄ«tas atomiski (visas vienlaikus), var notikt tādas dÄ«vainas lietas. Å o problēmu sauc par programmÄ“Å”anu sacensÄ«bu stāvoklis. Kad nezināmi spēki nezināmā brÄ«dÄ« var ietekmēt jebkuras jÅ«su darbÄ«bas izpildi.

Avots: www.habr.com

Pievieno komentāru