กระบวนการ CPU ที่ไม่ทำงานทำอะไร


73

ดูที่แหล่งที่มาของstraceฉันพบการใช้ธงโคลนCLONE_IDLETASKซึ่งอธิบายไว้ที่นั่น:

#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */

หลังจากมองลึกลงไปฉันพบว่าแม้ว่าแฟล็กนั้นจะไม่ครอบคลุมในman cloneนั้นจะถูกใช้โดยเคอร์เนลในระหว่างกระบวนการบูตเพื่อสร้างกระบวนการว่าง (ซึ่งทั้งหมดควรมี PID 0) สำหรับแต่ละ CPU บนเครื่อง เช่นเครื่องที่มี 8 CPUs จะมีอย่างน้อย 7 (ดูคำถามด้านล่าง) กระบวนการดังกล่าว "กำลังทำงาน" (เครื่องหมายคำพูด)

ตอนนี้สิ่งนี้ทำให้ฉันมีคำถามสองสามข้อเกี่ยวกับกระบวนการ "ว่าง" ที่ทำจริง ๆ ข้อสันนิษฐานของฉันคือมันประมวลผลการดำเนินการ NOP อย่างต่อเนื่องจนกว่ากรอบเวลาจะสิ้นสุดลงและเคอร์เนลจะกำหนดกระบวนการจริงให้เรียกใช้หรือกำหนดกระบวนการว่างอีกครั้ง (หากไม่ได้ใช้งาน CPU) กระนั้นนั่นก็เป็นการคาดเดาที่สมบูรณ์ ดังนั้น:

  1. บนเครื่องที่มี 8 ซีพียู 7 กระบวนการที่ไม่ได้ใช้งานจะถูกสร้างขึ้นหรือไม่? (และ CPU หนึ่งตัวจะถูกเก็บไว้โดยเคอร์เนลเองในขณะที่ไม่มีการทำงานของ userspace?)

  2. กระบวนการที่ไม่ได้ใช้งานเป็นเพียงแค่กระแสการดำเนินการ NOP ที่ไม่สิ้นสุดจริงๆ (หรือลูปที่ทำเช่นเดียวกัน)

  3. การใช้งาน CPU (พูดuptime) คำนวณโดยเพียงแค่ว่ากระบวนการว่างบน CPU นานแค่ไหนและไม่ได้อยู่ในช่วงระยะเวลาหนึ่งหรือไม่


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


17
ฉันต้องต่อต้านสิ่งล่อใจเพียงแค่เขียน "ไม่มีอะไรเลย" เมื่อฉันเห็นชื่อ
Vality

4
CPU ที่ทันสมัยส่วนใหญ่จะลดอัตรานาฬิกาและการใช้พลังงานแบบไดนามิกเมื่อไม่ทำงานหรือภายใต้ภาระต่ำ ( การปรับความถี่แบบไดนามิกเช่นSpeedStepสำหรับ CPU ของ Intel) หากคุณโอเวอร์คล็อกซีพียูปกติแล้วมันจะปิดการใช้งานลักษณะการทำงานนี้ทำให้ CPU เพื่อรักษาอัตรานาฬิกาสูงสุดแม้ในขณะที่ไม่ทำงาน
แน็ต

2
โปรดดูเพิ่มเติมที่ "ACPI power state": มีหลายวิธีที่โปรเซสเซอร์สามารถหยุดการประมวลผลคำสั่งได้ แต่ยังคงสามารถปลุกได้
pjc50

คำตอบ:


85

งานไม่ได้ใช้งานใช้สำหรับบัญชีกระบวนการและยังลดการใช้พลังงาน ใน Linux งานว่างหนึ่งงานจะถูกสร้างขึ้นสำหรับตัวประมวลผลทุกตัวและถูกล็อกไว้กับตัวประมวลผลนั้น เมื่อใดก็ตามที่ไม่มีกระบวนการอื่นให้ทำงานบน CPU นั้นงานว่างจะถูกกำหนดไว้ เวลาที่ใช้ในงานที่ไม่ได้ใช้งานปรากฏเป็นเวลา“ว่าง” topในเครื่องมือเช่น (การคำนวณสถานะการออนไลน์แตกต่างกัน)

