Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

Introduzzjoni għas-Sistemi Operattivi

Ħej Habr! Nixtieq inġib għall-attenzjoni tiegħek sensiela ta' artikli-traduzzjonijiet ta' letteratura waħda interessanti fl-opinjoni tiegħi - OSTEP. Dan il-materjal jiddiskuti pjuttost fil-fond ix-xogħol ta 'sistemi operattivi unix-like, jiġifieri, ix-xogħol ma' proċessi, diversi schedulers, memorja, u komponenti oħra simili li jiffurmaw OS modern. Tista 'tara l-oriġinal tal-materjali kollha hawn hawn. Jekk jogħġbok innota li t-traduzzjoni saret b'mod mhux professjonali (pjuttost liberament), iżda nittama li żammejt it-tifsira ġenerali.

Xogħol tal-laboratorju dwar dan is-suġġett jista’ jinstab hawn:

Partijiet oħra:

Tista 'wkoll tiċċekkja l-kanal tiegħi fuq telegramma =)

Allarm! Hemm laboratorju għal din il-lecture! Ħares github

Proċess API

Ejja nħarsu lejn eżempju ta 'ħolqien ta' proċess f'sistema UNIX. Dan jiġri permezz ta' żewġ sejħiet tas-sistema furketta () и exec().

Sejħa furketta()

Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

Ikkunsidra programm li jagħmel sejħa fork(). Ir-riżultat tal-eżekuzzjoni tiegħu se jkun kif ġej.

Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

L-ewwelnett, nidħlu fil-funzjoni main() u nipprintjaw is-sekwenza fuq l-iskrin. Il-linja fiha l-identifikatur tal-proċess li fl-oriġinal jissejjaħ PID jew identifikatur tal-proċess. Dan l-identifikatur jintuża f'UNIX biex jirreferi għal proċess. Il-kmand li jmiss se jsejjaħ fork(). F'dan il-punt, tinħoloq kopja kważi eżatta tal-proċess. Għall-OS, jidher li hemm 2 kopji tal-istess programm li qed jaħdem fuq is-sistema, li mbagħad joħroġ mill-funzjoni tal-furketta (). Il-proċess tifel maħluq ġdid (b'relazzjoni mal-proċess ġenitur li ħolqu) mhux se jibqa' jiġi esegwit, u jibda mill-funzjoni main(). Għandu jiġi mfakkar li proċess tifel mhuwiex kopja eżatta tal-proċess ġenitur b'mod partikolari, għandu l-ispazju tal-indirizzi tiegħu stess, ir-reġistri tiegħu stess, il-pointer tiegħu stess għall-istruzzjonijiet eżekutibbli, u simili; Għalhekk, il-valur ritornat lil min iċempel tal-funzjoni tal-furketta () se jkun differenti. B'mod partikolari, il-proċess ġenitur jirċievi l-valur PID tal-proċess tat-tfal bħala ritorn, u t-tifel jirċievi valur ugwali għal 0. Billi tuża dawn il-kodiċijiet ta 'ritorn, tista' mbagħad tissepara l-proċessi u ġġiegħel lil kull wieħed minnhom jagħmel ix-xogħol tiegħu stess. . Madankollu, l-eżekuzzjoni ta 'dan il-programm mhijiex strettament definita. Wara li jaqsam f'2 proċessi, l-OS jibda jimmonitorjahom, kif ukoll jippjana x-xogħol tagħhom. Jekk jiġi esegwit fuq proċessur ta 'qalba waħda, wieħed mill-proċessi, f'dan il-każ il-ġenitur, se jkompli jaħdem, u mbagħad il-proċess tat-tfal se jirċievi kontroll. Meta terġa 'tibda, is-sitwazzjoni tista' tkun differenti.

Sejħa stenna()

Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

Ikkunsidra l-programm li ġej. F'dan il-programm, minħabba l-preżenza ta 'sejħa stenna() Il-proċess ġenitur dejjem se jistenna li l-proċess tat-tfal jitlesta. F'dan il-każ, se nġibu output tat-test definit b'mod strett fuq l-iskrin

Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

exec() sejħa

Sistemi Operattivi: Tliet Biċċiet Faċli. Parti 3: Process API (traduzzjoni)

Ikkunsidra l-isfida exec(). Din is-sejħa tas-sistema hija utli meta rridu nħaddmu programm kompletament differenti. Hawnhekk se nsejħu execvp() biex tmexxi l-programm wc li huwa programm tal-għadd tal-kliem. X'jiġri meta exec () jissejjaħ? Din is-sejħa hija mgħoddija l-isem tal-fajl eżekutibbli u xi parametri bħala argumenti. Wara dan il-kodiċi u d-dejta statika minn dan il-fajl eżekutibbli huma mgħobbija u s-segment tiegħu stess bil-kodiċi jinkiteb fuqu. L-oqsma tal-memorja li fadal, bħall-munzell u l-munzell, jerġgħu jiġu inizjalizzati. Wara li l-OS sempliċement tesegwixxi l-programm, u jgħaddih sett ta 'argumenti. Allura aħna ma ħloqna proċess ġdid, aħna sempliċiment trasformat il-programm li qed jaħdem bħalissa fi programm ieħor li qed jaħdem. Wara li tesegwixxi s-sejħa exec() fid-dixxendent, jidher bħallikieku l-programm oriġinali ma ħadim xejn.

Din il-kumplikazzjoni tal-istartjar hija kompletament normali għal qoxra Unix, u tippermetti li dik il-qoxra tesegwixxi kodiċi wara li ċċempel furketta (), iżda qabel is-sejħa exec(). Eżempju ta' kodiċi bħal dan ikun l-aġġustament tal-ambjent tal-qoxra għall-ħtiġijiet tal-programm li jkun qed jitnieda, qabel ma jitnieda.

Shell - biss programm għall-utent. Turik il-linja tal-istedina u tistenniek tikteb xi ħaġa fiha. Fil-biċċa l-kbira tal-każijiet, jekk tikteb l-isem ta 'programm hemmhekk, il-qoxra ssib il-post tagħha, issejjaħ il-metodu tal-furketta (), u mbagħad issejjaħ xi tip ta' exec () biex toħloq proċess ġdid u stenna li jitlesta billi tuża stenna() sejħa. Meta l-proċess tat-tfal joħroġ, il-qoxra terġa 'lura mis-sejħa wait() u tipprintja l-pront mill-ġdid u stenna li jiddaħħal il-kmand li jmiss.

Il-qasma fork() & exec() tippermetti lill-qoxra tagħmel l-affarijiet li ġejjin, pereżempju:
wc file > new_file.

F'dan l-eżempju, l-output tal-programm wc huwa ridirett lejn fajl. Il-mod kif il-qoxra tikseb dan huwa pjuttost sempliċi - billi toħloq proċess tat-tfal qabel issejjaħ exec(), il-qoxra tagħlaq l-output standard u tiftaħ il-fajl fajl_ġdid, għalhekk, l-output kollu mill-programm li jaħdem aktar wc se jiġi ridirett lejn fajl minflok skrin.

Pajp Unix huma implimentati b'mod simili, bid-differenza li jużaw sejħa pipe(). F'dan il-każ, il-fluss tal-ħruġ tal-proċess se jkun imqabbad ma 'kju tal-pajpijiet li jinsab fil-qalba, li miegħu se jkun imqabbad il-fluss ta' input ta 'proċess ieħor.

Sors: www.habr.com

Żid kumment