[Cevabımın bir kısmını buradan tekrarlayacağım .]
Neden sadece sıfırdan yeni bir süreç yaratan bir emir almıyorsunuz? Sadece hemen değiştirilecek olanı kopyalamak saçma ve verimsiz değil mi?
Aslında, bu muhtemelen birkaç nedenden dolayı etkili olmayacaktır:
fork()
Çekirdek yazma üzerine bir kopya sistemi kullandığından, "tarafından üretilen" kopya " bir soyutlamadır ; Gerçekten yaratılması gereken tek şey sanal bir hafıza haritası. Kopya hemen derhal çağrılırsa exec()
, işlemin etkinliği tarafından değiştirildiyse kopyalanacak verilerin çoğu, işlemin kullanılmasını gerektiren herhangi bir şey yapmadığından aslında hiçbir zaman kopyalanmamalı / oluşturulmamalıdır.
Alt sürecin çeşitli önemli yönleri (örneğin, çevresi) bağlamın karmaşık bir analizine dayanarak ayrı ayrı çoğaltılmamalı veya ayarlanmamalıdır. Çağrılan işlemle aynı olduğu varsayılır ve Bu, aşina olduğumuz oldukça sezgisel bir sistemdir.
# 1'i biraz daha açıklamak gerekirse, "kopyalanan" ancak daha sonra hiçbir zaman erişilemeyen bellek, en azından çoğu durumda hiçbir zaman gerçekten kopyalanmaz. Bu bağlamda bir istisna olabilir , sonra bir süreç çatallı çocuk kendini yerini önce üst süreç çıkmak olsaydı olmak exec()
. Diyorum kudretini yeterli boş bellek varsa ebeveynin çok önbelleğe alınabilir, çünkü, ben (OS uygulanmasına bağlı olacaktır) ne ölçüde bu istismar olacağını emin değilim.
Tabii ki, bu yüzeyde boş bir kayrak kullanmaktan daha etkili bir kopya kullanmayı kolaylaştırmaz - "boş kayrak" tam anlamıyla hiçbir şey değildir ve tahsisat içermelidir. Sistem, aynı şekilde kopyaladığı genel bir boş / yeni işlem şablonuna sahip olabilir, 1, ancak daha sonra yazma-kopyalama çatalı ile ilgili hiçbir şey kaydetmez. Yani # 1 sadece "yeni" bir boş işlem kullanmanın daha verimli olmayacağını gösteriyor.
Nokta # 2, çatal kullanmanın neden daha verimli olduğunu açıklıyor. Tamamen farklı bir çalıştırılabilir olsa bile, çocuğun ortamı ebeveyninden miras alınır. Örneğin, ana işlem bir kabuksa ve çocuk bir web tarayıcısıysa, $HOME
ikisi için de aynıdır, ancak daha sonra her ikisini de değiştirebildiğinden, bunlar iki ayrı kopya olmalıdır. Çocukta olan orijinal tarafından üretilir fork()
.
1. Çok fazla anlam ifade etmeyen bir strateji, ama benim açımdan bir işlem yaratmanın, imajını diskten belleğe kopyalamaktan daha fazlasını gerektirdiğidir.