Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

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:

Citas daļas:

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

ApskatÄ«sim vissvarÄ«gāko abstrakciju, ko OS nodroÅ”ina lietotājiem: procesu. Procesa definÄ«cija ir pavisam vienkārÅ”a - tā ir darbojas programma. Pati programma ir nedzÄ«va lieta, kas atrodas diskā - tā ir instrukciju kopa un, iespējams, daži statiski dati, kas gaida palaiÅ”anu. Tā ir operētājsistēma, kas ņem Å”os baitus un palaiž tos, pārveidojot programmu par kaut ko noderÄ«gu.
Visbiežāk lietotāji vēlas vienlaikus palaist vairāk nekā vienu programmu, piemēram, savā klēpjdatorā varat palaist pārlÅ«kprogrammu, spēli, multivides atskaņotāju, teksta redaktoru un tamlÄ«dzÄ«gi. Faktiski tipiska sistēma var vienlaikus palaist desmitiem vai simtiem procesu. Å is fakts padara sistēmu vieglāk lietojamu, jums nekad nav jāuztraucas par to, vai centrālais procesors ir brÄ«vs, jÅ«s vienkārÅ”i palaižat programmas.

Tas rada problēmu: kā nodroÅ”ināt ilÅ«ziju par daudziem CPU? Kā OS var radÄ«t ilÅ«ziju par gandrÄ«z bezgalÄ«gu CPU skaitu, pat ja jums ir tikai viens fiziskais CPU?

OS rada Å”o ilÅ«ziju, izmantojot CPU virtualizāciju. Uzsākot vienu procesu, pēc tam to apturot, uzsākot citu procesu un tā tālāk, OS var uzturēt ilÅ«ziju, ka ir daudz virtuālo CPU, lai gan patiesÄ«bā bÅ«s viens vai vairāki fiziski procesori. Å o tehniku ā€‹ā€‹sauc CPU resursu sadalÄ«jums pēc laika. Å Ä« metode ļauj lietotājiem palaist tik daudz vienlaicÄ«gu procesu, cik viņi vēlas. Å Ä« risinājuma izmaksas ir veiktspēja ā€” tā kā, ja CPU tiek koplietots vairākiem procesiem, katrs process tiks apstrādāts lēnāk.
Lai ieviestu CPU virtualizāciju un jo Ä«paÅ”i, lai to izdarÄ«tu labi, OS ir nepiecieÅ”ams gan zema, gan augsta lÄ«meņa atbalsts. Tiek izsaukts zema lÄ«meņa atbalsts mehānismi ir zema lÄ«meņa metodes vai protokoli, kas ievieÅ” nepiecieÅ”amo funkcionalitātes daļu. Šādas funkcionalitātes piemērs ir konteksta pārslēgÅ”ana, kas dod OS iespēju apturēt vienu programmu un palaist citu programmu procesorā. Å is laika dalÄ«jums ir ieviests visās mÅ«sdienu operētājsistēmās.
Papildus Å”iem mehānismiem OS ir iebÅ«vēta loÄ£ika ā€œpolitikuā€ veidā. Politika ir noteikts lēmumu pieņemÅ”anas algoritms operētājsistēmai. Šādas politikas, piemēram, izlemj, kura programma ir jāpalaiž (no komandu saraksta) vispirms. Tā, piemēram, Å”o problēmu atrisinās politika ar nosaukumu plānotājs (plānoÅ”anas politika) un izvēloties risinājumu, tas tiks vadÄ«ts pēc tādiem datiem kā: startÄ“Å”anas vēsture (kura programma pēdējās minÅ«tēs tika palaista visilgāk), kādu slodzi nes Å”is process (kāda veida programmas tika palaists), veiktspējas rādÄ«tāji (vai sistēma ir optimizēts interaktÄ«vai mijiedarbÄ«bai vai caurlaidspējai ) un tā tālāk.

Abstrakcija: process

