Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

Муқаддима ба системаҳои оператсионӣ

Салом, Хабр! Мехохам ба диццати шумо як катор макола-тарчимахои як адабиётро пешкаш намоям, ки ба назари ман — ОСТЕП. Дар ин мавод кори системаҳои оператсионии ба unix монанд, яъне кор бо равандҳо, графикҳои гуногун, хотира ва дигар ҷузъҳои шабеҳ, ки ОС-и муосирро ташкил медиҳанд, хеле амиқ омӯхта мешавад. Шумо метавонед асли ҳамаи маводҳоро дар ин ҷо бинед дар ин ҷо. Лутфан қайд кунед, ки тарҷума ғайрикасбӣ (хеле озодона) анҷом дода шудааст, аммо ман умедворам, ки ман маънои умумиро нигоҳ доштам.

Корҳои лабораторӣ дар ин мавзӯъро дар ин ҷо пайдо кардан мумкин аст:

Қисмҳои дигар:

Шумо инчунин метавонед канали маро дар ин ҷо санҷед телеграмма =)

Огоҳӣ! Барои ин лекция лаборатория мавчуд аст! Нигоҳ кунед github

API-и раванд

Биёед мисоли эҷоди равандро дар системаи UNIX дида бароем. Он тавассути ду занги система рӯй медиҳад чангак () и exec().

Занг ба fork()

Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

Барномаеро дида мебароем, ки занги fork()-ро мекунад. Натичаи ичрои он чунин хохад шуд.

Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

Пеш аз ҳама, мо функсияи main()-ро ворид мекунем ва сатрро дар экран чоп мекунем. Дар сатр идентификатори раванд мавҷуд аст, ки дар асл номида мешавад PID ё муайянкунандаи раванд. Ин идентификатор дар UNIX барои ишора ба раванд истифода мешавад. Фармони навбатӣ fork()-ро даъват мекунад. Дар ин лаҳза, нусхаи қариб дақиқи раванд эҷод карда мешавад. Барои ОС чунин ба назар мерасад, ки дар система 2 нусхаи як барнома кор мекунад, ки дар навбати худ аз функсияи fork() хориҷ мешаванд. Раванди кӯдаки навтаъсис (нисбат ба раванди волидайне, ки онро эҷод кардааст) аз функсияи main() дигар иҷро намешавад. Дар хотир бояд дошт, ки раванди кўдак нусхаи дақиқи раванди волидайн нест, аз ҷумла, он дорои фазои суроғаи худ, регистрҳои худ, нишондиҳандаи худ ба дастурҳои иҷрошаванда ва ғайра мебошад. Ҳамин тариқ, арзиши баргардонидашуда ба зангкунандаи функсияи fork() гуногун хоҳад буд. Аз ҷумла, раванди волидайн арзиши PID-и раванди кӯдакро ҳамчун бозгашт қабул мекунад ва кӯдак арзиши баробар ба 0 хоҳад гирифт. Бо истифода аз ин рамзҳои бозгашт, шумо метавонед пас аз он равандҳоро ҷудо кунед ва ҳар яки онҳоро маҷбур кунед, ки кори худро анҷом диҳад. . Аммо ичрои ин программа катъиян муайян карда нашудааст. Пас аз тақсим кардани 2 раванд, ОС ба назорат кардани онҳо ва инчунин ба нақша гирифтани кори онҳо шурӯъ мекунад. Агар дар протсессори як-аслӣ иҷро карда шавад, яке аз равандҳо, дар ин ҳолат волидайн корашро идома медиҳад ва он гоҳ раванди кӯдак назоратро мегирад. Ҳангоми аз нав оғоз кардан, вазъият метавонад гуногун бошад.

Интизори занг ()

Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

Барномаи зеринро баррасӣ кунед. Дар ин барнома аз сабаби мавҷудияти занг интизор шавед () Раванди волидайн ҳамеша интизори анҷоми раванди кӯдак аст. Дар ин ҳолат, мо дар экран матни қатъии муайяншударо мегирем

Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

exec() занг занед

Системаҳои оператсионӣ: Се дона осон. Қисми 3: API-и раванд (тарҷума)

Мушкилотро баррасӣ кунед exec(). Ин занги системавӣ вақте муфид аст, ки мо мехоҳем барномаи комилан дигарро иҷро кунем. Дар ин ҷо мо занг мезанем execvp() барои иҷро кардани барномаи wc, ки барномаи ҳисобкунии калимаҳост. Вақте ки exec() даъват мешавад, чӣ мешавад? Ин занг номи файли иҷрошаванда ва баъзе параметрҳоро ҳамчун аргумент интиқол медиҳад. Пас аз он, код ва маълумоти статикӣ аз ин файли иҷрошаванда бор карда мешавад ва сегменти худи он бо рамз дубора навишта мешавад. Майдонҳои хотираи боқимонда, ба монанди стек ва теппа, аз нав оғоз карда мешаванд. Пас аз он, ОС танҳо барномаро иҷро мекунад ва ба он маҷмӯи аргументҳоро интиқол медиҳад. Ҳамин тавр, мо раванди нав эҷод накардем, мо танҳо барномаи иҷрошавандаро ба барномаи дигари иҷрошаванда табдил додем. Пас аз иҷрои занги exec() дар насл чунин ба назар мерасад, ки гӯё барномаи аслӣ умуман иҷро нашудааст.

Ин мушкилии оғозёбӣ барои қабати Unix комилан муқаррарӣ аст ва имкон медиҳад, ки ин қабат пас аз занг задан кодро иҷро кунад. чангак (), балки пеш аз занг exec(). Намунаи чунин кодҳо пеш аз оғози он танзим кардани муҳити ҷилди ба эҳтиёҷоти барномаи оғозшаванда мебошад.

пӯст - танҳо як барномаи корбар. Вай ба шумо хати даъватро нишон медиҳад ва интизор мешавад, ки шумо дар он чизе нависед. Дар аксари мавридҳо, агар шумо номи барномаро дар он ҷо нависед, ҷабҳа макони худро пайдо мекунад, усули fork()-ро даъват мекунад ва баъд ягон намуди exec()-ро даъват мекунад, то раванди нав эҷод кунад ва интизор шавед, ки он бо истифода аз интизор () занг занед. Вақте ки раванди кӯдак хориҷ мешавад, ҷабҳа аз занги wait() бармегардад ва дархостро дубора чоп мекунад ва ворид шудани фармони навбатиро интизор мешавад.

Ҷудокунии fork() & exec() ба ҷабҳа имкон медиҳад, ки корҳои зеринро иҷро кунад, масалан:
wc файл > файли нав.

Дар ин мисол, баромади барномаи wc ба файл равона карда мешавад. Тарзи ноил шудан ба ин ҷабҳа хеле оддӣ аст - тавассути эҷод кардани раванди кӯдак пеш аз занг exec(), қабат баромади стандартиро мепӯшонад ва файлро мекушояд нав_файл, ҳамин тавр, ҳама натиҷаҳо аз барномаи минбаъдаи иҷрошаванда wc ба ҷои экран ба файл равона карда мешавад.

Қубури Unix ба таври шабеҳ амалӣ карда мешаванд, бо фарқияте, ки онҳо занги қубурро () истифода мебаранд. Дар ин ҳолат, ҷараёни баромади раванд ба навбати қубуре, ки дар ядро ​​ҷойгир аст, пайваст мешавад, ки ҷараёни вуруди раванди дигар ба он пайваст мешавад.

Манбаъ: will.com

Илова Эзоҳ