Windows'un bir işlemi tamamen takastan çıkarması için ipucu vermek mümkün mü


13

Windows sanal bellek yöneticisine belirli bir işlemi takastan çıkarmak için ipucu vermek mümkün müdür?

Sık sık kendimi bulduğum durum normalde tüm normal programlar için RAM'imin yaklaşık% 50'sini kullanıyor, bunlardan biri, gömülü bir hedef için bir IDE ve ilişkili hata ayıklayıcı.

Sonra bir bellek aç sürecini çalışır durumda bırakıyorum - örneğin, wireshark veya bir hafta sonu boyunca veri biriktiren bir şey, her şey değiştirilir - gerektiği gibi. Büyük süreç bittikten sonra çoğu süreç takasta bırakılır.

Daha sonra, ara sıra, muhtemelen IDE ve donanım hata ayıklayıcısı arasındaki iletişimde zamanlama sorunları nedeniyle, hata ayıklayıcı ile ilgili sorunlara neden olmak için işlemi geri almak için duraklar. Dolayısıyla, hedef cihazın kontrolü, IDE'deki hata ayıklama verilerini takastan çıkarmaya yetecek denemeler yapılıncaya kadar düzensiz olabilir.


Bu çok faydalı olur! Kullanıcıların bakış açısından, her tıklama veya kullanıcı işleminden sonra takas işleminin beklenmesi can sıkıcıdır. Söylemek çok daha iyi olur: "bu süreci değiştir!" , bir kahve alın ve duyarlı bir sisteme dönün!
Tomas

Windows'un takas işleminin özelliklerini bilmiyorum ama aradığınız bir şey bu mu? Yorumlarda çalışan bir ikili örnek olmalıdır.
Rik

1
Bir zamanlar benzer bir sorum vardı ve Stack Overflow'da aldığım cevaplara dayanan bir program yazdım.
Kerrek SB

@Kerrek, kodunuzu MinGW altında derlemeyi denedim ve her okumada hatalar aldım "0x161000'den bir bayt okunamadı, hata 299 (0 bayt okundu)." Ben sadece iş yerinde Windows var beri sorun benim derleme olabilir böylece eklediğiniz rastgele ikili çalıştırmak için yeterince cesur değildi.
Greg

1
@KerrekSB, küçük bir sorun gibi görünüyor. Belki eşlenmemiş bellek alanına dokunuyorsunuz? Her neyse, cevabınızın ödülünü hak ettiğini düşünüyorum :) PS: unwap, HDD hızına kıyasla olabileceğinden çok daha yavaş görünüyor. Darboğazın başka bir yerde olduğu anlaşılıyor, ama nerede?
Tomas

Yanıtlar:


1

KerrekSB bu amaç için özel bir araç geliştirdi:

/programming//a/2940209/684229

GiTHUB'da ikili dosyalarla birlikte bulunur: https://github.com/louisdx/unpage

Çalışma sırasında, "0x .... 000 bir bayt okunamadı, hata 299 (0 bayt okuma)" birçok hata alırsınız, ancak sorun değil, araç harika çalışıyor.


"ama bu bir sorun" mu? Bunun bir sorun olduğunu düşünmüyorum.
Kerrek SB

Alıntı: " tüm uygulamaları fiziksel belleğe geri almaya çalışan araç ". Posterin "bellek aç süreci" ile bu işe yaramayabilir.
harrymc

@harrymc sorudan alıntı: After the big process is finished, most processes are left in swap.. Muhtemelen "bellek aç sürecini" zaten bitirdi.
Rik

@KerrekSB tabii ki bu bir yazım hatasıydı. Teşekkürler :-)
Tomas

@Tomas buldum bu . Çok sınırlı c ++ bilgim ile, her başarısız erişim için sayfanın gerçekten PAGE_GUARD biti tarafından korunduğunu doğruladım. -Line'dan if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }hemen önce kullandım ReadProcessMemory. PAGE_GUARD 256 ve başarısız sayfalarla 260 aldım. Böylece hatalardan kurtulmak mümkündür. Biraz c ++ ve Sayfalama bilgisine sahip birisinin PAGE_GUARD bitinde okuması gerekir.
Rik

1

Sen kullanabilirsiniz Kement Süreci bir işlemi bir vermek Bellek sayfa önceliği :

Windows Vista'dan başlayarak, her bellek sayfasının 0 ila 7 arasında bir önceliği vardır. Bekleme Listesi, her biri farklı bir önceliğe sahip sayfaları işleyen sekiz listeye ayrılmıştır. Bellek Yöneticisi Bekleme Listesinden bir sayfa almak istediğinde, önce düşük öncelikli listelerden sayfa alır. "

Process Lasso, işlemler için kalıcı bellek önceliklerinin ayarlanmasına izin vererek bellek önceliklerinin yönetilmesine yardımcı olabilir, böylece sanal bellek sayfaları her çalıştırıldığında belirli bir önceliğe ayarlanır.

Process Lasso'nun iki sürümü vardır: ücretsiz ve ticari (deneme sürümü ile 18,95 $).


Korkarım ki tamamen farklı bir soruya cevap veriyorsunuz. İşlem sürecine bellek önceliği vermek farklı bir görevdir, muhtemelen OP bağlamında işe yaramaz ve ben taslağı çizdim: zaten takasta olan ve onu çıkarmak istediğiniz bir işleminiz olduğunda. Takas yapmasını önlemek istemezsiniz.
Tomas

@Tomas: Bu benim anlayışım değil. Talep, belirli bir sürecin değiştirilmesini önlemektir. İşlemin kendisi, sayfalarını belleğe kilitleyecek şekilde programlanmamışsa, bir sonraki en iyi çözüm, değiştirilme olasılığını azaltmak için en yüksek bellek önceliğini vermektir.
harrymc

3
@harrymc, OP, bellek domuzu çalıştığında "her şeyin olması gerektiği gibi değiştirildiğini" söylüyor, bu yüzden OP'nin istediği bu. Sadece Pazartesi sabahı, önemli süreçlerin çalışma setlerinin zaman içinde sayfa hatasıyla sık sık ve sıkıcı değil, bir kerede getirilmesini istiyor.
mgkrebbs

@mgkrebbs: Bu, imkansız olduğuna inandığım soruna farklı bir çözüm. Benim çözümüm, IDE asla değiştirilmiyorsa, tekrar takas etmeye gerek yoktur. "Bellek aç süreci" sadece birkaç megabayt daha az RAM'e sahip olacak ve bu da performansını etkilemeyecek.
harrymc
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.