Operētājsistēmas: trÄ«s vienkārÅ”as daļas. 3. daļa: procesa API (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 =)

Signalizācija! Šai lekcijai ir laboratorija! Skaties github

Procesa API

ApskatÄ«sim piemēru procesa izveidei UNIX sistēmā. Tas notiek, izmantojot divus sistēmas zvanus dakÅ”a () Šø izpildÄ«t().

Call fork ()

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

Apsveriet programmu, kas izsauc fork() izsaukumu. Tās izpildes rezultāts būs Ŕāds.

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

Pirmkārt, mēs ievadām galveno () funkciju un izdrukājam virkni uz ekrāna. Rindā ir procesa identifikators, kas oriÄ£inālā tiek izsaukts PID vai procesa identifikators. Å is identifikators tiek izmantots UNIX, lai atsauktos uz procesu. Nākamā komanda izsauks fork (). Å ajā brÄ«dÄ« tiek izveidota gandrÄ«z precÄ«za procesa kopija. Å Ä·iet, ka operētājsistēmā sistēmā darbojas 2 vienas un tās paÅ”as programmas kopijas, kas savukārt izies no fork() funkcijas. Jaunizveidotais pakārtotais process (saistÄ«bā ar vecākprocesu, kas to izveidoja) vairs netiks izpildÄ«ts, sākot no galvenās () funkcijas. Jāatceras, ka pakārtotais process nav precÄ«za vecākprocesa kopija; jo Ä«paÅ”i tam ir sava adreÅ”u telpa, savi reÄ£istri, savs rādÄ«tājs uz izpildāmām instrukcijām un tamlÄ«dzÄ«gi. Tādējādi fork() funkcijas izsaucējam atgrieztā vērtÄ«ba bÅ«s atŔķirÄ«ga. Jo Ä«paÅ”i vecākais process saņems pakārtotā procesa PID vērtÄ«bu kā atdevi, un bērns saņems vērtÄ«bu, kas vienāda ar 0. Izmantojot Å”os atgrieÅ”anas kodus, jÅ«s varat atdalÄ«t procesus un piespiest katru no tiem veikt savu darbu. . Tomēr Ŕīs programmas izpilde nav stingri noteikta. Pēc sadalÄ«Å”anas 2 procesos OS sāk tos uzraudzÄ«t, kā arÄ« plānot savu darbu. Ja tas tiek izpildÄ«ts viena kodola procesorā, viens no procesiem, Å”ajā gadÄ«jumā vecākais, turpinās darboties, un pēc tam pakārtotais process saņems kontroli. Restartējot, situācija var atŔķirties.

Zvanu gaidiet ()

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

Apsveriet Ŕādu programmu. Å ajā programmā zvana klātbÅ«tnes dēļ gaidi () Vecāku process vienmēr gaidÄ«s, lÄ«dz tiks pabeigts bērna process. Å ajā gadÄ«jumā mēs ekrānā iegÅ«sim stingri noteiktu teksta izvadi

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

exec() izsaukums

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

Apsveriet izaicinājumu izpildÄ«t(). Å is sistēmas izsaukums ir noderÄ«gs, ja vēlamies palaist pavisam citu programmu. Å eit mēs piezvanÄ«sim execvp() lai palaistu wc programmu, kas ir vārdu skaitÄ«Å”anas programma. Kas notiek, kad tiek izsaukts exec()? Å im izsaukumam kā argumenti tiek nodots izpildāmā faila nosaukums un daži parametri. Pēc tam tiek ielādēts kods un statiskie dati no Ŕī izpildāmā faila, un tā segments ar kodu tiek pārrakstÄ«ts. AtlikuŔās atmiņas apgabali, piemēram, kaudze un kaudze, tiek atkārtoti inicializēti. Pēc tam OS vienkārÅ”i izpilda programmu, nododot tai argumentu kopu. Tāpēc mēs neizveidojām jaunu procesu, mēs vienkārÅ”i pārveidojām paÅ”laik darbojoÅ”os programmu par citu darbojoÅ”os programmu. Pēc exec() izsaukuma izpildes pēcnācējā, Ŕķiet, ka sākotnējā programma nemaz nedarbosies.

Å Ä« startÄ“Å”anas komplikācija ir pilnÄ«gi normāla Unix apvalkam un ļauj Å”im apvalkam izpildÄ«t kodu pēc izsaukÅ”anas dakÅ”a (), bet pirms zvana izpildÄ«t(). Šāda koda piemērs varētu bÅ«t čaulas vides pielāgoÅ”ana palaižamās programmas vajadzÄ«bām pirms tās palaiÅ”anas.

Apvalks - tikai lietotāja programma. Viņa parāda jums ielÅ«guma rindiņu un gaida, kad jÅ«s tajā kaut ko ierakstÄ«sit. Vairumā gadÄ«jumu, ja tur ierakstāt programmas nosaukumu, apvalks atradÄ«s tās atraÅ”anās vietu, izsauks metodi fork() un pēc tam izsauks noteikta veida exec(), lai izveidotu jaunu procesu un gaidÄ«tu, lÄ«dz tas tiks pabeigts, izmantojot gaidi() zvanu. Kad pakārtotais process iziet, apvalks atgriezÄ«sies no gaidÄ«Å”anas () izsaukuma, vēlreiz izdrukā uzvedni un gaidÄ«s, lÄ«dz tiks ievadÄ«ta nākamā komanda.

Fork () & exec () sadalÄ«jums ļauj apvalkam veikt Ŕādas darbÄ«bas, piemēram:
wc fails > jauns_fails.

Å ajā piemērā wc programmas izvade tiek novirzÄ«ta uz failu. Veids, kā apvalks to panāk, ir pavisam vienkārÅ”s ā€“ pirms zvanÄ«Å”anas izveidojot bērna procesu izpildÄ«t(), apvalks aizver standarta izvadi un atver failu jauns_fails, tādējādi visa izvade no tālāk darbojoŔās programmas wc tiks novirzÄ«ts uz failu, nevis uz ekrānu.

Unix caurule tiek īstenoti līdzīgā veidā, ar atŔķirību, ka tie izmanto pipe() izsaukumu. Šajā gadījumā procesa izvades plūsma tiks savienota ar kodolā izvietoto cauruļu rindu, kurai tiks pievienota cita procesa ievades plūsma.

Avots: www.habr.com

Pievieno komentāru