Mēs saucam par operētājsistēmas izpildÄ«tās programmas abstrakciju process. Kā minēts iepriekÅ”, process ir vienkārÅ”i palaista programma jebkurā momentānā. Programma, ar kuru mēs varam iegÅ«t apkopojoÅ”u informāciju no dažādiem sistēmas resursiem, kuriem Ŕī programma piekļūst vai ietekmē tās izpildes laikā.
Lai saprastu procesa sastāvdaļas, ir jāsaprot sistēmas stāvokļi: ko programma var nolasīt vai mainīt tās darbības laikā. Jebkurā brīdī jums ir jāsaprot, kuri sistēmas elementi ir svarīgi programmas izpildei.
Viens no acÄ«mredzamajiem sistēmas elementiem, ko process ietver, ir atmiņa. Instrukcijas atrodas atmiņā. Dati, ko programma nolasa vai raksta, arÄ« atrodas atmiņā. Tādējādi atmiņa, ko process var risināt (ko sauc par adreÅ”u telpu), ir procesa daļa.
Arī daļa no sistēmas stāvokļa ir reģistri. Daudzu instrukciju mērķis ir mainīt reģistru vērtību vai nolasīt to vērtību, un tādējādi arī reģistri kļūst par svarīgu procesa darbības sastāvdaļu.
Jāpiebilst, ka arÄ« maŔīnas stāvoklis veidojas no dažiem Ä«paÅ”iem reÄ£istriem. Piemēram, IP - instrukciju rādÄ«tājs ā€” norāde uz instrukciju, ko programma paÅ”laik izpilda. Ir arÄ« kaudzes rādÄ«tājs un ar to saistÄ«ti rāmja rādÄ«tājs, ko izmanto, lai pārvaldÄ«tu: funkciju parametrus, lokālos mainÄ«gos un atgrieÅ”anas adreses.
Visbeidzot, programmas bieži piekļūst ROM (tikai lasāmatmiņai). Å ajā ā€œI/Oā€ (ievades/izvades) informācijā jāiekļauj to failu saraksts, kas paÅ”laik tiek atvērti procesa laikā.

Procesa API

Lai uzlabotu mūsu izpratni par procesa darbību, izpētīsim sistēmas izsaukumu piemērus, kas jāiekļauj jebkurā operētājsistēmas saskarnē. Šīs API ir pieejamas vienā vai otrā veidā jebkurā OS.

ā— izveidot (izveide): OS ir jāiekļauj kāda metode, kas ļauj izveidot jaunus procesus. Ievadot komandu terminālÄ« vai palaižot lietojumprogrammu, veicot dubultklikŔķi uz ikonas, OS tiek nosÅ«tÄ«ts zvans, lai izveidotu jaunu procesu un pēc tam palaistu norādÄ«to programmu.
ā— PārcelÅ”anās: Tā kā procesa izveidei ir interfeiss, OS ir jānodroÅ”ina arÄ« iespēja piespiedu kārtā noņemt procesu. Lielākā daļa programmu, protams, sāksies un beigsies paÅ”as, kad tās darbojas. Pretējā gadÄ«jumā lietotājs vēlētos tos nogalināt, un tādējādi bÅ«tu noderÄ«gs interfeiss procesa apturÄ“Å”anai.
ā— Pagaidiet (gaida): dažreiz ir lietderÄ«gi gaidÄ«t, lÄ«dz process tiks pabeigts, tāpēc tiek nodroÅ”inātas dažas saskarnes, kas nodroÅ”ina iespēju gaidÄ«t.
ā— Dažāda kontrole (dažāda kontrole): Papildus nogalināŔanai un procesa gaidÄ«Å”anai ir arÄ« citas dažādas kontroles metodes. Piemēram, lielākā daļa operētājsistēmu nodroÅ”ina iespēju iesaldēt procesu (pārtraukt tā izpildi uz noteiktu laiku) un pēc tam to atsākt (turpināt izpildi).
ā— Status (stāvoklis): ir dažādas saskarnes, lai iegÅ«tu informāciju par procesa statusu, piemēram, cik ilgi tas darbojas vai kādā stāvoklÄ« tas paÅ”laik ir.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

Procesa izveide: detaļas

Viena no interesantajām lietām ir tas, kā tieÅ”i programmas tiek pārveidotas par procesiem. ÄŖpaÅ”i tas, kā OS uztver un palaiž programmu. Kā tieÅ”i process tiek izveidots.
Pirmkārt, OS jāielādē programmas kods un statiskie dati atmiņā (procesa adreÅ”u telpā). Programmas parasti atrodas diskā vai cietvielu diskdzinÄ« kādā izpildāmā formātā. Tādējādi, lai ielādētu programmu un statiskos datus atmiņā, operētājsistēmai ir jāspēj nolasÄ«t Å”os baitus no diska un ievietot tos kaut kur atmiņā.

AgrÄ«nās operētājsistēmās ielādes process tika veikts ar nepacietÄ«bu, kas nozÄ«mē, ka viss kods tika ielādēts atmiņā pirms programmas palaiÅ”anas. MÅ«sdienu operētājsistēmas to dara slinki, tas ir, ielādē koda vai datu gabalus tikai tad, kad programma to pieprasa izpildes laikā.

