Çatal ve exec nasıl çalışır?


17

Çok fazla tecrübem yok, sadece donanıma kullanıcı seviyesinden nasıl yorumladıkları süreçlerine dahil olmaya çalışıyorum.

Yani bir komut bir kabuktan tetiklendiğinde fork(), onun alt sürecini devralır ve exec()alt süreci belleğe yükler ve yürütür.

  1. Alt süreç, üst sürecin tüm özelliklerini (orijinal süreç olan) içeriyorsa, bu alt sürecin ihtiyacı nedir? Orijinal işlem de belleğe yüklenmiş olabilir.
  2. Bu forkve execkavram UNIX'teki tüm yürütülebilir program için geçerli mi? Kabuk betiği için mi yoksa sadece komutlar için mi? Kabuk yerleşik komutları için de geçerli mi?
  3. Bir komut / komut dosyası yürütürsem yazma üzerine kopyalama kavramı ne zaman kullanılır?

Bir seferde birçok soru sorduğum için üzgünüm, ancak tüm bu sorular herhangi bir komut yürütmeyi düşündüğümde aklıma geliyor.


Bunun bir kopya olduğunu söylemeyeceğim, ancak sorunuzun bir kısmının burada cevaplandığını düşünüyorum: unix.stackexchange.com/questions/136637/… ve bunun tepesinde bulunan diğer cevapta.
goldilocks

Yanıtlar:


22

Bu nedenle, bir komut bir kabuktan tetiklendiğinde fork (), alt işlemini devralır ve exec (), alt işlemi belleğe yükler ve yürütür.

Pek değil. fork()özdeş bir alt öğe oluşturarak geçerli işlemi klonlar. mevcut sürece exec()yeni bir program yükler .

Benim qs:

Alt işlem, üst işlemin (özgün işlem olan) tüm niteliklerini içeriyorsa, bu alt işlemin ihtiyacı nedir? Orijinal işlem de belleğe yüklenmiş olabilir.

Bunun nedeni, üst sürecin henüz sona erdirmek istememesi; yeni bir sürecin devam etmesini ve aynı zamanda bir şeyler yapmaya devam etmesini istiyor.

Bu çatal ve exec kavramı UNIX'teki tüm yürütülebilir program için mi geçerli? Kabuk yerleşik komutları için de geçerli mi?

Harici komutlar için kabuk fork(), komutun yeni bir işlemde çalışmasını sağlayacak şekilde yapar . Builtins sadece kabuk tarafından doğrudan yönetilir. Bir diğer kayda değer komut, execkabuğuna exec()ilk önce harici programa söyleyen komuttur fork(). Bu, kabuğun kendisinin yeni programla değiştirildiği anlamına gelir ve bu program çıkınca geri dönmesi için artık orada değildir. Dersen exec true, o zaman /bin/trueo kapanacak yüzden artık senin terminali çalışan hiçbir şey bırakarak, kabuğun altında ve hemen çıkış yerini alacak.

bir komut / komut dosyası yürütürsem yazma kavramında kopya ne zaman kullanılır?

Taş çağında, fork()aslında çağrı sürecindeki tüm hafızayı yeni sürece kopyalamak zorunda kaldı. Yazarken Kopyala, iki işlemin aynı hafızanın tümünü paylaşmaya başlaması için sayfa tablolarının ayarlandığı bir optimizasyondur ve yalnızca her iki işlem tarafından yazılan sayfalar gerektiğinde kopyalanır.


4
"Hemen hemen her komut için, kabuk yeni bir işlemde çalışacak şekilde bir fork () yapar. Bu komut yerleşikse, çocuğun ayrı bir program yürütmesi () gerekmez." Güzel cevap, ama bu bölüm düzenlenmeli. Gövde çalışırken kabuk çatallanmaz. Bunları doğrudan aktif kabuk işleminde çalıştırır. Bu şekilde inşa edilen cdveya readçalışabilen tek yol budur . Çatalsızlık, yerleşikleri harici komutlardan çok daha hızlı hale getirir.
John Kugelman, Monica

