Bir sürecin uyku durumuna ve uyanma nedenini nasıl öğrenebilirim?


19

'Top' yaptığımda, perl script sürecimi 'S' durumunda görüyorum. Bilmenin bir yolu var mı, bu perl sürecini uyku durumuna sokmak ve onu uyandırmak için ne yapıyor? Perl betiğinde satırlara daha fazla bilgi vermek için hata ayıklamanın herhangi bir yolu 'S' durumunda.

Yanıtlar:


22

Durumdaki bir işlem Sgenellikle bir dosyaya veya ağa okuma veya yazma veya çağrılan başka bir programın bitmesini bekleme gibi bir engelleme sistem çağrısındadır.

Şu strace -p <pid>anda hangi sistem çağrısının yapıldığını bulmak için kullanabilirsiniz . Gibi çıktılar üretecek

yazma (1, "foobar" ..., 4096

bu, işlemin "foobar" ile başlayan stdout'a (fd # 1) 4096 bayt yazmaya çalıştığı, ancak yönlendirildiği her şey meşgul ve çıkış arabelleği dolu olduğu anlamına gelir.


5

Süreçler, genellikle G / Ç olmak üzere bir şey beklerken uyku durumlarına gider.

Sİşleminiz, muhtemelen engelleme yapan okumalar ve yazmalar yaparken geçerli olacaktır . Semaforlarda veya diğer senkronizasyon ilkelerinde beklerken de olabilir.

"Uyandıramazsınız" - yalnızca beklediği veri / kaynak kullanılabilir olduğunda devam eder.

Bu normal ve beklenen bir durumdur ve genellikle bir problem değildir. Genellikle, bu "program" komut satırında dosya olmadan çalışır:

while (<>) { print; }

zamanının çoğunu uyku durumunda geçirir, bu da iyidir - kullanıcı girdisini beklerken CPU'yu boşa harcamasını istemezsiniz.

Bunun bir sorun olduğunu düşünüyorsanız , G / Ç'nizi yapma şeklinizi değiştirmeyi deneyin (daha büyük parçaları okumak, altta yatan cihazın blok boyutunun güzel katlarında, bellek eşlenmiş G / Ç, vb.).

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.