Kad kods un statiskie dati ir ielādēti operētājsistēmas atmiņā, ir jāveic vēl dažas darbÄ«bas, lai process varētu darboties. KaudzÄ«tei ir jāpieŔķir zināms atmiņas apjoms. Programmas izmanto steku vietējiem mainÄ«gajiem, funkciju parametriem un atgrieÅ”anas adresēm. OS pieŔķir Å”o atmiņu un pieŔķir procesam. KaudzÄ«ti var pieŔķirt arÄ« ar dažiem argumentiem, jo ā€‹ā€‹Ä«paÅ”i tas aizpilda funkcijas main() parametrus, piemēram, ar argc un argv masÄ«vu.

Operētājsistēma var arÄ« pieŔķirt daļu atmiņas programmu kaudzei. Programmas izmanto kaudzi, lai tieÅ”i pieprasÄ«tu dinamiski pieŔķirtos datus. Programmas pieprasa Å”o vietu, izsaucot funkciju malloc () un skaidri to notÄ«ra, izsaucot funkciju bezmaksas (). Kaudze ir nepiecieÅ”ama datu struktÅ«rām, piemēram, saistÄ«tām lapām, hash tabulām, kokiem un citām. Sākumā kaudzÄ«tei tiek atvēlēts neliels atmiņas apjoms, taču laika gaitā, programmai darbojoties, kaudze var pieprasÄ«t vairāk atmiņas, izmantojot bibliotēkas API zvanu malloc(). Operētājsistēma ir iesaistÄ«ta vairāk atmiņas pieŔķirÅ”anas procesā, lai palÄ«dzētu apmierināt Å”os zvanus.

Operētājsistēma veiks arÄ« inicializācijas uzdevumus, Ä«paÅ”i tos, kas saistÄ«ti ar I/O. Piemēram, UNIX sistēmās katram procesam pēc noklusējuma ir 3 atvērto failu deskriptori standarta ievadei, izvadei un kļūdai. Å ie rokturi ļauj programmām nolasÄ«t ievadi no termināļa, kā arÄ« parādÄ«t informāciju ekrānā.

Tādējādi, ielādējot kodu un statiskos datus atmiņā, izveidojot un inicializējot steku un veicot citus darbus, kas saistÄ«ti ar I/O uzdevumu veikÅ”anu, OS sagatavo posmu procesa izpildei. Visbeidzot, ir atlicis pēdējais uzdevums: programmas palaiÅ”ana caur tās ieejas punktu, ko sauc par galveno () funkciju. Izpildot funkciju main(), OS nodod CPU vadÄ«bu jaunizveidotajam procesam, lÄ«dz ar to programma sāk darboties.

Procesa stāvoklis

Tagad, kad mums ir zināma izpratne par to, kas ir process un kā tas tiek izveidots, uzskaitīsim procesa stāvokļus, kuros tas var būt. VienkārŔākajā formā process var būt vienā no Ŕiem stāvokļiem:
ā— Ekspluatācijas. Palaižot, process darbojas procesorā. Tas nozÄ«mē, ka tiek izpildÄ«tas instrukcijas.
ā— Gatavs. GatavÄ«bas stāvoklÄ« process ir gatavs palaiÅ”anai, taču kāda iemesla dēļ OS to neizpilda norādÄ«tajā laikā.
ā— Bloķēts. Bloķētā stāvoklÄ« process veic dažas darbÄ«bas, kas neļauj tam bÅ«t gatavam izpildei, lÄ«dz notiek kāds notikums. Viens izplatÄ«ts piemērs ir, kad process uzsāk IO darbÄ«bu, tas tiek bloķēts, lai kāds cits process varētu izmantot procesoru.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

JÅ«s varat iedomāties Å”os stāvokļus grafika veidā. Kā redzams attēlā, pēc OS ieskatiem procesa stāvoklis var mainÄ«ties no RUNING un READY. Ja procesa statuss mainās no READY uz RUNING, tas nozÄ«mē, ka process ir ieplānots. Pretējā virzienā - izņemts no izkārtojuma. BrÄ«dÄ«, kad process kļūst BLOĶĒTS, piemēram, es ierosinu IO darbÄ«bu, OS saglabās to Ŕādā stāvoklÄ«, lÄ«dz notiks kāds notikums, piemēram, IO pabeigÅ”ana. Å”ajā brÄ«dÄ« pāreja uz READY stāvokli un, iespējams, uzreiz uz RUNNING stāvokli, ja OS nolemj.
ApskatÄ«sim piemēru, kā divi procesi pārvietojas pa Å”iem stāvokļiem. Sākumā iedomāsimies, ka abi procesi darbojas un katrs izmanto tikai centrālo procesoru. Å ajā gadÄ«jumā viņu Å”tati izskatÄ«sies Ŕādi.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

