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
Laboratorijas darbus par Å”o tÄmu var atrast Å”eit:
Citas daļas:
Varat arÄ« apskatÄ«t manu kanÄlu vietnÄ
SignalizÄcija! Å ai lekcijai ir laboratorija! Skaties
Procesa API
ApskatÄ«sim piemÄru procesa izveidei UNIX sistÄmÄ. Tas notiek, izmantojot divus sistÄmas zvanus dakÅ”a () Šø izpildÄ«t().
Call fork ()
Apsveriet programmu, kas izsauc fork() izsaukumu. TÄs izpildes rezultÄts bÅ«s Å”Äds.
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 ()
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
exec() izsaukums
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