Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

Utangulizi wa Mifumo ya Uendeshaji

Habari Habr! Ningependa kukuletea msururu wa vifungu-tafsiri za fasihi moja ya kupendeza kwa maoni yangu - OSTEP. Nyenzo hii inajadili kwa undani kazi ya mifumo ya uendeshaji kama unix, yaani, kufanya kazi na michakato, wapangaji ratiba mbalimbali, kumbukumbu, na vipengele vingine vinavyofanana vinavyounda OS ya kisasa. Unaweza kuona asili ya nyenzo zote hapa hapa. Tafadhali kumbuka kuwa tafsiri ilifanywa bila taaluma (kwa uhuru kabisa), lakini natumai nilihifadhi maana ya jumla.

Kazi ya maabara juu ya mada hii inaweza kupatikana hapa:

Sehemu zingine:

Unaweza pia kuangalia kituo changu kwa telegramu =)

Kengele! Kuna maabara kwa muhadhara huu! Tazama github

Mchakato wa API

Wacha tuangalie mfano wa kuunda mchakato katika mfumo wa UNIX. Inatokea kupitia simu mbili za mfumo uma () ΠΈ kutekeleza ().

Piga simu uma ()

Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

Fikiria mpango ambao hufanya simu ya fork(). Matokeo ya utekelezaji wake yatakuwa kama ifuatavyo.

Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

Awali ya yote, tunaingia kazi kuu () na kuchapisha kamba kwenye skrini. Mstari una kitambulisho cha mchakato ambacho kwa asili kinaitwa PID au kitambulisho cha mchakato. Kitambulisho hiki kinatumika katika UNIX kurejelea mchakato. Amri inayofuata itaita fork(). Katika hatua hii, karibu nakala halisi ya mchakato huundwa. Kwa OS, inaonekana kama kuna nakala 2 za programu hiyo hiyo inayoendesha kwenye mfumo, ambayo kwa upande itatoka kwa uma () kazi. Mchakato mpya wa mtoto (kuhusiana na mchakato wa mzazi uliouunda) hautatekelezwa tena, kuanzia main() chaguo la kukokotoa. Ikumbukwe kwamba mchakato wa mtoto sio nakala halisi ya mchakato wa mzazi; haswa, ina nafasi yake ya anwani, rejista zake, kielekezi chake cha maagizo ya kutekelezwa, na kadhalika. Kwa hivyo, thamani iliyorejeshwa kwa mpigaji wa fork() chaguo la kukokotoa itakuwa tofauti. Hasa, mchakato wa mzazi utapokea thamani ya PID ya mchakato wa mtoto kama kurejesha, na mtoto atapokea thamani sawa na 0. Kwa kutumia misimbo hii ya kurejesha, unaweza kisha kutenganisha michakato na kulazimisha kila mmoja wao kufanya kazi yake mwenyewe. . Hata hivyo, utekelezaji wa mpango huu haujafafanuliwa madhubuti. Baada ya kugawanywa katika michakato 2, OS huanza kuwafuatilia, na pia kupanga kazi zao. Ikiwa inatekelezwa kwenye processor moja ya msingi, moja ya taratibu, katika kesi hii mzazi, itaendelea kufanya kazi, na kisha mchakato wa mtoto utapokea udhibiti. Wakati wa kuanza upya, hali inaweza kuwa tofauti.

Kusubiri kwa simu ()

Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

Fikiria programu ifuatayo. Katika mpango huu, kutokana na kuwepo kwa simu subiri () Mchakato wa mzazi utasubiri kila wakati mchakato wa mtoto ukamilike. Katika kesi hii, tutapata matokeo ya maandishi yaliyofafanuliwa kabisa kwenye skrini

Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

exec() simu

Mifumo ya Uendeshaji: Vipande Tatu Rahisi. Sehemu ya 3: Mchakato wa API (tafsiri)

Fikiria changamoto kutekeleza (). Simu hii ya mfumo ni muhimu tunapotaka kuendesha programu tofauti kabisa. Hapa tutaita execvp () kuendesha programu ya wc ambayo ni programu ya kuhesabu maneno. Ni nini hufanyika wakati exec() inaitwa? Simu hii hupitishwa jina la faili inayoweza kutekelezwa na baadhi ya vigezo kama hoja. Baada ya hapo msimbo na data tuli kutoka kwa faili hii inayoweza kutekelezwa hupakiwa na sehemu yake iliyo na msimbo imeandikwa tena. Sehemu zilizosalia za kumbukumbu, kama vile rafu na lundo, zinaanzishwa upya. Baada ya hapo OS inatekeleza programu tu, ikipitisha seti ya hoja. Kwa hivyo hatukuunda mchakato mpya, tulibadilisha tu programu inayoendeshwa kwa sasa kuwa programu nyingine inayoendeshwa. Baada ya kutekeleza simu ya exec() katika kizazi, inaonekana kana kwamba programu asili haikufanya kazi hata kidogo.

Shida hii ya uanzishaji ni kawaida kabisa kwa ganda la Unix, na huruhusu ganda hilo kutekeleza nambari baada ya kupiga simu uma (), lakini kabla ya simu kutekeleza (). Mfano wa nambari kama hiyo itakuwa kurekebisha mazingira ya ganda kwa mahitaji ya programu inayozinduliwa, kabla ya kuizindua.

Shell - programu tu ya mtumiaji. Anakuonyesha mstari wa mwaliko na anasubiri uandike kitu ndani yake. Katika hali nyingi, ikiwa utaandika jina la programu hapo, ganda litapata eneo lake, piga njia ya fork(), kisha piga aina fulani ya exec() kuunda mchakato mpya na usubiri ikamilike kwa kutumia a. wait() simu. Wakati mchakato wa mtoto unatoka, ganda litarudi kutoka kwa wait() simu na kuchapisha haraka tena na kungojea amri inayofuata kuingizwa.

Mgawanyiko wa fork() & exec() huruhusu ganda kufanya mambo yafuatayo, kwa mfano:
faili ya wc > new_file.

Katika mfano huu, matokeo ya programu ya wc yanaelekezwa kwenye faili. Njia ambayo ganda linafanikisha hii ni rahisi sana - kwa kuunda mchakato wa mtoto kabla ya kupiga simu kutekeleza (), ganda hufunga pato la kawaida na kufungua faili faili_mpya, kwa hivyo, matokeo yote kutoka kwa programu inayoendelea zaidi wc itaelekezwa kwa faili badala ya skrini.

Bomba la Unix inatekelezwa kwa njia sawa, na tofauti ambayo hutumia bomba () simu. Katika kesi hii, mkondo wa pato wa mchakato utaunganishwa kwenye foleni ya bomba iliyo kwenye kernel, ambayo mkondo wa uingizaji wa mchakato mwingine utaunganishwa.

Chanzo: mapenzi.com

Kuongeza maoni