กระบวนการติดอยู่: มันเป็นสัญญาณที่ไม่ดี?


23

บางครั้งกระบวนการบางอย่างอยู่ในสถานะติดขัด ตัวอย่างเช่น:

PID    COMMAND          %CPU TIME     #TH  #WQ  #POR #MREGS RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP  PPID  STATE
99357  plugin-container 0.1  12:07.07 10   1    224  2097   40M    84M    66M    82M    2757M  91688 99346 sleeping
99346  firefox          0.4  48:54.20 29   1    265  16250  467M   172M   799M   538M   4210M  91688 1     sleeping 
88029- Aquamacs       1.2  31:24.12 4    3    126  268    19M    49M    32M    36M    777M   88029 152   stuck

มันเป็นส่วนหนึ่งของวงจรชีวิตปกติของกระบวนการหรือไม่? ทำไมกระบวนการนี้โดยเฉพาะ

มันหมายความว่าอะไรกันแน่?

คำตอบ:


38

ไม่จำเป็นต้องเป็นสัญญาณที่ไม่ดี แต่ให้ฉันตอบคำถามสุดท้ายของคุณก่อน:

มันหมายความว่าอะไรกันแน่?

ในtopซอร์สโค้ด (จากhttp://www.opensource.apple.com/release/mac-os-x-1082/ ) สถานะติดจะถูกอ้างถึงเป็นตัวระบุLIBTOP_STATE_STUCK(จากlibtop.c):

libtop_state_str(uint32_t state)
{
        const char *strings[] = {
                "zombie",
#define LIBTOP_STATE_ZOMBIE     0
                "running",
#define LIBTOP_STATE_RUN        1
                "stuck",
#define LIBTOP_STATE_STUCK      2
                "sleeping",
#define LIBTOP_STATE_SLEEP      3
                "idle",
#define LIBTOP_STATE_IDLE       4
                "stopped",
#define LIBTOP_STATE_STOP       5
                "halted",
#define LIBTOP_STATE_HALT       6
                "unknown"
#define LIBTOP_STATE_UNKNOWN    7
        };
(...)
}

ต่อมาในไฟล์เดียวกันLIBTOP_STATE_STUCKถูกแมปกับสถานะเคอร์เนลTH_STATE_UNINTERRUPTIBLE:

/* Translate a mach state to a state in the state breakdown array. */
static int
libtop_p_mach_state_order(int state, long sleeptime)
{
        switch (state) {
                case TH_STATE_RUNNING:
                        return LIBTOP_STATE_RUN;
                case TH_STATE_UNINTERRUPTIBLE:
                        return LIBTOP_STATE_STUCK;
(...)
}

ดังนั้นกระบวนการที่อยู่ในสถานะติดหมายความว่ากระบวนการ / เธรดอยู่ในสถานะรอเครื่องสำรองซึ่งเป็นวิธีที่TH_STATE_UNINTERRUPTIBLEกำหนดไว้ในโครงสร้างเคอร์เนลthread_basic_info(ดูhttp://web.mit.edu/darwin/src/modules/xnu/osfmk/) man / thread_basic_info.html ):

struct thread_basic_info
{
(...)
       integer_t        run_state;
(...)
};

อยู่ที่ไหนrun_state:

run_state: สถานะการทำงานของเธรด ค่าที่เป็นไปได้คือ:

( ... )

  • TH_STATE_UNINTERRUPTIBLE: เธรดอยู่ในสถานะรอไม่สามารถอินเตอร์รัปต์ได้

( ... )

ปัญหานี้มักเกิดจากกระบวนการที่รอ I / O นั่นคือกระบวนการได้ขอให้อ่านหรือเขียนไปยัง / จากดิสก์หรือเครือข่ายและรอให้ระบบโทรกลับ (ดูที่http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_sleepหรือhttp://www.novell.com/support/kb/doc.php?id=7002725สำหรับข้อมูลเพิ่มเติม)

(เมื่อไม่ได้ใช้ตัวเลือก BSD เนื่องจากโดยปกติจะเป็นกรณีใน Linux psจะแสดงสถานะสลีปแบบไม่หยุดชะงักเป็นสถานะD )

มันเป็นส่วนหนึ่งของวงจรชีวิตปกติของกระบวนการหรือไม่?

ใช่แล้ว. สิ่งที่ไม่ปกติคือกระบวนการอยู่ในสถานะนี้เป็นเวลานาน นั่นเป็นสัญญาณที่ไม่ดี

ทำไมกระบวนการนี้โดยเฉพาะ

ยากที่จะพูด มันมักจะเกิดจากคอขวดของ I / O ที่มีกิจกรรมบนดิสก์หนักหรือการเชื่อมต่อที่ลดลงเมื่อใช้ระบบไฟล์ของเครือข่าย

(นี่เป็นคำถามที่เกี่ยวข้องใน Ask Different: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity-in-activity/ ม .)


1
ฉันจะทราบได้อย่างไรว่ากระบวนการใดที่ติดอยู่อย่างแน่นอน?
mareoraft

3
@mareoraft ใน OS X, คนที่มีรหัสของรัฐ 'U' ในการส่งออกของหรือps axug ps -eo user,pid,stat,argsใน Linux หมายถึงรหัสสถานะ 'D' ที่มีpsคำสั่งเหมือนกัน ดูคำอธิบายของคำสำคัญสถานะ (OS X) หรือส่วนประมวลผลรหัสสถานะ (Linux) ในman psสำหรับข้อมูลเพิ่มเติม หรือใน OS X คุณสามารถเรียกใช้topและค้นหากระบวนการที่ทำเครื่องหมายstuckในคอลัมน์ STATE
jaume
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.