Linux işletim sisteminde fork sistem çağrısı kullanarak bir kopyasını oluşturduğumuzda, süreç belleğiyle ne olur?
sobes.tech yapay zeka
AI'dan gelen yanıt
fork() çağrıldığında, işletim sisteminin çekirdeği yeni bir süreç, çocuk süreci oluşturur ve bu süreç neredeyse ebeveyn sürecinin tam bir kopyasıdır.
Bellek açısından şu olaylar gerçekleşir:
-
Sanal adres alanı: Çocuk süreç, kendi sanal adres alanını alır, bu alan
fork()çağrısı anındaki ebeveynle aynıdır. Bu, çocuğun aynı adres aralıklarını görmesi ve aynı segment yapısına (kod, veri, yığın, heap) sahip olması anlamına gelir. -
Fiziksel bellek ve Copy-on-Write (CoW): Başlangıçta, ebeveyn ve çocuk süreçler aynı fiziksel sayfaları paylaşır. Bu, "Copy-on-Write" (CoW) olarak bilinen bir optimizasyondur. Bir süreç, bir sayfanın içeriğini değiştirmeye çalıştığında, fiziksel bellek sayfasının yeni bir kopyası oluşturulur.
- Eğer ebeveyn veya çocuk süreç, daha önce paylaşılan bir sayfaya veri yazarsa, çekirdek bu sayfanın yeni bir kopyasını oluşturur ve yazan süreç bu yeni sayfayı kullanır. Diğer süreç ise eski sayfayı kullanmaya devam eder.
- Eğer süreçler sadece okuma yapıyorsa, paylaşılan fiziksel sayfayı kullanmaya devam ederler.
-
Dosya tanıtıcıları: Açık dosya tanıtıcıları, çocuk sürece miras kalır. Her iki süreç de dosya kaydırıcılarına işaret eden göstergeleri paylaşır.
-
Diğer kaynaklar: Sinyal işleyicileri, geçerli çalışma dizini gibi diğer kaynaklar da kopyalanır veya miras alınır.
İşte basitleştirilmiş bir gösterim:
fork() öncesi:
+-------------------+
| Ebeveyn Süreci |
| +--------------+ |
| | Sanal Bellek | |
| | (Yığın, Heap, ...) | |
| +--------------+ |
| | |
| V |
| +--------------+ |
| | Fiziksel Bellek | |
| +--------------+ |
+-------------------+
fork() hemen sonrası (CoW):
+-----------------------+ +-----------------------+
| Ebeveyn Süreci | | Çocuk Süreci |
| +-------------------+ | | +-------------------+ |
| | Sanal Bellek | | | | Sanal Bellek | |
| | (Aynı yapı) | | | | (Aynı yapı) | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-------------------+ | | +-------------------+ |
| | Fiziksel Bellek | | | | Fiziksel Bellek | |
| | (Bazı sayfalar paylaşılır)| | | (Bazı sayfalar paylaşılır)| |
| +-------------------+ | | +-------------------+ |
+-----------------------+ +-----------------------+
| |
+----------------------------+
Başlangıçta paylaşılan fiziksel sayfalar
Bir sayfaya yazdıktan sonra (CoW tetiklenir):
+-----------------------+ +-----------------------+
| Ebeveyn Süreci | | Çocuk Süreci |
| +-------------------+ | | +-------------------+ |
| | Sanal Bellek | | | | Sanal Bellek | |
| | | | | | | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-------------------+ | | +-------------------+ |
| | Fiziksel Bellek | | | | Fiziksel Bellek | |
| | (Ayrı sayfalar) | | | | (Ayrı sayfalar) | |
| +-------------------+ | | +-------------------+ |
+-----------------------+ +-----------------------+
Önemli olan, fork() sonrası hemen her iki süreçte de sanal adres alanının aynı olmasıdır, ancak bir süreçte yapılan değişiklikler (değişkenlere yazma, heap'te bellek ayırma/serbest bırakma) diğer süreçteki belleği etkilemez, çünkü CoW mekanizması sayesinde her süreç bağımsızdır. Bu süreçler tamamen bağımsızdır.