Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

Əməliyyat sistemlərinə giriş

Hey Habr! Fikrimcə, bir maraqlı ədəbiyyatın - OSTEP-in bir sıra məqalə-tərcümələrini diqqətinizə çatdırmaq istərdim. Bu material unix-ə bənzər əməliyyat sistemlərinin işini, yəni proseslər, müxtəlif planlaşdırıcılar, yaddaş və müasir ƏS-ni təşkil edən digər oxşar komponentlərlə işləməyi kifayət qədər dərindən müzakirə edir. Bütün materialların orijinalına burada baxa bilərsiniz burada. Nəzərə alın ki, tərcümə qeyri-peşəkar şəkildə (olduqca sərbəst) edilib, amma ümid edirəm ki, ümumi mənası saxlamışam.

Bu mövzuda laboratoriya işlərini burada tapa bilərsiniz:

Digər hissələr:

Kanalıma da baxa bilərsiniz teleqram =)

Siqnal! bu mühazirə üçün laboratoriya var! Bax github

proses API

UNIX sistemində prosesin yaradılması nümunəsini nəzərdən keçirək. Bu, iki sistem çağırışı ilə baş verir çəngəl () и icra().

zəng çəngəl()

Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

Fork() çağırışı edən proqramı nəzərdən keçirək. Onun icrasının nəticəsi aşağıdakı kimi olacaq.

Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

Əvvəlcə main() funksiyasına daxil oluruq və sətri ekrana çap edirik. Sətir orijinalda adlanan proses identifikatorunu ehtiva edir PID və ya proses identifikatoru. Bu identifikator UNIX-də prosesə istinad etmək üçün istifadə olunur. Növbəti əmr fork() çağırışını yerinə yetirəcək. Bu zaman prosesin demək olar ki, dəqiq surəti yaradılır. ƏS üçün, sistemdə eyni proqramın 2 nüsxəsinin işlədiyi görünür ki, bu da öz növbəsində fork () funksiyasının icrasından çıxacaq. Yeni yaradılmış uşaq prosesi (onu yaradan ana prosesə münasibətdə) main() funksiyasından başlayaraq artıq icra olunmayacaq. Yadda saxlamaq lazımdır ki, uşaq prosesi ana prosesin dəqiq surəti deyil, xüsusən onun öz ünvan sahəsi, öz registrləri, icra olunan təlimatlara öz göstəricisi və s. Beləliklə, fork() funksiyasının zəng edənə qaytarılan dəyər fərqli olacaq. Xüsusilə, ana proses uşaq prosesinin PID dəyərini qaytaracaq və uşaq 0-a bərabər bir dəyər alacaq. Bu qaytarma kodlarından istifadə edərək, gələcəkdə prosesləri ayırmaq və onların hər birini öz funksiyasını yerinə yetirməyə məcbur etmək artıq mümkündür. iş. Lakin bu proqramın icrası qəti şəkildə müəyyən edilməyib. 2 prosesə bölündükdən sonra ƏS eyni şəkildə onlara nəzarət etməyə və onların işini planlaşdırmağa başlayır. Bir nüvəli prosessorda icra edildiyi halda, proseslərdən biri, bu halda, valideyn işi davam etdirəcək, sonra isə uşaq prosesi nəzarəti ələ keçirəcək. Yenidən başladıqda vəziyyət fərqli ola bilər.

gözləmək üçün zəng edin ()

Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

Aşağıdakı proqramı nəzərdən keçirin. Bu proqramda, zəng olması səbəbiylə Gözləmək() Ana proses həmişə uşaq prosesinin dayandırılmasını gözləyəcək. Bu halda, biz ekranda mətnin ciddi şəkildə müəyyən edilmiş çıxışını alacağıq.

Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

exec() çağırın

Əməliyyat Sistemləri: Üç Asan Parça. Hissə 3: Proses API (tərcümə)

Problemi nəzərdən keçirin icra(). Bu sistem çağırışı tamamilə fərqli bir proqramı işə salmaq istədiyimiz zaman faydalıdır. Burada zəng edəcəyik execvp() söz sayma proqramı olan wc proqramını işə salmaq üçün. exec() çağırılanda nə baş verir? Bu çağırış icra olunan faylın adı və bəzi parametrlər kimi arqumentlər kimi ötürülür. Bundan sonra kod və statik məlumatlar bu icra edilə bilən fayldan yüklənir və kodu olan öz seqmentinin üzərinə yazılır. Yığın və yığın kimi yaddaşın qalan hissəsi yenidən işə salınır. Bundan sonra, ƏS sadəcə proqramı icra edir, ona bir sıra arqumentlər verir. Beləliklə, biz yeni bir proses yaratmadıq, sadəcə olaraq hazırda işləyən proqramı başqa işləyən proqrama çevirdik. Uşaqda exec() çağırışı edildikdən sonra, görünür, orijinal proqram ümumiyyətlə işləməyib.

Başlanğıcın bu çətinliyi Unix qabığı üçün tamamilə normaldır və bu qabığa zəng etdikdən sonra kodu icra etməyə imkan verir. çəngəl (), lakin zəng etməzdən əvvəl icra(). Bu cür koda misal olaraq, shell mühitini işə salınmazdan əvvəl icra olunan proqramın ehtiyaclarına uyğunlaşdırmaq olar.

Qabıq sadəcə istifadəçi proqramıdır. O, sizə sorğu göstərir və ona nəsə yazmağınızı gözləyir. Əksər hallarda orada proqram adını yazsanız, shell öz yerini tapacaq, fork() metodunu çağıracaq və sonra yeni proses yaratmaq üçün exec() növlərindən birini çağıracaq və gözləmə ilə onun tamamlanmasını gözləyəcək. () zəng edin. Uşaq prosesi başa çatdıqda, qabıq wait() çağırışından qayıdacaq və sorğunu yenidən çap edəcək və növbəti əmrin daxil edilməsini gözləyəcək.

Fork() və exec() funksiyalarının ayrılması qabığa aşağıdakı işləri görməyə imkan verir, məsələn:
wc faylı > yeni_fayl.

Bu nümunədə wc proqramının çıxışı fayla yönləndirilir. Qabığın buna nail olma yolu olduqca sadədir - zəng etməzdən əvvəl uşaq prosesi yaratmaqla icra(), qabıq standart çıxışı bağlayır və faylı açır yeni_fayl, beləliklə, növbəti işləyən proqramdan bütün çıxışlar wc ekran yerinə fayla yönləndiriləcək.

Unix boruları boru () çağırışından istifadə etdikləri fərqlə oxşar şəkildə həyata keçirilir. Bu halda, prosesin çıxış axını nüvədə yerləşən boru növbəsinə qoşulacaq və ona başqa bir prosesin giriş axını əlavə olunacaq.

Mənbə: www.habr.com

Добавить комментарий