ช่องสัญญาณรอคือสถานที่ในเคอร์เนลที่งานกำลังรออยู่ งานต้องรอทรัพยากรซึ่งอาจเป็นข้อมูลหรือเวลาในการประมวลผล ทั้งสองนี้รวมถึงซ็อกเก็ตเครือข่ายฮาร์ดแวร์ไฟล์และอื่น ๆ เนื่องจากส่วนใหญ่เป็นเพียงไฟล์ในระบบที่เหมือน Unix
0
: กระบวนการไม่รอ
poll_schedule_timeout
poll()
เป็น system call 1 ที่ใช้จัดการ I / O select()
มันคล้ายกับ 2
แอปพลิเคชันที่ใช้การปิดกั้น I / O ใช้การเรียกเหล่านี้เพื่อดูว่าพวกเขาสามารถอ่านหรือเขียนไฟล์โดยไม่ต้องปิดกั้น มักจะใช้สำหรับสตรีมอินพุต / เอาต์พุตซึ่งอาจไม่ถูกบล็อก (มิฉะนั้นอาจเป็นเพราะเมาส์ของคุณหยุดเคลื่อนที่)
ช่องสัญญาณที่รอpoll_schedule_timeout
แสดงว่างานกำลังรอ I / O ไม่ว่าจะเป็นฮาร์ดแวร์เช่นคีย์บอร์ดและเมาส์อุปกรณ์เสียงหรือแม้แต่ซ็อกเก็ตเครือข่าย
- ฟังก์ชั่นในเคอร์เนล
<linux/poll.h>
พวกเขาจะถูกกำหนดไว้ใน poll
เป็นการนำมาใช้ครั้งแรกใน System V ซึ่งselect
เทียบเท่ากับ BSD UNIX
futex_wait_queue_me
:
เพื่ออธิบายเรื่องนี้เราต้องดูที่ล็อค การล็อคเป็นสถานะที่บันทึกไว้ในระบบที่ระบุว่างานใช้งานได้กับทรัพยากร ยกตัวอย่างเช่นมีเพียงงานเดียวที่อ่านไฟล์ได้ ภารกิจนี้จะล็อกไฟล์ภารกิจอื่น1ที่พยายามอ่านไฟล์จะรู้ว่าถูกล็อกอยู่และรอให้การล็อกหายไปก่อนที่จะสามารถเข้าถึงได้ สิ่งเดียวกันเกิดขึ้นสำหรับเวลาตัวประมวลผล
Linux รุ่นทันสมัย (บนสถาปัตยกรรมส่วนใหญ่) ใช้การล็อค Futex (ผู้ใช้อย่างรวดเร็วผู้ใช้ mutex) ในเคอร์เนล Mutex การแยกออกจากกันหมายถึงแนวคิดที่ว่าทรัพยากรทั่วไปสามารถเข้าถึงได้โดยงานเดียวเมื่อใดก็ได้ สำหรับสิ่งนี้ตั้งค่าสถานะในระบบ
หากกระบวนการกำลังรอทรัพยากรที่ถูกล็อคสิ่งนี้เรียกว่าBusy Waiting
หรือ "Spinning" หมายถึงความจริงที่ว่ามันพยายามที่จะเข้าถึงมันซ้ำแล้วซ้ำอีกจนกว่าจะสามารถทำได้ มีการกล่าวถึงงานที่ถูกบล็อกเมื่อมันหมุน
การล็อค Futex สามารถคิดได้ว่าเป็นตัวเลขใน userspace ซึ่งสามารถเพิ่มหรือลดขนาดได้ตามภารกิจ (ในกรณีที่ทรัพยากรสามารถเข้าถึงได้โดยหลายงานจำนวนนี้อาจมากกว่าหนึ่ง) นี่คือจำนวนที่แสดงในแผนภาพที่ 4
งานเหล่านี้จัดคิวด้วยตนเองในคิวการรอคิวงานง่าย ๆ ที่ต้องทำงานบางอย่างเมื่อมีเวลาในการประมวลผลงานจะทำงานและจะถูกลบออกจากคิว
futex_wait_queue_me
จัดคิวงาน จากนั้นจะรอสัญญาณหมดเวลาหรือปลุก งานที่อยู่ในช่องรอนี้กำลังรอไม่ได้อยู่ในคิวรอพวกเขากำลังรอที่จะเข้าคิว
- ภารกิจสามารถเป็นกระบวนการ3หรือเธรด2
- เธรดเป็นส่วนย่อยของกระบวนการ กระทู้จำนวนมากสามารถเรียกใช้แบบขนาน
- โปรเซสคือโปรแกรมเต็มรูปแบบซึ่งประกอบด้วยหนึ่งเธรดหรือมากกว่าแม้ว่าโปรแกรมสามารถประกอบด้วยหลายโพรเซสได้เช่นกัน
- โปรดจำไว้ว่านี่คือมุมมองระดับสูงของสิ่งต่าง ๆ โดยไม่พิจารณารายละเอียดการใช้งาน
__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()
วิธีการ วิธีนี้สามารถใช้สำหรับโปรแกรมเข้าสู่โหมดสลีปตามช่วงเวลาที่กำหนดโดยมีความแม่นยำระดับนาโนวินาที
สิ่งเหล่านี้ไม่ใช่ทั้งหมด แต่ฉันไม่ได้สังเกตผู้อื่น แสดงความคิดเห็นหากฉันไม่ได้รับอะไรเลย