2015-08-21 19 views
5

Çatal() ders kitabı örneğini derleyip çalıştırdığımı varsayalım.Çatal() ebeveynin tüm belleğini çoğaltır mı?

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(void) 
{ 
     pid_t pid; 
     pid = fork(); 

     if (pid == -1) 
       return 1; 

     if (pid == 0) 
       puts("From child process."); 
     else 
       puts("From parent process."); 

     return 0; 
} 

if (pid == 0) ifadenin her iki şubelerden kod fork() almak mı? Başka bir deyişle, çocuk süreci, ebeveyn tarafından hiçbir zaman onun tarafından yürütülmeyecek bir kod içermekte midir? Veya derleyici bunu optimize edebilir mi?

+1

Evet öyle. Ama önemli değil. Optimizasyon işletim sistemindeki derleyici değil. Metin segmenti tüm çatallı işlemler tarafından paylaşılacaktır. Yani, OS, metin parçası için aynı fiziksel belleği, çatallı işlemlerin her birine eşler. Aslında, belirli bir veri sayfasına (yani, Yazma Üzerine Kopyala) yazılana kadar veriler bile paylaşılır. – kaylum

cevap

7

fork() tüm süreci çoğaltır. buna 0 döndüren çocukta, çocuğun PID döndüren ebeveyn de - tek fark fork() çağrının kendisi dönüş değeri içindedir.

Çoğu işletim sistemi yazma üzerinde kopya denilen bir teknik kullanarak, bu duruma. Tüm belleği kopyalamak yerine, çocuk ebeveynin belleğini paylaşır. Ancak, tüm bellek sayfalarını kopya üzerinde yazma ya süreç bir sayfada şey değiştirir, eğer o anda kopyalanmış olacağı anlamına gelir ve kopyayı kullanmaya değişecektir modifiye süreci (ve COW işaretlenmişlerdir orijinal sayfa için de bayrak kapatılacaktır).

Bu konuda daha fazla ayrıntı için Wikipedia bakınız.

+1

IIRC, fork/exec cygwin üzerinde çok yavaş çünkü Windows 'fork()' bölümü için hızlı desteği yoktur. Unix semantiklerini taklit etmek için cygwin'in yapması gereken detayları unuttum. Elbette, tüm uygun Unix OS'lerinde hızlıdır. –

+0

"Mükemmel anti-Unix'i tasarlamak, proses-yumurtlamayı çok pahalı yapmak, işlem kontrolünü zor ve esnek hale getirmek ve IPC'yi, Unix Programlama Sanatı'ndan" (http: //) desteklenmeyen veya yarı destekli bir sonradan destekleyin. www.catb.org/esr/writings/taoup/html/ch03s01.html#id2892171). – nebuch