6
  1. Bazı programlar için alt işlem bir şey yapar (bir seri bağlantı noktasından okuma, terminale yazma) ve üst işlem başka bir şey yapmaya devam eder (terminalden okuma, seri bağlantı noktasına yazma). Başka bir klasik örnek, alt işlemin uzun süren hesaplamanın ne olduğunun bir kontrol noktasını oluşturmasıdır. Çoğunlukla, alt işlem, dizin değiştirme, sinyal işleyicilerini sıfırlama veya dosya tanımlayıcıları sıfırlama gibi bazı kurulumlar yapar ve ardından execve()farklı kodlarla kendini kaplamayı çağırır .
  2. fork()ve exec()tüm yürütülebilir dosyalar için geçerlidir - aslında, argc ve argv ile birlikte ve Unix'i diğer işletim sistemlerinden ayıran borular, fork ve exec'dir. fork()BSD'ler vfork(), Plan 9'lar rfork()ve Linux gibi birkaç uzmanlık veya genelleme var clone(), ancak müdür aynı kalıyor.
  3. "yazarken kopyala" kullanıcıya gerçekten görünmez, daha çok bir alt süreç oluşturmayı ve yürütme işlemini optimize etmek için kullanılan bir tekniktir. Çağrı yığını ve yığın (ayrılan bellek malloc(), hatta statik veya global kapsam değişkenleri) "yazmada kopyala" olabilir. Bir alt süreç birfork()çekirdek, alt işlemi, üst işlemle aynı yığın ve yığın bellek sayfalarına sahip olacak şekilde ayarlar. Donanım (bellek yönetim birimi) yığının veya yığının yazıldığını algılarsa, çekirdek yeni bir fiziksel bellek sayfası alır, üst sayfanın sayfasını yeni sayfaya kopyalar ve bu yeni sayfayı alt işlemin yığınında veya yığınında eşler. Çekirdek, sayfa eşlemelerini ayarlamak için alt işlem için yığını ve yığını tamamen kopyalamaktan daha az zaman harcadığından bir optimizasyon oluşturur.

Cevabınız için teşekkürler Bruce. Ama burada söylediğin, kafamın üzerinden geçen birçok şey. Bu şeyler hakkında fazla bilgim yok ... Bahsettiğiniz bu işlevlerin çalışmasını sağlamaya çalışacağım. Çok teşekkür ederim..!!
PriB

4
Alt süreç, üst sürecin tüm özelliklerini (orijinal süreç olan) içeriyorsa, bu alt sürecin ihtiyacı nedir? Orijinal işlem de belleğe yüklenmiş olabilir.

Bu soru, şiddetli bellek kısıtlamaları altında çalışmak zorunda olan ve aynı anda bellek / adres alanında yalnızca bir yürütme işlemi olan en eski Unix uygulamalarına göz atarak çok açık bir şekilde yanıtlanmaktadır.

Çoklu görev, bir işlemin diske dönüştürülmesi ve içinde farklı bir işlemin değiştirilmesi ile gerçekleştirildi.

Şimdi forksistem çağrısı neredeyse aynıydı: bir işlemi diske değiştirdi, ancak başka bir işlemi takas etmek yerine, bellek içi kopyaya başka bir işlem kimliği verdi ve ona geri döndü. execSonuçta bu sürecin başka bir çalıştırılabilir dosyaya karar vermesi için fırsat vardı .

fork+ execböylece yumurtlama üzerinde göze çarpan bir ek yüke maruz kalmadı: işleminizi yine de diske takmanız gerekiyordu ve eski işlem görüntüsünü yine de uygulanabilir bellek konumlarına sahiptiniz.

Artan miktarlarda kullanılabilir bellek ve bellek yönetim birimleri ve çoklu bellek içi süreçlerle, bir çatalın başlangıçtaki ihmal edilebilir maliyeti bazı mimariler için biraz daha sıkıntı haline geldi: böylece vforkdoğdu.


2

Bunu mümkün olduğunca kolay anlaşılır kılmak için bir benzetme kullanacağım. Bir pasta pişirelim!

Tarif kitabını alıyoruz ve okumaya başlıyor ve el yapımı bir kabukla çilek raventli pastaya (favorim) yerleşiyoruz. Neredeyse ihtiyacımız olan her şey mutfakta yumurta ve meyve hariç, ama bir çiftlikte yaşadığımız ve meyve mevsiminde olduğu için bu bir sorun değil. sorun fırın kırılmış ve her şeyi yapmak için yeterli zaman yok. Benden daha fazlasına sahip olmak güzel olmaz mıydı?

çatal () kurtarmaya. Şimdi iki kişi var. pasta kabuğunu yapmaya başlamak için ikimiz de mutfağa gidiyoruz. ayy. Bu yüzden çatalın geri dönüşüne bakıyoruz. Sıfırladığı çok sayıda var, bu yüzden tavuk kümesine ve bahçeye giderken mutfağa giderim. Fırının yanından geçerken tekrar çatallanırım (), dönüş değerine bakın: bummer sıfır aldım. Ben kırık fırına bakarken unu devam ettiriyor. Kapıyı açıyorum, ışık yok, kapıyı kapatıyorum. Bir fırın nasıl tamir edileceğini bilen var mı?

exec () 'i kurtarmaya. Alet kemeri üzerindeki voltmetreye ulaşıyorum, ampul tanısal olabilir, bu yüzden gücü kontrol ederim, Gerçekten atmış kesici, kolay düzeltme. kırıcı paneline yürüdüğümde, bir ravent toplama arkadaşı görüyorum. Yuck! Çikolatalı ipek pastayı tercih ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.