Sobes.tech
Middle

Linux əməliyyat sistemində fork sistem çağırışından istifadə edərək onun nüsxəsini yaratdıqda, prosesin yaddaşı ilə nə baş verir?

sobes.tech Süni İntellekt

AI-dan cavab

fork() çağırıldığında, əməliyyat sisteminin nüvəsi yeni bir proses, oğul proses yaradır, bu da valideyn prosesin demək olar ki, dəqiq surətidir.

Yaddaş baxımından aşağıdakı baş verir:

  1. Virtual ünvan sahəsi: Oğul prosesi öz virtual ünvan sahəsini alır, bu da fork() çağırışında valideynlə eynidir. Bu, oğul prosesinin eyni ünvan aralığını görməsi və kod, məlumatlar, yığın, yığın sahələrinin strukturu ilə valideynə bənzər olmasını təmin edir.

  2. Fiziki yaddaş və Copy-on-Write (CoW): Əvvəlcə, valideyn və oğul prosesləri eyni fiziki yaddaş səhifələrindən istifadə edir. Bu, "Copy-on-Write" (CoW) adlanan optimizasiyadır. Fiziki yaddaş yalnız bir proses səhifənin məzmununu dəyişdirməyə çalışdıqda kopyalanır.

    • Əgər valideyn və ya oğul prosesi əvvəlcə ümumi olan səhifəyə məlumat yazırsa, nüvə bu səhifənin yeni bir nüsxəsini yaradır və yazan prosesə verir. Digər proses isə köhnə versiyanı istifadə etməyə davam edir.
    • Əgər proseslər yalnız məlumat oxuyursa, onlar fiziki yaddaş səhifəsini paylaşmağa davam edir.
  3. Fayl deskriptorları: Açıq fayl deskriptorları oğul prosesinə miras qalır. Hər iki proses faylda ofset göstəricilərindən istifadə edir.

  4. Digər resurslar: Siqnalların işləyiciləri, cari iş qovluğu və s. kimi digər resurslar da kopyalanır və ya miras alınır.

Budur sadə bir təsvir:

fork()-dən əvvəl:

+-------------------+
| Valideyn prosesi |
| +-----------------+ |
| | Virtual Yaddaş |
| | (Yığın, Heap, ...) |
| +-----------------+ |
|      |              |
|      V              |
| +-----------------+ |
| | Fiziki Yaddaş |
| +-----------------+ |
+-------------------+

fork()-dən dərhal sonra (CoW):

+-----------------------+   +-----------------------+
| Valideyn prosesi      |   | Oğul prosesi         |
| +-------------------+ |   | +-------------------+ |
| | Virtual Yaddaş    | |   | | Virtual Yaddaş    | |
| | (Eyni struktur)    | |   | | (Eyni struktur)    | |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Fiziki Yaddaş        | | | Fiziki Yaddaş        | |
| | (Bəzi səhifələr ümumi)| | | (Bəzi səhifələr ümumi)| |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+
          |                            |
          +----------------------------+
                Fiziki yaddaş səhifələri başlanğıcda ümumi

Bir səhifəyə yazdıqdan sonra (CoW aktivləşdi):

+-----------------------+   +-----------------------+
| Valideyn prosesi      |   | Oğul prosesi         |
| +-------------------+ |   | +-------------------+ |
| | Virtual Yaddaş    | |   | | Virtual Yaddaş    | |
| |                   | |   | |                   | |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Fiziki Yaddaş        | | | Fiziki Yaddaş        | |
| | (Fərqli səhifələr)   | | | (Fərqli səhifələr)   | |
| +-----------------------+   | +-----------------------+

Əhəmiyyətlidir ki, fork()-dən sonra dərhal eyni virtual ünvan sahəsinə baxmayaraq, bir prosesdə yaddaşda edilən hər hansı dəyişiklik (dəyişənlərə yazma, yığımda yaddaş ayırma/azaltma) digər prosesin yaddaşını təsir etmir, CoW mexanizmi sayəsində. Bu, tamamilə müstəqil proseslərdir.