Diyelim ki kabuğuma cd yazarsam. O anda cd bellekten yüklenmiş mi? Sezgim, bu yerleşik komutların çekirdek yüklendikten sonra sistem belleğine önceden yüklenmesidir, ancak birisi yalnızca komutu gerçekten çağırdığımda yüklendiğinde ısrar etti ...
Geniş anlamda diğer cevaplar doğrudur - yerleşikler kabukla yüklenir, çağrıldığında stand-alonlar yüklenir. Ancak, çok cesur bir gelincik-y "birisi" bu kadar basit olmadığını ısrar edebilir.
Bu tartışma, işletim sisteminin nasıl çalıştığı ve farklı işletim sistemlerinin farklı şekillerde nasıl çalıştığıyla ilgilidir, ancak genel olarak aşağıdakilerin muhtemelen tüm çağdaş * nixes için doğru olduğunu düşünüyorum.
İlk olarak, "belleğe yüklendi" belirsiz bir ifadedir; gerçekten bahsettiğimiz şey sanal adres alanının belleğe eşlenmesi . "Sanal adres alanı" belleğe yerleştirilmesi gerekebilecek şeyler anlamına gelir, ancak aslında başlangıçta değildir: çoğunlukla belleğe yüklenen şey haritanın kendisidir - ve harita bölge değildir. "Bölge" aslında, yürütülebilir diskte (ya da önbellek olarak) ve olacağını, bunun büyük olasılıkla olduğu değil sizi bir yürütülebilir çağırmak belleğe yüklenir.
Ayrıca, "bölge" nin çoğu diğer bölgelere (paylaşılan kütüphaneler) yapılan göndermelerdir ve yine, sadece sevk edildikleri için gerçekten de yüklendikleri anlamına gelmez. Onlar gerçekten kullanılıncaya kadar yüklenmezler ve daha sonra sadece "kullanım" ın başarılı olması için yüklenmeleri gereken parçaları.
Örneğin, top
linux'da bir bash
örneğe gönderme yapan bir çıktı snippet'i :
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
113 MB VIRT, RAM'de eşlenen sanal adres alanıdır . Ancak RES, işlem tarafından kullanılan gerçek RAM miktarıdır - sadece 3,7 kB. Ve bazıları, yukarıda belirtilen paylaşılan bölgenin bir parçası - 1.8 kB SHR. Ama benim /bin/bash
diskim 930 kB, ve (paylaşılan bir lib) bağlanan temel libc tekrar iki kat daha büyük.
Şu kabuk hiçbir şey yapmıyor. Diyelim ki, daha önce kabuğun geri kalanıyla birlikte zaten "belleğe yüklendi" dediğimiz yerleşik bir komutu çağırıyorum. Çekirdek, haritadaki bir noktadan başlayarak dahil edilen kodu çalıştırır ve gerçekten yüklenmemiş bir kod referansına ulaştığında, daha rahat olmasına rağmen - diskteki yürütülebilir bir görüntüden - yükler yani, çalıştırılabilir dosya (kabuk, tek başına bir araç veya paylaşılan bir kütüphane olsun) zaten "belleğe yüklenmiş".
Buna talep çağrısı denir .