Bu yüzden patronumla bellek yönetimi hakkında biraz tartışıyorum.
Bana bir süreci öldürmenin, hafızayı yeniden yerleştirmesine izin vermediği söylendi. Hala böyle mi, yoksa yıllar önce mi?
Burada hem Windows hem de OS X'den bahsediyoruz.
Bu yüzden patronumla bellek yönetimi hakkında biraz tartışıyorum.
Bana bir süreci öldürmenin, hafızayı yeniden yerleştirmesine izin vermediği söylendi. Hala böyle mi, yoksa yıllar önce mi?
Burada hem Windows hem de OS X'den bahsediyoruz.
Yanıtlar:
Bu şeyleri öğrendiğimden beri uzun zaman geçti, ama işte gidiyor.
Bir işletim sistemi bir işlemi başlattığında, sanal bellek tablosundan bu sayfaları atar. İşletim sistemi, sanal bellek tablosundan gerçek belleğe veya diskteki takas alanına bir harita sağlamaktan sorumludur. Bir işlem öldürüldüğünde, işletim sistemi yalnızca CPU döngüleri vermekten vazgeçmez. Birkaç temizleme öğesi yapar, bunlardan biri tüm bellek sayfalarını ücretsiz olarak işaretlemektir. Bu, diğer uygulamalar tarafından tekrar kullanılmalarını sağlar. İşletim sistemi muhtemelen, işlemin sahip olduğu kaynak tutamaçlarını da temizler, dosyaları otomatik olarak kapatır, ağ bağlantıları, işlemden işleme boruları vb. Bu süreç tamamen işletim sisteminin kontrolü altındadır ve süreç nasıl ölürse düşülsün bu adımlar atılacaktır.
Tüm bunların işletim sistemi süreçleri için geçerli olduğunu unutmayın. Bir çeşit sanal makineniz varsa ve aynı anda birden fazla sanal işlem çalıştırıyorsa, VM bunlara nasıl tahsis edileceği ve bunlara nasıl ayrılacağına karar vermekten sorumludur. Ancak işletim sisteminden hala bir süreç gibi görünüyor. Bu nedenle, bu durumda, birden fazla işlem çalıştıran bir VM'niz varsa ve bunlardan birini VM içinde öldürürseniz, muhtemelen ana bilgisayar işletim sisteminde belleği hemen geri alamazsınız. Ama onu sanal makineye geri alacaksınız. Bununla birlikte, işletim sistemi içinde VM'yi öldürürseniz, işletim sistemi VM'yi öldürür (VM'nin süreçlerini dolaylı olarak öldürür) ve tüm belleği geri kazanır (bir çöp toplayıcıdan geçmesi gerekmez, ücretsiz) , silme veya başka bir şey).
Çok spekülatif:
.NET, aynı VM'de birden fazla .NET uygulaması olan bir sanal makine olarak çalışıyorsa, .NET, GCd'yi çalışana kadar henüz GCd olmayan belleğe tutunabilir ve Windows .NET'in gerçekte olduğundan daha fazlasını kullanmak. (Ve MS gerçekten kaygansa, Windows daha sonra sıkı bellek durumlarında .NET'e GC'ye söyleyebilir, ancak bunun neredeyse hiçbir anlamı yoktur, çünkü disk takas alanı bunun içindir.)
.NET bu şekilde çalışsaydı, işletim sistemi hala işletim sistemi amaçları için tek bir süreç olarak düşünür, bu da neyi tutup neyi atmak gerektiğine karar verme sorumluluğunu üstlenir ve normalde Windows'un bir sürece ihtiyacı olduğunu söylemek problem değildir bellek ayırmaya başlamak için. Bu noktada, MS'in .NET için özel bir API oluşturması düşünülebilir, böylece .NET süreçleri Windows işlemleri gibi görünmez, ancak bunlar olmuyor, bu yüzden insanlar işlem belleğinin serbest bırakılmadığını düşünebilirler. Bu gerçek; sadece yanlış sürece bakıyorsunuz.
Aslında bu şekilde çalıştığını söylemek için .NET hakkında yeterli bilmiyorum; Java VM kesinlikle istemiyor.
Spekülasyon sonu.
DÜZENLEME: Bellek yönetimi için kötü bir işlemi öldürmek söz konusu olduğunda, aynı havuzdan ayırmak için birden çok işlem gerektiren (yani gerçek işlemlerden daha çok iş parçacığı gibidir) ve işlemin ardından belleğin serbest bırakılmaması gerekir öldürdü. Bu neredeyse işbirlikçi bir çoklu görev sistemi gerektirecektir, çünkü sanal bellek ve önleyici çoklu görev genellikle bildiklerime göre birlikte uygulandı (VM, süreçleri birbirinden izole etmeyi ve birbirlerinin belleğinde durmalarını engellemeyi mümkün kılıyor). Sanal belleğe sahip olmak, işletim sistemi düzeyinde bir işlemden sonra temizlemeyi önemsiz hale getirir; tüm sayfaları işlem havuzundan boş havuza taşıyabilirsiniz.
Benim deneyimimde sorun yok, öldür.
Örnek olarak, 3 GB'ı bir oyun tarafından kullanılan 4 GB RAM'iniz varsa ve oyun sürecini öldürürseniz, oyunu sorunsuz bir şekilde yeniden başlatabilirsiniz ve tekrar işlemde 3 GB RAM olacaktır.
Soru etiketlerinde (Windows ve OS X) listelenen işletim sistemleri , her işlemin kendi adres alanı verildiği sanal belleği uygular ve daha sonra işletim sistemi tarafından fiziksel belleğe eşlenir. Bu eşleme tabloları, bir işlem sonlandırıldığında bellek ayırmalarını temizlemek için kullanılır, böylece bellek tamamen boşaltılır. Fiziksel sayfalar birden çok işlem arasında paylaşılabilir, bu durumda daha fazla kullanıcı olmadığında serbest bırakılırlar.
Tipik olarak, dosya tanıtıcıları gibi diğer kaynaklar , işlemin kaynak üzerinde bir tanıtıcı aldığı ve bunu iyi tanımlanmış erişim işlevleri aracılığıyla manipüle ettiği yetenekler biçimindeki işlemlere verilir . İşletim sistemi, işlev sağlayan sağ değerden çekirdek içi nesneye bir tablo eşlemesi tutar; yine, bu tablo bir işlem sonlandırıldığında temizleme için kullanılabilir.
Onları oluşturan süreçte hayatta kalan özel kaynaklar vardır, örneğin, süreçler arası iletişimde kullanılabilen kalıcı adlandırılmış paylaşılan bellek ayırmaları oluşturmak mümkündür. Bunlar nadiren kullanılır, çünkü işletim sistemi hala gerekli olup olmadığını belirleyemez.
Diğer işletim sistemlerinde bazen net bir işlem ayrımı yoktur; bu, bireysel uygulamalara temizleme yükünü yükler.
Bir işlemi zorla kapatmak, temizleme şansı vermeden işlemi sonlandıracaktır; işletim sisteminin tüm kaynakların tam bir listesi varsa, bunun herhangi bir olumsuz etkisi yoktur.