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 . 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:
- oriģināls:
- mana personīgā adaptācija:
Citas daļas:
Varat arī apskatīt manu kanālu vietnē =)
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.

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.

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.

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.

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.

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
