Sobes.tech
Middle

Linux иштөө тутумунда fork системалык чакырыгын колдонуп, процесстин көчүрмөсүн түзгөндө, анын эс тутуму менен эмне болот?

sobes.tech AI

AIден жооп

Күйдө fork() чакырганда, операциялык тутумдун ядросу жаңы процессти түзөт, ал — балдар процесси, ал — дээрлик так көчүрмө ата-эне процесстин.

Эстутумдун көз карашынан төмөнкүлөр болот:

  1. Виртуалдык дарек кеңири жайгашуу: Балдар процесси өзүнүн жеке, бөлүнгөн виртуалдык дарек кеңири жайгашуу алат, ал — fork() чакырган учурда ата-эне менен бирдей. Бул балдар процесси "көрөт" ошол эле дарек диапазондорун жана сегменттердин түзүмүн (код, маалыматтар, стек, куча), ата-эне менен бирдей.

  2. Физикалык эстутум жана Copy-on-Write (CoW): Башта балдар жана ата-эне процесстери бирге колдонуп жаткан физикалык баракчалар. Бул — "Copy-on-Write" (CoW) деп аталган оптимизация. Физикалык эстутумду көчүрүү гана керек болсо, анда процесс өзгөрткөндө гана:

    • Эгер ата-эне же балдар процесси бир баракчага маалымат жазса, ядро жаңы көчүрмөсүн түзөт.
    • Эгер процесстер гана окуса, анда алар ошол эле физикалык баракчаны колдонуп кала беришет.
  3. Файл дескриптору: Ачылган файл дескрипторлору мурас катары берилет. Эки процесс бирге файлдын ордуна иштешет.

  4. Башка ресурстар: Башка ресурстар, мисалы, сигнал иштетүүчүлер, учурдагы иштөө каталогү жана башка, да көчүрүлөт же мурас катары берилет.

Мына так сүрөттөмө:

fork() алдында:

+-------------------+
| Ата-эне процесси |
| +-----------------+ |
| | Виртуалдык эстутум |
| | (Стек, Куча, ...) |
| +-----------------+ |
|      |              |
|      V              |
| +-----------------+ |
| | Физикалык эстутум |
| +-----------------+ |
+-------------------+

fork()-дон кийин (CoW):

+-----------------------+   +-----------------------+
| Ата-эне процесси     |   |  Балдар процесси      |
| +-------------------+ |   | +-------------------+ |
| | Виртуалдык эстутум  | |   | | Виртуалдык эстутум  | |
| | (Ошондой структура) | |   | | (Ошондой структура) | |
| +-------------------+ |   | +-------------------+ |
|        |                |   |        |                |
|        V                |   |        V                |
| +-----------------------+   | +-----------------------+
| |    Физикалык эстутум  | | |    Физикалык эстутум  | |
| | (Кээ бир баракчалар жалпы) | | | (Кээ бир баракчалар жалпы) | |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+
          |                            |
          +----------------------------+
                Баштапкы баракчалар жалпы

Бир баракча жазылганда (CoW иштейт):

+-----------------------+   +-----------------------+
| Ата-эне процесси     |   |  Балдар процесси      |
| +-------------------+ |   | +-------------------+ |
| | Виртуалдык эстутум  | |   | | Виртуалдык эстутум  | |
| |                   | |   | |                   | |
| +-------------------+ |   | +-------------------+ |
|        |                |   |        |                |
|        V                |   |        V                |
| +-----------------------+   | +-----------------------+
| |    Физикалык эстутум  | | |    Физикалык эстутум  | |
| | (Өзгөртүлгөн баракчалар) | | | (Өзгөртүлгөн баракчалар) | |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+

Маанилүү, fork()-дан кийин бирдей виртуалдык дарек кеңири жайгашуу болсо да, бир процесстин эсинде жасалган өзгөртүүлөр (өзгөртүү, бөлүү, бошотуу) башка процесске таасир этпейт, CoW механизми аркылуу. Бул — толугу менен көзкарандысыз процесстер.