“ ช่องสัญญาณรอ” ของกระบวนการคืออะไร?


36

ในแท็บกระบวนการของการตรวจสอบระบบของ GNOME จะมีคอลัมน์ "ช่องสัญญาณรอ" ไกลโดยค่าที่พบมากที่สุดที่ผมเห็นที่นี่เป็นpoll_schedule_timeoutแต่ฉันยังเห็นค่าอื่น ๆ : 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagramและunix_stream_data_wait

ดังนั้นคอลัมน์ "ช่องที่รอ" หมายความว่าอย่างไร และบางทีคุณค่าเหล่านั้นในนั้นหมายถึงอะไร?

ภาพหน้าจอ

คำตอบ:


42

ช่องสัญญาณรอคือสถานที่ในเคอร์เนลที่งานกำลังรออยู่ งานต้องรอทรัพยากรซึ่งอาจเป็นข้อมูลหรือเวลาในการประมวลผล ทั้งสองนี้รวมถึงซ็อกเก็ตเครือข่ายฮาร์ดแวร์ไฟล์และอื่น ๆ เนื่องจากส่วนใหญ่เป็นเพียงไฟล์ในระบบที่เหมือน Unix

  • 0: กระบวนการไม่รอ

  • poll_schedule_timeout

    poll()เป็น system call 1 ที่ใช้จัดการ I / O select()มันคล้ายกับ 2

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

    ช่องสัญญาณที่รอpoll_schedule_timeoutแสดงว่างานกำลังรอ I / O ไม่ว่าจะเป็นฮาร์ดแวร์เช่นคีย์บอร์ดและเมาส์อุปกรณ์เสียงหรือแม้แต่ซ็อกเก็ตเครือข่าย

    1. ฟังก์ชั่นในเคอร์เนล
    2. <linux/poll.h>พวกเขาจะถูกกำหนดไว้ใน pollเป็นการนำมาใช้ครั้งแรกใน System V ซึ่งselectเทียบเท่ากับ BSD UNIX
  • futex_wait_queue_me:

    เพื่ออธิบายเรื่องนี้เราต้องดูที่ล็อค การล็อคเป็นสถานะที่บันทึกไว้ในระบบที่ระบุว่างานใช้งานได้กับทรัพยากร ยกตัวอย่างเช่นมีเพียงงานเดียวที่อ่านไฟล์ได้ ภารกิจนี้จะล็อกไฟล์ภารกิจอื่น1ที่พยายามอ่านไฟล์จะรู้ว่าถูกล็อกอยู่และรอให้การล็อกหายไปก่อนที่จะสามารถเข้าถึงได้ สิ่งเดียวกันเกิดขึ้นสำหรับเวลาตัวประมวลผล

    Linux รุ่นทันสมัย ​​(บนสถาปัตยกรรมส่วนใหญ่) ใช้การล็อค Futex (ผู้ใช้อย่างรวดเร็วผู้ใช้ mutex) ในเคอร์เนล Mutex การแยกออกจากกันหมายถึงแนวคิดที่ว่าทรัพยากรทั่วไปสามารถเข้าถึงได้โดยงานเดียวเมื่อใดก็ได้ สำหรับสิ่งนี้ตั้งค่าสถานะในระบบ

    หากกระบวนการกำลังรอทรัพยากรที่ถูกล็อคสิ่งนี้เรียกว่าBusy Waiting หรือ "Spinning" หมายถึงความจริงที่ว่ามันพยายามที่จะเข้าถึงมันซ้ำแล้วซ้ำอีกจนกว่าจะสามารถทำได้ มีการกล่าวถึงงานที่ถูกบล็อกเมื่อมันหมุน

    หากคุณสามารถอ่านสิ่งนี้ได้คุณจะต้องแก้ไขข้อผิดพลาดอย่างน้อยหนึ่งข้อในคำตอบนี้: P

    การล็อค Futex สามารถคิดได้ว่าเป็นตัวเลขใน userspace ซึ่งสามารถเพิ่มหรือลดขนาดได้ตามภารกิจ (ในกรณีที่ทรัพยากรสามารถเข้าถึงได้โดยหลายงานจำนวนนี้อาจมากกว่าหนึ่ง) นี่คือจำนวนที่แสดงในแผนภาพที่ 4

    งานเหล่านี้จัดคิวด้วยตนเองในคิวการรอคิวงานง่าย ๆ ที่ต้องทำงานบางอย่างเมื่อมีเวลาในการประมวลผลงานจะทำงานและจะถูกลบออกจากคิว

    futex_wait_queue_meจัดคิวงาน จากนั้นจะรอสัญญาณหมดเวลาหรือปลุก งานที่อยู่ในช่องรอนี้กำลังรอไม่ได้อยู่ในคิวรอพวกเขากำลังรอที่จะเข้าคิว


    1. ภารกิจสามารถเป็นกระบวนการ3หรือเธรด2
    2. เธรดเป็นส่วนย่อยของกระบวนการ กระทู้จำนวนมากสามารถเรียกใช้แบบขนาน
    3. โปรเซสคือโปรแกรมเต็มรูปแบบซึ่งประกอบด้วยหนึ่งเธรดหรือมากกว่าแม้ว่าโปรแกรมสามารถประกอบด้วยหลายโพรเซสได้เช่นกัน
    4. โปรดจำไว้ว่านี่คือมุมมองระดับสูงของสิ่งต่าง ๆ โดยไม่พิจารณารายละเอียดการใช้งาน
  • __skb_recv_datagram

    รอข้อมูลบางอย่างบนซ็อกเก็ตเครือข่ายที่ล็อค

  • sk_wait_data

    รอข้อมูลบางอย่างบนซ็อกเก็ตเครือข่าย

  • do_exit

    นี่เป็นส่วนสุดท้ายของการออกจากกระบวนการ do_exit()โทรschedule()ถัดไปเพื่อกำหนดเวลากระบวนการอื่น เมื่อถูกเรียกว่ากระบวนการที่เป็นdo_exit()ZOMBIE

  • do_wait

    กระบวนการถูกเพิ่มเข้าในคิวรอ schedulers

  • pipe_wait, unix_stream_data_wait

    กระบวนการกำลังรอข้อมูลจากกระบวนการย่อย สิ่งนี้เกิดขึ้นตัวอย่างเช่นเมื่อคุณเรียกใช้รหัสประเภทนี้:

    echo | sleep 10 && echo hallo              # pipe
    

    หรือ

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    กระบวนการกำลังหลับโดยใช้hrtimer_nanosleep()วิธีการ วิธีนี้สามารถใช้สำหรับโปรแกรมเข้าสู่โหมดสลีปตามช่วงเวลาที่กำหนดโดยมีความแม่นยำระดับนาโนวินาที

