จะทราบสาเหตุของกระบวนการที่จะเข้าสู่โหมดสลีปและปลุกมันได้อย่างไร?


19

เมื่อฉันทำ 'บน' ฉันเห็นกระบวนการสคริปต์ของฉันในสถานะ 'S' มีวิธีที่จะรู้หรือไม่สิ่งที่ทำให้กระบวนการ perl นี้อยู่ในสถานะสลีปและวิธีที่จะปลุกมันขึ้นมา? วิธีใด ๆ ในการดีบักเพื่อให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับบรรทัดในสคริปต์ Perl ทำให้มันอยู่ในสถานะ 'S'

คำตอบ:


22

กระบวนการที่อยู่ในSสถานะมักจะอยู่ในการบล็อกการเรียกของระบบเช่นการอ่านหรือการเขียนไปยังไฟล์หรือเครือข่ายหรือรอให้โปรแกรมอื่นที่เรียกว่าเสร็จสิ้น

คุณสามารถใช้strace -p <pid>เพื่อค้นหาการเรียกของระบบที่กำลังเกิดขึ้น มันจะสร้างผลผลิตเช่น

เขียน (1, "foobar" ... , 4096

ซึ่งหมายความว่ากระบวนการกำลังพยายามเขียน 4096 ไบต์เริ่มต้นด้วย "foobar" เพื่อ stdout (fd # 1) แต่สิ่งที่มันถูกเปลี่ยนเส้นทางไปยังไม่ว่างและบัฟเฟอร์เอาต์พุตเต็ม


5

กระบวนการเข้าสู่สถานะสลีปเมื่อพวกเขากำลังรอบางสิ่งซึ่งโดยปกติคือ I / O

กระบวนการของคุณจะอยู่ในSสถานะเมื่อมีการอ่านและอาจเป็นไปได้ว่าการเขียนที่กำลังปิดกั้น สามารถเกิดขึ้นได้ในขณะที่รอเซมาฟอร์หรือการซิงโครไนซ์ดั้งเดิม

คุณไม่สามารถ "ปลุกมัน" - มันจะดำเนินการต่อเมื่อข้อมูล / ทรัพยากรที่กำลังรออยู่เท่านั้น

นี่เป็นเรื่องปกติและคาดหวังและไม่เป็นปัญหา โดยทั่วไป "โปรแกรม" นี้จะทำงานบนบรรทัดคำสั่งโดยไม่มีไฟล์:

while (<>) { print; }

จะใช้เวลาส่วนใหญ่ในสถานะสลีปซึ่งดี - คุณไม่ต้องการให้ CPU เสียขณะที่รอการป้อนข้อมูลจากผู้ใช้

หากคุณคิดว่านี่เป็นปัญหาให้ลองเปลี่ยนวิธีการทำ I / O ของคุณ (อ่านส่วนที่ใหญ่ขึ้นเป็นทวีคูณของขนาดบล็อกของอุปกรณ์พื้นฐาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.