Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

Pasiuna sa Operating System

Hoy Habr! Gusto nako nga dad-on sa imong atensyon ang usa ka serye sa mga artikulo-paghubad sa usa ka makapaikag nga literatura sa akong opinyon - OSTEP. Gihisgutan sa kini nga materyal nga lawom ang trabaho sa mga operating system nga sama sa unix, nga mao, pagtrabaho kauban ang mga proseso, lainlaing mga scheduler, memorya, ug uban pang parehas nga mga sangkap nga naglangkob sa usa ka modernong OS. Makita nimo ang orihinal sa tanang materyales dinhi dinhi. Palihug timan-i nga ang paghubad gihimo nga dili propesyonal (medyo gawasnon), apan nanghinaut ko nga akong gihuptan ang kinatibuk-ang kahulugan.

Ang trabaho sa lab sa kini nga hilisgutan makita dinhi:

Ubang mga bahin:

Mahimo usab nimo tan-awon ang akong channel sa telegram =)

Alarm! Adunay lab alang niini nga lecture! Tan-awa github

Proseso nga API

Atong tan-awon ang usa ka pananglitan sa paghimo og proseso sa sistema sa UNIX. Kini mahitabo pinaagi sa duha ka sistema nga tawag tinidor () ΠΈ exec().

Tawag sa tinidor()

Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

Hunahunaa ang usa ka programa nga naghimo sa usa ka fork() nga tawag. Ang resulta sa pagpatuman niini mao ang mosunod.

Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

Una sa tanan, mosulod kami sa main() function ug i-print ang string sa screen. Ang linya naglangkob sa proseso identifier nga sa orihinal nga gitawag PID o identifier sa proseso. Kini nga identifier gigamit sa UNIX sa pagtumong sa usa ka proseso. Ang sunod nga sugo motawag sa fork(). Niini nga punto, usa ka halos eksaktong kopya sa proseso ang gihimo. Alang sa OS, morag adunay 2 ka kopya sa samang programa nga nagdagan sa sistema, nga sa baylo mogawas sa fork() function. Ang bag-ong gibuhat nga proseso sa bata (kalambigit sa proseso sa ginikanan nga nagmugna niini) dili na ipatuman, sugod sa main() function. Kinahanglang hinumdoman nga ang proseso sa bata dili eksakto nga kopya sa proseso sa ginikanan; ilabina, kini adunay kaugalingong address space, kaugalingong mga rehistro, kaugalingong pointer sa executable nga mga instruksiyon, ug uban pa. Busa, ang bili nga gibalik sa nagtawag sa fork() function magkalahi. Sa partikular, ang proseso sa ginikanan makadawat sa PID nga bili sa proseso sa bata isip usa ka pagbalik, ug ang bata makadawat og usa ka bili nga katumbas sa 0. Gamit kini nga mga return code, mahimo nimong ibulag ang mga proseso ug pugson ang matag usa kanila sa pagbuhat sa iyang kaugalingong trabaho . Bisan pa, ang pagpatuman niini nga programa dili estrikto nga gihubit. Human mabahin sa 2 nga mga proseso, ang OS nagsugod sa pag-monitor kanila, ingon man usab sa pagplano sa ilang trabaho. Kung gipatuman sa usa ka single-core processor, usa sa mga proseso, sa kini nga kaso ang ginikanan, magpadayon sa pagtrabaho, ug dayon ang proseso sa bata makadawat kontrol. Sa pagsugod pag-usab, ang sitwasyon mahimong lahi.

Tawag maghulat()

Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

Tagda ang mosunod nga programa. Sa kini nga programa, tungod sa presensya sa usa ka tawag maghulat () Ang proseso sa ginikanan kanunay maghulat alang sa proseso sa bata nga makompleto. Sa kini nga kaso, makakuha kami usa ka higpit nga gihubit nga output sa teksto sa screen

Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

exec() tawag

Mga Operating System: Tulo ka Sayon nga Piraso. Bahin 3: Proseso nga API (paghubad)

Tagda ang hagit exec(). Kini nga tawag sa sistema mapuslanon kung gusto namon nga magpadagan sa usa ka hingpit nga lahi nga programa. Dinhi ta motawag execvp() sa pagpadagan sa wc program nga usa ka word counting program. Unsa ang mahitabo kung ang exec() gitawag? Kini nga tawag gipasa ang ngalan sa executable file ug pipila ka mga parameter isip mga argumento. Pagkahuman ang code ug static nga datos gikan sa kini nga executable file gikarga ug ang kaugalingon nga bahin nga adunay code gi-overwrite. Ang nahabilin nga mga lugar sa memorya, sama sa stack ug heap, gi-reinitialize. Human nga ang OS yano nga nagpatuman sa programa, nga gipasa kini usa ka hugpong sa mga argumento. Mao nga wala kami maghimo usa ka bag-ong proseso, gibag-o lang namon ang karon nga nagdagan nga programa ngadto sa lain nga nagdagan nga programa. Human ipatuman ang exec() nga tawag sa kaliwat, makita nga ang orihinal nga programa wala gayud modagan.

Kini nga komplikasyon sa pagsugod hingpit nga normal alang sa usa ka kabhang sa Unix, ug gitugotan kana nga kabhang nga ipatuman ang code pagkahuman sa pagtawag tinidor (), apan sa wala pa ang tawag exec(). Usa ka pananglitan sa ingon nga code mao ang pag-adjust sa shell environment sa mga panginahanglanon sa programa nga gilusad, sa dili pa kini ilunsad.

Shell - usa lang ka programa sa tiggamit. Gipakita niya kanimo ang linya sa imbitasyon ug naghulat kanimo nga isulat ang usa ka butang niini. Sa kadaghanan nga mga kaso, kung imong isulat ang ngalan sa usa ka programa didto, makit-an sa kabhang ang lokasyon niini, tawagan ang fork() nga pamaagi, ug dayon tawagan ang usa ka matang sa exec() aron maghimo usa ka bag-ong proseso ug maghulat nga makompleto gamit ang usa ka maghulat () tawag. Kung ang proseso sa bata mogawas, ang kabhang mobalik gikan sa paghulat () nga tawag ug i-print pag-usab ang prompt ug maghulat alang sa sunod nga sugo nga ipasulod.

Ang fork() & exec() split nagtugot sa kabhang sa pagbuhat sa mosunod nga mga butang, pananglitan:
wc file > new_file.

Niini nga pananglitan, ang output sa wc program gi-redirect sa usa ka file. Ang paagi nga makab-ot kini sa kabhang yano ra - pinaagi sa paghimo og proseso sa bata sa wala pa tawagan exec(), ang kabhang nagsira sa standard nga output ug nag-abli sa file bag-ong_file, sa ingon, ang tanan nga output gikan sa dugang nga running program wc i-redirect sa usa ka file imbes sa usa ka screen.

Unix nga tubo gipatuman sa parehas nga paagi, nga adunay kalainan nga gigamit nila ang tawag sa pipe (). Niini nga kaso, ang output stream sa proseso makonektar sa pipe queue nga nahimutang sa kernel, diin ang input stream sa laing proseso makonektar.

Source: www.habr.com

Idugang sa usa ka comment