สิ่งเหล่านี้ไม่ใช่ทั้งหมด แต่ฉันไม่ได้สังเกตผู้อื่น แสดงความคิดเห็นหากฉันไม่ได้รับอะไรเลย


ฉันเจอ sleep_on_page_killable แล้วเหรอ?
Mr Axilus

สาเหตุที่เป็นไปได้มากที่สุดสำหรับ sleep_on_page_killable คือกระบวนการพยายามโหลดหน้าเว็บที่ไม่ได้อยู่ในหน่วยความจำจึงทำให้เกิดข้อผิดพลาดของหน้าและกระบวนการต้องหยุดทำงานจนกว่าจะโหลดหน้าเว็บ หากระบบย่อย I / O มีการโหลดมากเกินไป (อาจเป็นเพราะคุณทำ I / O จำนวนมาก) สิ่งนี้อาจปรากฏขึ้นบ่อยครั้ง
สึนะ

แล้วsignalไงล่ะ ฉันวิ่งเข้าไปในนั้น กระบวนการนี้ตายหรือไม่? ซอมบี้? หรืออะไร? จะเกิดอะไรขึ้นกับกระบวนการ
itsnotmyrealname

11

ค่าช่องสัญญาณที่รอเป็นชื่อของฟังก์ชันเคอร์เนลที่กระบวนการถูกบล็อกในปัจจุบัน

ชื่อมักจะเกี่ยวข้องกับการเรียกของระบบซึ่งจะมีหน้าคู่มือ

  • futex_wait_queue_meเกี่ยวข้องกับfutex มันหมายถึงประเภทของการล็อค mutex (การยกเว้นร่วมกันอย่างรวดเร็ว userspace) ที่ใช้ในการกำหนดเวลากระบวนการจำนวนมากทำงานบนโปรเซสเซอร์เดียว สถานะบ่งชี้ว่ากระบวนการของคุณถูกจัดคิวเพื่อรับการล็อก 2
  • do_waitที่เกี่ยวข้องกับการรอคอย
  • เป็นต้น

หากคุณต้องการข้อมูลรายละเอียดเพิ่มเติมคุณสามารถตรวจสอบแหล่งที่มาของเคอร์เนลได้

หากคุณพิมพ์cat /proc/some_pid/stackเทอร์มินัลคุณจะได้ผลลัพธ์เช่นนั้น:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

และในบรรทัดแรกคุณจะได้รับสิ่งที่ปรากฏบนจอภาพระบบ เท่าที่ฉันรู้poll_schedule_timeoutระบุว่ากระบวนการของคุณกำลังรออะไรอยู่

มันเกี่ยวข้องกับตรงกัน I / Oและหน่วยเลือกตั้ง

ที่มา: 1. กระบวนการรอแชนเนล (WCHAN) และการเตือน? - 2. คำตอบ AskUbuntu


บอกกล่าวอีกครั้งว่า : P
Stefano Palazzo

ดูเหมือนว่าคุณสังเกตเห็นว่าฉันได้นำคำตอบของคุณกลับมาใช้ใหม่เพื่อปรับปรุงหนึ่ง ;-) คุณต้องการมีการระบุแหล่งที่มาประเภทใด
Maxime R.

2
ความคิดเห็นของคุณมีมากเกินพอที่จะทำให้ฉันมีความสุข :) หากคุณต้องการเรียนรู้เกี่ยวกับการทำงานของที่มาแสดงว่ามีโพสต์บล็อกที่ดีในเรื่อง ไม่ต้องกังวลเกี่ยวกับเรื่องนี้มากเกินไปฉันต้องการให้ผู้คนกลับมาใช้งานของฉันให้มากที่สุด
Stefano Palazzo

1
ฉันเพิ่งเขียนคำถามเกี่ยวกับหัวข้อนี้ในเมตาดาต้า (เคยอ่านโพสต์บล็อกแล้ว)
Maxime R.

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