Linux บอกเธรดนอกเหนือจากกระบวนการย่อยได้อย่างไร


21

task_structลินุกซ์ไม่จริงความแตกต่างระหว่างกระบวนการและหัวข้อและการดำเนินการทั้งสองเป็นโครงสร้างข้อมูล

ดังนั้นลินุกซ์ให้อะไรกับบางโปรแกรมเพื่อบอกเธรดของกระบวนการจากกระบวนการลูก? ตัวอย่างเช่นมีวิธีดูรายละเอียดของเธรดทั้งหมดที่กระบวนการมีใน Linux หรือไม่?

ขอบคุณ

คำตอบ:


28

จากtask_structมุมมองเธรดของกระบวนการมีผู้นำกลุ่มเธรดเดียวกัน ( group_leaderในtask_struct ) ในขณะที่กระบวนการย่อยมีผู้นำกลุ่มเธรดที่แตกต่างกัน (กระบวนการย่อยแต่ละกระบวนการ)

ข้อมูลนี้จะถูกสัมผัสกับพื้นที่ของผู้ใช้ผ่านทาง/procระบบไฟล์ คุณสามารถติดตามผู้ปกครองและเด็ก ๆ โดยดูที่ppidฟิลด์ใน/proc/${pid}/statหรือ.../status(สิ่งนี้ให้ pid ของผู้ปกครอง); คุณสามารถติดตามเธรดโดยดูที่tgidฟิลด์ใน.../status(ซึ่งจะให้ id กลุ่มเธรดซึ่งเป็น pid ของหัวหน้ากลุ่มด้วย) เธรดของกระบวนการจะปรากฏให้เห็นใน/proc/${pid}/taskไดเรกทอรี: แต่ละเธรดจะได้รับไดเรกทอรีย่อยของตนเอง (ทุกกระบวนการมีอย่างน้อยหนึ่งเธรด)

ในทางปฏิบัติโปรแกรมที่ต้องการติดตามเธรดของตนเองจะใช้ API ที่จัดทำโดยไลบรารีเธรดที่พวกเขากำลังใช้แทนที่จะใช้ข้อมูลเฉพาะระบบปฏิบัติการ โดยทั่วไปในระบบที่คล้าย Unix ซึ่งหมายถึงการใช้ pthreads


แต่ละกระบวนการในไปป์ไลน์เชลล์ (echo foo | cat) แบ่งปันหัวหน้ากลุ่มเดียวกัน (เชลล์) แต่พวกเขาไม่ใช่เธรดในกระบวนการเดียวกัน
psusi

2
คุณกำลังพูดถึงกลุ่มกระบวนการ ในคำตอบของฉันหัวหน้ากลุ่มมาจากมุมมองเคอร์เนล ในการบัญชีของเคอร์เนลกระบวนการแยกเป็นหัวหน้ากลุ่มของตนเอง คุณสามารถดูได้โดยการเรียกใช้(sleep 120 | sleep 120) &และดู Tgidค่าในแต่ละไฟล์sleepของกระบวนการ /proc/${pid}/status
Stephen Kitt

โอ้แปลก ฉันไม่ทราบว่ามีสิ่งเช่น "หัวหน้ากลุ่มเธรด" และฉันคิดว่าเธรดทั้งหมดในกระบวนการแบบมัลติเธรดนั้นมีค่าเท่ากันและไม่มี "ผู้นำ" ทุกคนสามารถออกและตราบใดที่ยังเหลืออยู่กระบวนการจะไม่ตาย
psusi

5
  1. นี้รันtopคำสั่งที่มีตัวเลือกพิเศษบางอย่าง:

    top -H -b -n 1
    
    • -Hอาร์กิวเมนต์สั่งด้านบนเพื่อแสดงแต่ละหัวข้อของแต่ละบุคคล โดยปกติแล้วจะสรุปหัวข้อทั้งหมดภายใต้กระบวนการหลักของพวกเขา
    • -bอาร์กิวเมนต์ทำให้การทำงานสูงสุดในโหมดแบทช์ - ข้อมูลที่มีการรวมตัวกันแสดงแล้วทิ้งที่ stdout เมื่อเทียบกับการทำงานในโหมดการโต้ตอบและสดชื่นข้อมูลที่แสดง
    • ด้วย-bตัวเลือกผู้ใช้จะต้องบอกจำนวนครั้งสูงสุดที่จะเรียกใช้ซึ่งจะทำกับ-nอาร์กิวเมนต์และอาร์กิวเมนต์สุดท้ายด้วยจำนวนครั้งที่จะเรียกใช้

    ดังนั้นtop -H -b -n 1แนะนำให้ระบบ“ รันบน, แสดงแต่ละเธรด, รันในโหมดแบทช์, และรันครั้งเดียวเท่านั้น”

  2. psคำสั่งรายงานภาพรวมของกระบวนการทำงานในปัจจุบัน

    ps -eLf
    

    -eLfอาร์กิวเมนต์ (สามารถใช้เป็น-e -L -fได้เช่นกัน) แบ่งลงดังนี้

    • eบอกpsให้แสดงกระบวนการทั้งหมดโดยไม่คำนึงถึงว่าใครเป็นเจ้าของหรือสถานะปัจจุบันของพวกเขา - ใช้งาน, นอนหลับ, หยุดชั่วคราว, รอ I / O, ฯลฯ
    • Lบอกpsให้แสดงแต่ละกระทู้
    • fบอกpsเพื่อจัดรูปแบบออกเป็นรายชื่อเต็มรูปแบบและร่วมกับLการโต้แย้ง NLWP (จำนวนกระทู้) และ LWP (ID ด้าย) คอลัมน์จะมีการเพิ่มการส่งออก

1

พิจารณากระบวนการด้วย PID p1

task_structวัตถุของกระบวนการเด็กจะมี PPID (แม่ PID) เป็น p1 และก็ PID และ TGID ชุดเพื่อพูด, P2

task_structวัตถุของด้าย p1 จะมีชุด PID ตามกล่าว p3 แต่ TGID ชุด p1


ดังนั้นคุณกำลังพูดสิ่งเดียวกันกับสตีเฟ่นคิตต์ แต่ชัดเจนน้อยกว่ามาก ป.ล. ทำไมต้องนำ PPID มาอภิปรายถ้าคุณไม่อยากพูดว่า PPID ของเธรดคืออะไร?
สกอตต์

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