ดูเหมือนว่ายูนิกซ์จะมีวงรอบที่ไม่ได้ใช้งานอยู่เสมอ (แต่ไม่จำเป็นต้องเป็นงานว่างจริงดูคำตอบของ Gilles ) และแม้แต่ใน V1 ก็ใช้WAITคำสั่งที่หยุดโปรเซสเซอร์จนกว่าจะเกิดการขัดจังหวะ (มันรอ " ขัดจังหวะ”) ระบบปฏิบัติการอื่น ๆ บางระบบใช้ลูปไม่ว่าง, DOS, OS / 2และ Windows รุ่นแรก ๆ โดยเฉพาะ เป็นเวลานานแล้วที่ซีพียูใช้คำสั่ง“ รอ” แบบนี้เพื่อลดการใช้พลังงานและการผลิตความร้อน คุณสามารถเห็นการใช้งานที่หลากหลายของงานที่ไม่ได้ทำงานตัวอย่างเช่นในarch/x86/kernel/process.cเคอร์เนล Linux: งานพื้นฐานเพียงแค่เรียกHLTซึ่งจะหยุดโปรเซสเซอร์จนกว่าจะเกิดการขัดจังหวะ (และเปิดใช้งานโหมดประหยัดพลังงาน C1) การใช้งานอื่น ๆ จะจัดการข้อบกพร่องหรือความไร้ประสิทธิภาพต่าง ๆ ( เช่นใช้MWAITแทนHLTซีพียูบางตัว)

ทั้งหมดนี้แยกออกจากสถานะว่างในกระบวนการเมื่อพวกเขารอเหตุการณ์ (I / O ฯลฯ )


3
เฮ้ฉันเห็นแล้วขอบคุณ play_dead()เป็นชื่อช่วยในการจำที่ดีมากสำหรับการใช้งาน HALT จะไม่มีความเสี่ยงในการส่ง HALT ไปยัง CPU ทุกเครื่องแล้วจึงหยุดทำงานหรือไม่ (คือถึงสถานการณ์ที่หยุดทุก CPU จะเป็นข้อผิดพลาดใน kernel ถูกต้องหรือไม่)
grochmal

30
CPU ตื่นจาก HALT ผ่านการขัดจังหวะ
Johan Myréen

1
@ JohanMyréen - เยี่ยมมากมันสมเหตุสมผลแล้ว ในกรณีเช่นนี้แม้ IRQ จะถูกขัดจังหวะจากอุปกรณ์อินพุต ขอบคุณ
grochmal

15
หรือน่าเชื่อถือมากกว่านั้นตัวจับเวลาจะขัดจังหวะ ... (การจัดการที่ไร้ขีด จำกัด เป็นอีกหนึ่งกาต้มน้ำของปลา)
สตีเฟ่น Kitt

3
@EJP แน่นอนมันเป็นคำสั่งที่ใช้บ่อยแม้ว่ามันจะมีชื่อแตกต่างกันในสถาปัตยกรรมที่แตกต่างกัน
user253751

50

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

ตัวกำหนดตารางเวลาของ Linux ไม่มีรหัสพิเศษสำหรับกรณีที่ไม่มีอะไรทำ แต่จะเข้ารหัสกรณีที่ไม่มีสิ่งที่ต้องทำเป็นกระบวนการพิเศษซึ่งเป็นกระบวนการว่าง กระบวนการว่างจะได้รับการกำหนดเวลาเฉพาะเมื่อไม่มีกระบวนการอื่นที่สามารถกำหนดตารางเวลาได้ (จะมีลำดับความสำคัญต่ำอย่างมีประสิทธิภาพ) กระบวนการว่างในความเป็นจริงเป็นส่วนหนึ่งของเคอร์เนล: มันเป็นเคอร์เนลเธรดเช่นเธรดที่ดำเนินการรหัสในเคอร์เนลมากกว่ารหัสในกระบวนการ (แม่นยำยิ่งขึ้นมีเธรดหนึ่งเธรดสำหรับแต่ละ CPU) เมื่อกระบวนการไม่ได้ทำงานจะดำเนินการตามขั้นตอนการรอการขัดจังหวะ

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

nothing:
    goto nothing

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

ในทางปฏิบัติซีพียูสมัยใหม่เช่น Intel / AMD และ ARM มีการตั้งค่าการจัดการพลังงานที่ซับซ้อนมากมาย ระบบปฏิบัติการสามารถประมาณระยะเวลาที่โปรเซสเซอร์จะอยู่ในโหมดว่างและจะเลือกโหมดพลังงานต่ำที่แตกต่างกันขึ้นอยู่กับสิ่งนี้ โหมดมีการประนีประนอมระหว่างการใช้พลังงานในขณะที่ไม่ได้ใช้งานและเวลาที่ใช้ในการเข้าและออกจากโหมดไม่ได้ใช้งาน ในโปรเซสเซอร์บางตัวระบบปฏิบัติการยังสามารถลดอัตรานาฬิกาของโปรเซสเซอร์เมื่อพบว่ากระบวนการไม่ใช้เวลา CPU มากนัก


5
โปรดทราบว่าแม้ซีพียูพื้นฐานแบบฝังตัวที่สุดเช่นไมโครคอนโทรลเลอร์ที่ใช้ AVR จะมีคำสั่ง WFI (Wait For Interrupt) แม้ว่าคำสั่งนั้นอาจเทียบเท่ากับ NOP ขึ้นอยู่กับรุ่นที่แน่นอน
Jonas Schäfer

@ JonasWielicki ฉันคิดว่าคุณมักจะเข้าสู่วงแคบ ๆ ถ้าคุณไม่มีอะไรทำหรือคุณสามารถเข้าสู่สถานะพลังงานต่ำและรอให้การขัดจังหวะคุณ (มันจะใช้พลังงานต่ำกว่าปกติ " โลหะ "ขัดจังหวะ)
Nick T

1
@JonasWielicki สถาปัตย์ที่ออกแบบมาสำหรับระบบฝังตัวดูแลเกี่ยวกับการจัดการพลังงานดังนั้น WFI จึงมีความสำคัญ สถาปัตยกรรมเก่าแก่หลายแห่งไม่มีสิ่งนั้น สถาปัตยกรรม 8086 ดั้งเดิมไม่ได้เป็น AFAIR 68k มี WFI หรือไม่ มันเป็นคุณสมบัติมาตรฐานของ MIPS หรือไม่? ความคุ้นเคยของฉันกับการเขียนโปรแกรมระดับต่ำส่วนใหญ่เป็น ARM ซึ่งการใช้พลังงานต่ำเป็นเรื่องที่แน่นอนและ WFI เป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็งการจัดการพลังงาน
Gilles

1
@Gilles 8086 มีคำสั่งหยุด ดูen.m.wikipedia.org/wiki/HLT_(x86_instruction)คำสั่งนี้รวมฟังก์ชั่นการประหยัดพลังงานไว้ตั้งแต่ 80486 DX4 เมื่อมองย้อนกลับไปในประวัติศาสตร์ HLT มีอยู่แล้วใน 8080 และอนุพันธ์ (เช่น Z80)
pabouk

1
@pabouk HLTสามารถปิดการใช้งาน SL ของ 386 และ 486 ก่อนที่ DX4 จะออกมา (บทความ Wikipedia ไม่ถูกต้อง)
Stephen Kitt

0

ไม่งานว่างไม่ได้วนรอบ CPU ตัวกำหนดตารางเวลาไม่ได้เลือกกระบวนการที่ไม่ทำงานสำหรับการดำเนินการ กระบวนการว่างกำลังรอเหตุการณ์บางอย่างเกิดขึ้นเพื่อให้สามารถดำเนินการต่อได้ ตัวอย่างเช่นสามารถรออินพุตในการread()โทรของระบบ

โดยวิธีการเคอร์เนลไม่ใช่กระบวนการแยกต่างหาก รหัสเคอร์เนลจะถูกดำเนินการเสมอในบริบทของกระบวนการ (ดียกเว้นในกรณีพิเศษของเคอร์เนลเธรด) ดังนั้นจึงไม่ถูกต้องที่จะพูดว่า "และ CPU หนึ่งตัวจะถูกเก็บไว้โดยเคอร์เนลเองในขณะที่ไม่มีการทำงานของ userpace"


3
อืม ... ฉันไม่คิดว่าเป็นกระบวนการที่ไม่ได้ใช้งานที่สร้างโดย CLONE_IDLETASK หากเป็นเช่นนั้นแล้วก็ไม่จำเป็นต้องสร้างเลยนั่นคือตัวกำหนดตารางเวลาจะละเว้นกระบวนการเคอร์เนลที่ไม่ทำงานของ CPU ซึ่งไม่จำเป็นต้องสร้างกระบวนการใด ๆ สำหรับพวกเขาในระหว่างการบู๊ต (DW ไม่ใช่ของฉัน :))
grochmal

googling เล็กน้อยพบว่า CLONE_IDLETASK เป็นค่าสถานะเคอร์เนลภายในที่ถูกนำมาใช้กับเคอร์เนลเวอร์ชัน 2.5.14 ในปี 2002 และถูกลบออกในปี 2004 ในภายหลัง
Johan Myréen

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