Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

Cyflwyniad i Systemau Gweithredu

Hei Habr! Hoffwn dynnu eich sylw at gyfres o erthyglau-cyfieithiadau o un llenyddiaeth ddiddorol yn fy marn i - OSTEP. Mae'r deunydd hwn yn trafod yn eithaf dwfn waith systemau gweithredu tebyg i unix, sef, gwaith gyda phrosesau, amserlenwyr amrywiol, cof, a chydrannau tebyg eraill sy'n ffurfio OS modern. Gallwch weld y gwreiddiol o'r holl ddeunyddiau yma yma. Sylwch fod y cyfieithiad wedi'i wneud yn amhroffesiynol (yn eithaf rhydd), ond gobeithio i mi gadw'r ystyr cyffredinol.

Gellir dod o hyd i waith labordy ar y pwnc hwn yma:

Rhannau eraill:

Gallwch hefyd edrych ar fy sianel yn telegram =)

Larwm! Mae labordy ar gyfer y ddarlith hon! Edrych github

Proses API

Gadewch i ni edrych ar enghraifft o greu proses mewn system UNIX. Mae'n digwydd trwy ddwy alwad system fforc () ΠΈ gweithred().

Fforch fforch ()

Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

Ystyriwch raglen sy'n gwneud galwad fforch(). Bydd canlyniad ei weithredu fel a ganlyn.

Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

Yn gyntaf oll, rydyn ni'n mynd i mewn i'r brif swyddogaeth () ac yn argraffu'r llinyn i'r sgrin. Mae'r llinell yn cynnwys y dynodwr proses a elwir yn y gwreiddiol PID neu ddynodwr proses. Defnyddir y dynodwr hwn yn UNIX i gyfeirio at broses. Bydd y gorchymyn nesaf yn galw fforch (). Ar y pwynt hwn, mae copi bron yn union o'r broses yn cael ei greu. Ar gyfer yr OS, mae'n edrych fel bod 2 gopi o'r un rhaglen yn rhedeg ar y system, a fydd yn ei dro yn gadael y swyddogaeth fforch () . Ni fydd y broses plentyn sydd newydd ei chreu (mewn perthynas Γ’'r broses rhiant a'i creodd) yn cael ei gweithredu mwyach, gan ddechrau o'r brif swyddogaeth (). Dylid cofio nad yw proses plentyn yn union gopi o'r broses rhiant; yn benodol, mae ganddi ei le cyfeiriad ei hun, ei gofrestrau ei hun, ei bwyntydd ei hun i gyfarwyddiadau gweithredadwy, ac ati. Felly, bydd y gwerth a ddychwelir i alwr y ffwythiant fforch () yn wahanol. Yn benodol, bydd y broses rhiant yn derbyn gwerth PID y broses plentyn fel dychweliad, a bydd y plentyn yn derbyn gwerth sy'n hafal i 0. Gan ddefnyddio'r codau dychwelyd hyn, gallwch wedyn wahanu prosesau a gorfodi pob un ohonynt i wneud ei waith ei hun . Fodd bynnag, nid yw gweithrediad y rhaglen hon wedi'i ddiffinio'n llym. Ar Γ΄l rhannu'n 2 broses, mae'r OS yn dechrau eu monitro, yn ogystal Γ’ chynllunio eu gwaith. Os caiff ei weithredu ar brosesydd un craidd, bydd un o'r prosesau, y rhiant yn yr achos hwn, yn parhau i weithio, ac yna bydd y broses plentyn yn derbyn rheolaeth. Wrth ailgychwyn, gall y sefyllfa fod yn wahanol.

Galwch aros ()

Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

Ystyriwch y rhaglen ganlynol. Yn y rhaglen hon, oherwydd presenoldeb galwad aros () Bydd y broses rhiant bob amser yn aros i'r broses plentyn gael ei chwblhau. Yn yr achos hwn, byddwn yn cael allbwn testun wedi'i ddiffinio'n llym ar y sgrin

Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

exec() galwad

Systemau Gweithredu: Tri Darn Hawdd. Rhan 3: API Proses (cyfieithu)

Ystyriwch yr her gweithred(). Mae'r alwad system hon yn ddefnyddiol pan fyddwn am redeg rhaglen hollol wahanol. Yma byddwn yn galw execvp() i redeg y rhaglen wc sy'n rhaglen cyfrif geiriau. Beth sy'n digwydd pan fydd exec() yn cael ei alw? Mae'r alwad hon yn cael ei basio enw'r ffeil gweithredadwy a rhai paramedrau fel dadleuon. Ar Γ΄l hynny mae'r cod a'r data statig o'r ffeil gweithredadwy hon yn cael eu llwytho ac mae ei segment ei hun gyda'r cod yn cael ei drosysgrifo. Mae'r ardaloedd cof sy'n weddill, fel y pentwr a'r domen, yn cael eu hailgychwyn. Ar Γ΄l hynny mae'r OS yn gweithredu'r rhaglen yn syml, gan basio set o ddadleuon iddo. Felly ni wnaethom greu proses newydd, yn syml iawn, fe wnaethom drawsnewid y rhaglen sy'n rhedeg ar hyn o bryd yn rhaglen redeg arall. Ar Γ΄l gweithredu'r alwad exec() yn y disgynnydd, mae'n ymddangos fel pe na bai'r rhaglen wreiddiol yn rhedeg o gwbl.

Mae'r cymhlethdod cychwyn hwn yn gwbl normal ar gyfer cragen Unix, ac mae'n caniatΓ‘u i'r gragen honno weithredu cod ar Γ΄l galw fforc (), ond cyn yr alwad gweithred(). Enghraifft o god o'r fath fyddai addasu'r amgylchedd cregyn i anghenion y rhaglen sy'n cael ei lansio, cyn ei lansio.

Shell - dim ond rhaglen defnyddiwr. Mae hi'n dangos y llinell wahoddiad i chi ac yn aros i chi ysgrifennu rhywbeth ynddi. Yn y rhan fwyaf o achosion, os byddwch chi'n ysgrifennu enw rhaglen yno, bydd y gragen yn dod o hyd i'w leoliad, ffoniwch y dull fforch () , ac yna ffoniwch ryw fath o exec ( ) i greu proses newydd ac aros iddo gwblhau gan ddefnyddio a aros () galwad. Pan fydd y broses plentyn yn gadael, bydd y gragen yn dychwelyd o'r alwad aros () ac yn argraffu'r anogwr eto ac yn aros i'r gorchymyn nesaf gael ei nodi.

Mae rhaniad fforch () & exec () yn caniatΓ‘u i'r gragen wneud y pethau canlynol, er enghraifft:
ffeil wc > new_file.

Yn yr enghraifft hon, mae allbwn y rhaglen wc yn cael ei ailgyfeirio i ffeil. Mae'r ffordd y mae'r gragen yn cyflawni hyn yn eithaf syml - trwy greu proses plentyn cyn galw gweithred(), mae'r gragen yn cau allbwn safonol ac yn agor y ffeil ffeil_newydd, felly, yr holl allbwn o'r rhaglen redeg bellach wc yn cael ei ailgyfeirio i ffeil yn lle sgrin.

Pibell Unix yn cael eu gweithredu mewn ffordd debyg, gyda'r gwahaniaeth eu bod yn defnyddio galwad pibell(). Yn yr achos hwn, bydd ffrwd allbwn y broses yn cael ei gysylltu Γ’ chiw pibell sydd wedi'i leoli yn y cnewyllyn, y bydd llif mewnbwn proses arall yn gysylltiedig ag ef.

Ffynhonnell: hab.com

Ychwanegu sylw