Nākamajā piemērā pirmais process, pēc kāda laika palaižot, pieprasa IO un pāriet stāvoklÄ« BLOKĒTS, ļaujot darboties citam procesam (1.4. attēls). OS redz, ka process 0 neizmanto centrālo procesoru, un sāk procesu 1. Kamēr process 1 darbojas, IO ir pabeigts un procesa 0 statuss mainās uz READY. Visbeidzot, process 1 ir pabeigts, un pēc pabeigÅ”anas process 0 sākas, izpilda un pabeidz savu darbu.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

Datu struktūra

Pati operētājsistēma ir programma, un, tāpat kā jebkurai citai programmai, tai ir dažas galvenās datu struktÅ«ras, kas seko lÄ«dzi dažādai bÅ«tiskai informācijai. Lai izsekotu katra procesa stāvoklim, OS atbalstÄ«s dažus procesu saraksts visiem procesiem, kas atrodas stāvoklÄ« READY, un papildu informāciju, lai izsekotu procesiem, kas paÅ”laik darbojas. ArÄ« OS jāuzrauga bloķētie procesi. Kad IO ir pabeigts, operētājsistēmai ir jāpamodina nepiecieÅ”amais process un jāiestata darbÄ«bai gatavā stāvoklÄ«.

Piemēram, OS ir jāsaglabā procesora reÄ£istru stāvoklis. BrÄ«dÄ«, kad process apstājas, procesa adreÅ”u telpā tiek saglabāts reÄ£istru stāvoklis, un brÄ«dÄ«, kad tā darbÄ«ba turpinās, tiek atjaunotas reÄ£istru vērtÄ«bas un tādējādi tiek turpināta Ŕī procesa izpilde.

Papildus gataviem, bloķētiem, darba stāvokļiem ir daži citi stāvokļi. Dažreiz izveides laikā process var bÅ«t INIT stāvoklÄ«. Visbeidzot, procesu var ievietot GALÄŖGĀ stāvoklÄ«, kad tas jau ir pabeigts, bet tā informācija vēl nav notÄ«rÄ«ta. UNIX sistēmās Å”o stāvokli sauc zombiju process. Å is stāvoklis ir noderÄ«gs gadÄ«jumos, kad vecāku process vēlas uzzināt bērna atgrieÅ”anas kodu, piemēram, parasti 0 signalizē par veiksmi un 1 par kļūdu, bet programmētāji var izdot papildu izvades kodus, lai signalizētu par dažādām problēmām. Kad vecākprocess tiek pārtraukts, tas veic pēdējo sistēmas izsaukumu, piemēram, gaidiet (), lai gaidÄ«tu, lÄ«dz tiek pārtraukts pakārtotais process, un signalizē OS, ka tā var notÄ«rÄ«t visus ar pārtraukto procesu saistÄ«tos datus.

Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 2. daļa: Abstrakcija: process (tulkoÅ”ana)

Lekcijas galvenie punkti:

ā— process ā€” galvenā darbÄ«gās programmas abstrakcija operētājsistēmā. Jebkurā laikā procesu var aprakstÄ«t pēc tā stāvokļa: atmiņas saturs tā adreÅ”u telpā, procesora reÄ£istru saturs, ieskaitot instrukciju rādÄ«tāju un steka rādÄ«tāju, un IO informācija, piemēram, atvērtie faili, kas tiek lasÄ«ti vai rakstÄ«ti.
ā— Procesa API sastāv no izsaukumiem, ko programmas var veikt procesiem. Parasti tie ir izveides, dzÄ“Å”anas vai citi zvani.
ā— Process ir vienā no daudzajiem stāvokļiem, tostarp darbojas, gatavs, bloķēts. Dažādi notikumi, piemēram, plānoÅ”ana, izņēmumi no plānoÅ”anas vai gaidÄ«Å”anas, var mainÄ«t procesa stāvokli no viena uz otru.
ā— Procesu saraksts satur informāciju par visiem sistēmā notiekoÅ”ajiem procesiem. Katrs ieraksts tajā tiek saukts par procesa vadÄ«bas bloku, kas patiesÄ«bā ir struktÅ«ra, kas satur visu nepiecieÅ”amo informāciju par konkrēto procesu.ā€ƒ

Avots: www.habr.com

Pievieno komentāru