Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

Introduzione à i Sistemi Operativi

Ehi Habr! Vogliu portà à a vostra attenzione una seria di articuli-traduzioni di una literatura interessante in u mo parè - OSTEP. Stu materiale discute assai prufonda u travagliu di i sistemi operativi Unix-like, vale à dì, u travagliu cù prucessi, diversi schedulers, memoria, è altri cumpunenti simili chì custituiscenu un OS mudernu. Pudete vede l'uriginale di tutti i materiali quì ccà. Per piacè nutate chì a traduzzione hè stata fatta senza prufessiunali (abbastanza liberamente), ma spergu chì aghju conservatu u significatu generale.

U travagliu di laboratoriu nantu à questu sughjettu pò esse truvatu quì:

Altre parti:

Pudete ancu verificà u mo canale à telegramma =)

Alarma ! Ci hè un laboratoriu per sta cunferenza! Fighjate github

Process API

Fighjemu un esempiu di creazione di un prucessu in un sistema UNIX. Succece à traversu duie chjama di sistema forchetta () и exec ().

Chjama fork ()

Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

Cunsiderate un prugramma chì face una chjama di fork(). U risultatu di a so esecuzione serà u seguitu.

Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

Prima di tuttu, entremu in a funzione main() è stampate a stringa à u screnu. A linea cuntene l'identificatore di prucessu chì in l'uriginale hè chjamatu PID o identificatore di prucessu. Questu identificatore hè utilizatu in UNIX per riferite à un prucessu. U prossimu cumandamentu chjamarà fork(). A stu puntu, una copia quasi esatta di u prucessu hè creatu. Per u SO, pare chì ci sò 2 copie di u stessu prugramma in esecuzione in u sistema, chì à u turnu esce da a funzione fork(). U prucessu di u zitellu novu creatu (in relazione à u prucessu parent chì l'hà creatu) ùn serà più eseguitu, partendu da a funzione main(). Hè ricurdatu chì un prucessu di u zitellu ùn hè micca una copia esatta di u prucessu parentale in particulare, hà u so propiu spaziu d'indirizzu, i so propii registri, u so propiu punteru à l'istruzzioni eseguibili, è simili. Cusì, u valore tornatu à u chjamante di a funzione fork() serà diversu. In particulare, u prucessu parenti riceverà u valore PID di u prucessu di u zitellu cum'è un ritornu, è u zitellu riceverà un valore ugguali à 0. Utilizendu sti codici di ritornu, pudete allora separà i prucessi è furzà ognunu à fà u so propiu travagliu. . Tuttavia, l'esekzione di stu prugramma ùn hè micca strettamente definitu. Dopu divisu in 2 prucessi, u SO cumencia à monitorà elli, è ancu di pianificà u so travagliu. Sè eseguitu nantu à un processore unicu core, unu di i prucessi, in questu casu u genitore, cuntinueghja à travaglià, è dopu u prucessu di u zitellu riceve u cuntrollu. Quandu si riavvia, a situazione pò esse diversa.

Chjama aspetta ()

Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

Cunsiderate u prugramma seguente. In stu prugramma, per via di a prisenza di una chjama aspetta () U prucessu parent vi sempre aspittà per u prucessu zitellu à compie. In questu casu, avemu da ottene una pruduzzioni di testu strettamente definite nantu à u screnu

Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

exec () chjama

Sistemi Operativi: Trè Easy Pieces. Parte 3: Process API (traduzzione)

Cunsiderate a sfida exec (). Questa chjama di u sistema hè utile quandu vulemu eseguisce un prugramma completamente diversu. Quì chjameremu execvp () per eseguisce u prugramma wc chì hè un prugramma di cuntà di parolle. Chì succede quandu exec () hè chjamatu? Questa chjama hè passata u nome di u schedariu eseguibile è certi paràmetri cum'è argumenti. Dopu chì u codice è i dati statichi da stu schedariu eseguibile sò caricati è u so propiu segmentu cù u codice hè soprascritto. L'area di memoria restante, cum'è a pila è a pila, sò reinizializate. Dopu à quale u SO eseguisce solu u prugramma, passendu un inseme di argumenti. Allora ùn avemu micca creatu un novu prucessu, avemu solu trasfurmatu u prugramma in esecuzione in un altru prugramma in esecuzione. Dopu avè eseguitu a chjama di exec () in u discendenti, pare chì u prugramma uriginale ùn hà micca eseguitu in tuttu.

Questa complicazione di l'iniziu hè cumplettamente normale per una shell Unix, è permette à quella shell per eseguisce u codice dopu a chjama forchetta (), ma prima di a chjama exec (). Un esempiu di tali codice seria aghjustà l'ambienti di cunchiglia à i bisogni di u prugramma esse lanciatu, prima di lancià.

Idone - solu un prugramma d'utilizatore. Ella vi mostra a linea d'invitu è ​​aspetta per voi per scrive qualcosa in questu. In a maiò parte di i casi, sè vo scrivite u nome di un prugramma quì, a cunchiglia truverà u so locu, chjamate u metudu fork() , è dopu chjamate qualchì tipu di exec () per creà un novu prucessu è aspettate chì finiscinu cù un aspetta () chjama. Quandu u prucessu di u zitellu esce, a cunchiglia torna da a chjamata wait() è stampate u promptatu di novu è aspittà chì u prossimu cumandamentu sia inseritu.

A split fork() & exec() permette à a shell di fà e cose seguenti, per esempiu:
wc file> new_file.

In questu esempiu, l'output di u prugramma wc hè redirezzione à un schedariu. A manera chì a cunchiglia ottene questu hè abbastanza simplice - creendu un prucessu di u zitellu prima di chjamà exec (), a cunchiglia chjude l'output standard è apre u schedariu novu_file, cusì, tutti i risultati da u prugramma in esecuzione ulteriore wc serà redirezzione à un schedariu invece di una schermu.

Pipa Unix sò implementati in modu simili, cù a diferenza chì usanu una chjama di pipe(). In questu casu, u flussu di output di u prucessu serà cunnessu à una fila di pipa situata in u kernel, à quale serà cunnessu u flussu di input di un altru prucessu.

Source: www.habr.com

Add a comment