Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

Yntroduksje ta bestjoeringssystemen

Hoi Habr! Ik soe graach bringe jo oandacht in rige fan artikels-oersettingen fan ien nijsgjirrige literatuer yn myn miening - OSTEP. Dit materiaal besprekt frij djip it wurk fan unix-like bestjoeringssystemen, nammentlik wurk mei prosessen, ferskate planners, ûnthâld en oare ferlykbere komponinten dy't in moderne OS foarmje. Jo kinne hjir it orizjineel fan alle materialen sjen hjir. Tink derom dat de oersetting ûnprofesjoneel makke is (hiel frij), mar ik hoopje dat ik de algemiene betsjutting behâlden haw.

Labwurk oer dit ûnderwerp is hjir te finen:

Oare dielen:

Jo kinne ek kontrolearje út myn kanaal op telegram =)

Alarm! Der is in lab foar dizze lêzing! Sjen github

Process API

Litte wy nei in foarbyld sjen fan it meitsjen fan in proses yn in UNIX-systeem. It bart troch twa systeemoproppen foarke() и exec().

Call fork ()

Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

Betink in programma dat makket in foarke () call. It resultaat fan syn útfiering sil wêze as folget.

Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

Earst fan alles, wy ynfiere de haadfunksje () en printsje de tekenrige nei it skerm. De rigel befettet de proses-identifikaasje dy't yn it orizjineel neamd wurdt PID of proses identifier. Dizze identifier wurdt brûkt yn UNIX om te ferwizen nei in proses. It folgjende kommando sil fork (). Op dit punt wurdt in hast krekte kopy fan it proses makke. Foar it OS liket it derop dat d'r 2 kopyen fan itselde programma op it systeem rinne, wat op syn beurt de funksje foarke () sil ferlitte. It nij oanmakke bern proses (yn relaasje ta it âlder proses dat makke it) sil net mear wurde útfierd, begjinnend mei de haadfunksje () . It moat betocht wurde dat in bernproses gjin krekte kopy is fan it âlderproses; it hat benammen in eigen adresromte, syn eigen registers, in eigen oanwizer nei útfierbere ynstruksjes, en sa. Sa, de wearde werom nei de oproper fan de foarke () funksje sil wêze oars. Benammen it âlderproses sil de PID-wearde fan it bernproses krije as in weromreis, en it bern sil in wearde krije dy't gelyk is oan 0. Mei dizze weromkommende koades kinne jo dan prosessen skiede en elk fan har twinge om syn eigen wurk te dwaan . De útfiering fan dit programma is lykwols net strikt definiearre. Nei it ferdielen yn 2 prosessen begjint it OS se te kontrolearjen, en har wurk te planjen. As útfierd op in single-core prosessor, sil ien fan 'e prosessen, yn dit gefal de âlder, trochgean mei wurkjen, en dan sil it bernproses kontrôle krije. By it opnij begjinnen kin de situaasje oars wêze.

Oprop wachtsje ()

Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

Tink oan it folgjende programma. Yn dit programma, fanwege de oanwêzigens fan in oprop wachtsje() It âlderproses sil altyd wachtsje oant it bernproses foltôge is. Yn dit gefal krije wy in strikt definieare tekstútfier op it skerm

Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

exec() oprop

Bestjoeringssystemen: Trije Easy Pieces. Diel 3: Process API (oersetting)

Beskôgje de útdaging exec(). Dizze systeemoprop is nuttich as wy in folslein oar programma wolle útfiere. Hjir sille wy belje execvp() om it wc-programma út te fieren dat in wurdtelprogramma is. Wat bart der as exec () wurdt neamd? Dizze oprop wurdt trochjûn de namme fan de útfierbere triem en guon parameters as arguminten. Dêrnei wurde de koade en statyske gegevens fan dit útfierbere bestân laden en it eigen segmint mei de koade wurdt oerskreaun. De oerbleaune ûnthâldgebieten, lykas de stapel en heap, wurde opnij inisjalisearre. Wêrnei't it OS gewoan it programma útfiert, troch it in set arguminten troch te jaan. Dat wy hawwe gjin nij proses oanmakke, wy hawwe it op it stuit rinnende programma gewoan feroare yn in oar rinnend programma. Nei it útfieren fan de exec () oprop yn 'e neiteam, liket it as wie it orizjinele programma hielendal net útfierd.

Dizze opstartkomplikaasje is folslein normaal foar in Unix-shell, en lit dy shell koade útfiere nei it oproppen foarke(), mar foar de oprop exec(). In foarbyld fan sa'n koade soe wêze om de shell-omjouwing oan te passen oan 'e behoeften fan it programma dat wurdt lansearre, foardat it lanseart.

shell - gewoan in brûkersprogramma. Se lit jo de útnoegingsrigel sjen en wachtet oant jo der wat yn skriuwe. Yn 'e measte gefallen, as jo dêr de namme fan in programma skriuwe, sil de shell syn lokaasje fine, de metoade foark () neame, en dan in soarte fan exec () neame om in nij proses te meitsjen en wachtsje oant it foltôge is mei in wachtsje () oprop. As it bernproses útgiet, sil de shell weromkomme fan 'e wacht ()-oprop en de prompt opnij printsje en wachtsje op it folgjende kommando ynfierd wurde.

De fork () & exec () split lit de shell de folgjende dingen dwaan, bygelyks:
wc triem > nij_bestân.

Yn dit foarbyld wurdt de útfier fan it wc-programma omlaat nei in bestân. De manier wêrop de shell dit berikt is frij ienfâldich - troch in bernproses te meitsjen foardat jo skilje exec(), slút de shell standertútfier en iepenet de triem nij_bestân, dus, alle útfier fan it fierder rinnende programma wc sil wurde omlaat nei in triem ynstee fan in skerm.

Unix pipe wurde útfierd op in fergelykbere wize, mei it ferskil dat se brûke in pipe () call. Yn dit gefal sil de útfierstream fan it proses ferbûn wêze mei in pipe-wachtrige yn 'e kearn, wêrmei't de ynfierstream fan in oar proses ferbûn wurdt.

Boarne: www.habr.com

Add a comment