Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

Operatsion tizimlarga kirish

Salom, Xabr! Men sizning e'tiboringizga bir qator maqolalar-tarjimalarni taqdim etmoqchiman, mening fikrimcha, qiziqarli bo'lgan adabiyot - OSTEP. Ushbu material unix-ga o'xshash operatsion tizimlarning ishini, ya'ni zamonaviy OTni tashkil etuvchi jarayonlar, turli rejalashtiruvchilar, xotira va shunga o'xshash boshqa komponentlar bilan ishlashni chuqur o'rganadi. Bu yerda barcha materiallarning asl nusxasini ko'rishingiz mumkin shu yerda. E'tibor bering, tarjima noprofessional tarzda qilingan (juda erkin), lekin men umumiy ma'noni saqlab qoldim deb umid qilaman.

Ushbu mavzu bo'yicha laboratoriya ishlarini bu erda topishingiz mumkin:

Boshqa qismlar:

Siz mening kanalimni ham ko'rishingiz mumkin telegram =)

Signal! Ushbu ma'ruza uchun laboratoriya mavjud! Qarang github

Jarayon API

UNIX tizimida jarayon yaratish misolini ko'rib chiqamiz. Bu ikkita tizim chaqiruvi orqali sodir bo'ladi vilka () и exec().

Call fork()

Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

Fork() chaqiruvini amalga oshiradigan dasturni ko'rib chiqing. Uning bajarilishining natijasi quyidagicha bo'ladi.

Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

Avvalo, biz main() funksiyasini kiritamiz va satrni ekranga chop qilamiz. Satrda asl nusxada chaqirilgan jarayon identifikatori mavjud PID yoki jarayon identifikatori. Ushbu identifikator UNIX da jarayonga murojaat qilish uchun ishlatiladi. Keyingi buyruq fork() ni chaqiradi. Bu vaqtda jarayonning deyarli aniq nusxasi yaratiladi. OT uchun xuddi shu dasturning 2 nusxasi tizimda ishlayotganga o'xshaydi, bu esa o'z navbatida fork() funksiyasidan chiqadi. Yangi yaratilgan asosiy jarayon (uni yaratgan asosiy jarayonga nisbatan) main() funktsiyasidan boshlab endi bajarilmaydi. Shuni esda tutish kerakki, bola jarayoni asosiy jarayonning aniq nusxasi emas, xususan, uning o'z manzil maydoni, o'z registrlari, bajariladigan ko'rsatmalarga o'z ko'rsatgichi va boshqalar mavjud. Shunday qilib, fork() funksiyasining chaqiruvchisiga qaytarilgan qiymat boshqacha bo'ladi. Xususan, ota-ona jarayoni qaytarilish sifatida bola jarayonining PID qiymatini oladi va bola 0 ga teng qiymatni oladi. Ushbu qaytarish kodlari yordamida siz jarayonlarni ajratib olishingiz va ularning har birini o'z ishini bajarishga majburlashingiz mumkin. . Biroq, ushbu dasturning bajarilishi qat'iy belgilanmagan. 2 jarayonga bo'lingandan so'ng, OS ularni kuzatishni boshlaydi, shuningdek, ularning ishini rejalashtirishni boshlaydi. Agar bitta yadroli protsessorda bajarilsa, jarayonlardan biri, bu holda ota-ona, ishlashni davom ettiradi, keyin esa bola jarayoni nazoratni oladi. Qayta ishga tushirilganda, vaziyat boshqacha bo'lishi mumkin.

Qo'ng'iroqni kutish ()

Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

Quyidagi dasturni ko'rib chiqing. Ushbu dasturda qo'ng'iroq mavjudligi sababli Kutmoq() Ota-ona jarayoni har doim bola jarayoni tugashini kutadi. Bunday holda, biz ekranda qat'iy belgilangan matn chiqishini olamiz

Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

exec() chaqiruvi

Operatsion tizimlar: Uchta oson. 3-qism: Process API (tarjima)

Qiyinchilikni ko'rib chiqing exec(). Ushbu tizim chaqiruvi biz butunlay boshqa dasturni ishga tushirmoqchi bo'lganimizda foydalidir. Mana biz qo'ng'iroq qilamiz execvp() so'zlarni hisoblash dasturi bo'lgan wc dasturini ishga tushirish uchun. exec() chaqirilganda nima bo'ladi? Ushbu chaqiruv bajariladigan fayl nomi va ba'zi parametrlar argument sifatida uzatiladi. Shundan so'ng ushbu bajariladigan fayldan kod va statik ma'lumotlar yuklanadi va kodli o'z segmenti qayta yoziladi. Qolgan xotira maydonlari, masalan, stek va to'p, qayta ishga tushiriladi. Shundan so'ng, OS oddiygina argumentlar to'plamini o'tkazib, dasturni bajaradi. Shunday qilib, biz yangi jarayon yaratmadik, shunchaki hozir ishlayotgan dasturni boshqa ishlaydigan dasturga aylantirdik. Exec() chaqiruvi avlodda bajarilgandan so'ng, dastlabki dastur umuman ishlamagandek ko'rinadi.

Unix qobig'i uchun ushbu ishga tushirish murakkabligi mutlaqo normaldir va bu qobiq qo'ng'iroq qilgandan keyin kodni bajarishga imkon beradi. vilka (), lekin qo'ng'iroqdan oldin exec(). Bunday kodga misol sifatida qobiq muhitini ishga tushirishdan oldin uni ishga tushirilayotgan dastur ehtiyojlariga moslashtirish mumkin.

chig'anoq - shunchaki foydalanuvchi dasturi. U sizga taklifnoma chizig'ini ko'rsatadi va unda nimadir yozishingizni kutadi. Ko'pgina hollarda, agar siz u erda dasturning nomini yozsangiz, qobiq o'z manzilini topadi, fork() usulini chaqiradi va keyin yangi jarayon yaratish uchun exec() turini chaqiradi va uning tugashini kutadi. wait() chaqiruvi. Bola jarayoni tugagandan so'ng, qobiq wait() chaqiruvidan qaytadi va so'rovni yana chop etadi va keyingi buyruq kiritilishini kutadi.

Fork() va exec() bo'linishi qobiqga quyidagi ishlarni bajarishga imkon beradi, masalan:
wc fayl > new_fayl.

Ushbu misolda, wc dasturining chiqishi faylga yo'naltirilgan. Qobiqning bunga erishish usuli juda oddiy - qo'ng'iroq qilishdan oldin bola jarayonini yaratish orqali exec(), qobiq standart chiqishni yopadi va faylni ochadi yangi_fayl, shunday qilib, keyingi ishlaydigan dasturning barcha chiqishi wc ekran o'rniga faylga yo'naltiriladi.

Unix trubkasi xuddi shunday tarzda amalga oshiriladi, farqi shundaki, ular pipe() chaqiruvidan foydalanadilar. Bunda jarayonning chiqish oqimi yadroda joylashgan quvur navbatiga ulanadi, unga boshqa jarayonning kirish oqimi ulanadi.

Manba: www.habr.com

a Izoh qo'shish