ตัวจัดการงานกำลังบอกว่าระบบกำลังทำงานด้วยเธรดมากกว่าหนึ่งพันเธรด


17

ฉันเปิดตัวจัดการงานและดูใต้พื้นที่ "ระบบ" และเห็น:

หัวข้อ: 1337

เนื่องจากฉันมีโปรเซสเซอร์แบบดูอัลคอร์ที่มีเธรดไฮเปอร์ (หมายถึงสี่เธรด) เป็นไปได้อย่างไรที่จะมีเธรด 1,000+ ตัวเมื่อโปรเซสเซอร์ของฉันควรมีเพียงสี่เธรดเท่านั้น


3
ไม่ว่าเหตุผลที่พวกเขาเรียกมันว่าHYPER -threading? :)
CVn

9
Gee ในที่สุดพวกเขาก็ได้คิดค้น "มัลติโปรแกรม" หรือไม่? (นี่คือ 1967 ใช่มั้ย)
Daniel R Hicks

10
มีใครบางคนเปลี่ยนหมายเลขเป็น 1337 หรือไม่
Erty Seidohl

11
บริษัท ที่มีโต๊ะทำงานสี่โต๊ะสามารถมีพนักงาน 1,337 คนได้อย่างไร ง่าย; พนักงานผลัดกันโดยใช้โต๊ะทำงาน
Eric Lippert

คำตอบ:


50

คำตอบง่ายๆคือไม่ได้มีเธรดทั้งหมดที่ทำงานพร้อมกัน สำหรับคำอธิบายที่สมบูรณ์ยิ่งขึ้นอ่านต่อ

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

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

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

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

การเพิ่มความลึกของการใช้งานด้านเทคนิคเล็กน้อยที่แกนหลักของตัวกำหนดเวลางานระบบปฏิบัติการมัลติทาสกิ้งแบบ pre-emptively มักเป็นฮาร์ดแวร์ขัดจังหวะบางชนิด ซึ่งหมายความว่าเมล็ดสามารถหยุด CPU เมื่อมันไม่เคยมีใครทำงานที่เป็นประโยชน์ในการดำเนินการ (นี้เป็นเกือบแน่นอนหนึ่งในเหตุผลที่ถ้าไม่เหตุผลว่าทำไมการตรวจสอบลินุกซ์คำแนะนำในการบูตในIA-32HLT- ซีพียูที่ใช้งานร่วมกันได้และอาจตรวจสอบสถาปัตยกรรมอื่น ๆ ที่คล้ายกัน) ซึ่งปลอดภัยในความรู้ที่ว่าเวลาใด ๆ ที่จะเกิดขึ้นในอนาคตการขัดจังหวะจะเริ่มขึ้นและตัวกำหนดเวลางานจะถูกเรียกใช้ เนื่องจากอินเทอร์รัปต์เริ่มทำงานโดยไม่คำนึงถึงสิ่งที่ CPU กำลังทำงานอยู่ (นั่นคือแนวคิดเบื้องหลังการขัดจังหวะ) ตัวกำหนดตารางเวลาจะถูกเรียกใช้งานเป็นประจำและได้รับโอกาสในการพิจารณาว่าควรประมวลเธรดใดในช่วงเวลาต่อไปนี้ เนื่องจากสวิทช์บริบทมีราคาค่อนข้างแพงจึงมักเป็นไปได้ (อย่างน้อยผ่านซอร์สโค้ด) เพื่อปรับแต่งว่าตัวกำหนดตารางเวลาสลับระหว่างเธรดอย่างจริงจังอย่างไร การสลับเธรดบ่อยครั้งยิ่งทำให้ระบบตอบสนองมากขึ้น แต่การสลับโอเวอร์เฮดหมายความว่าเวลาโดยรวมในการทำภารกิจที่กำหนดให้เสร็จสิ้นนั้นจะนานขึ้น เร็วที่สุดระบบจะเป็นระบบเดียวที่สลับระหว่างเธรดเมื่อเธรดที่รันอยู่ไม่สามารถรันได้อีกต่อไป (หมายถึงมันถูกบล็อกรอบางสิ่งบางอย่างหรือทำงานเสร็จสิ้น) เพราะมันลดโอเวอร์เฮดในขณะที่ระบบตอบสนองส่วนใหญ่จะสลับระหว่างเธรด ทุกครั้งที่มีการเรียกใช้ตัวกำหนดตารางเวลาเนื่องจากจะลดเวลาเฉลี่ยในการรอก่อนที่เธรดเฉพาะจะได้รับเวลา CPU การตั้งค่าในอุดมคติมักจะอยู่ระหว่างสองสิ่งนี้และการแลกเปลี่ยนระหว่างตัวเลือกเหล่านั้นน่าจะเป็นเหตุผลสำคัญอย่างหนึ่งที่ทำให้ Linux มีตัวเลือกหลายตัวเลือกรวมถึงพารามิเตอร์การปรับแต่งบางอย่างผ่านการตั้งค่าเคอร์เนล

ในทางกลับกันระบบปฏิบัติการมัลติทาสกิ้งและสภาพแวดล้อมในทางกลับกัน ( Windows 3.xเป็นหนึ่งในตัวอย่าง) พึ่งพาแต่ละแอพพลิเคชั่นเพื่อควบคุมการจัดตารางเวลาเป็นประจำ โดยปกติแล้วจะมีฟังก์ชั่น API ที่ตั้งใจทำเป็นพิเศษและบ่อยครั้งที่ฟังก์ชั่น API จำนวนมากจะทำหน้าที่เป็นส่วนหนึ่งของโฟลว์การดำเนินการภายในเนื่องจากช่วยให้ผู้ใช้สัมผัสได้ราบรื่นขึ้น วิธีการออกแบบนั้นใช้งานได้ดีตราบใดที่แอปพลิเคชันทั้งหมดมีความประพฤติดีและควบคุมได้ดีในช่วงเวลาสั้น ๆ ระหว่างการดำเนินการในระยะยาว (หมายถึงระยะยาวมากกว่าเศษเสี้ยววินาที) แต่แอปพลิเคชันที่ไม่สามารถอุดตันได้ ทั้งระบบ นี่คือหนึ่งเหตุผลใหญ่ว่าทำไม Windows 3.x ทำได้ไม่ดีนักในการทดสอบมัลติทาสก์ที่ฉันได้กล่าวไว้ข้างต้นขณะที่OS / 2เดินไปพร้อมกันอย่างสนุกสนานในขณะที่ทำงานเดียวกันบนฮาร์ดแวร์เดียวกัน: แอปพลิเคชันสามารถบอกฟลอปปีดิสก์ไดรฟ์ให้เขียนเซกเตอร์และเวลาที่ใช้ทำก่อนที่จะโทรกลับจริง ๆ สามารถวัดได้ (สิบถึงหลายร้อยมิลลิวินาทีหรือ มากกว่า); ระบบมัลติทาสกิ้งแบบ preemptively จะมีตัวแบ่งตารางเวลาในการเรียกใช้ที่กำหนดเวลาไว้ถัดไปสังเกตว่าเธรดที่ปัจจุบัน "กำลังทำงาน" ถูกบล็อคโดยการเรียกการเขียนและสลับไปยังเธรดอื่นที่รันได้ (ในทางปฏิบัติมันเกี่ยวข้องกับอีกเล็กน้อย แต่เป็นความคิดทั่วไป)

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


11
ฉันรัก "การป้อนข้อมูลผู้ใช้โดยเฉพาะช้ามาก"
John Dvorak

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

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

1
@slhck ฉันสร้างห้อง แต่ไม่สามารถหาวิธีย้ายการสนทนาในความคิดเห็นเหล่านี้ได้ซึ่งน่าจะดี นั่นเป็นสิ่งที่คุณสามารถทำได้ด้วยตนเองในฐานะผู้ดูแลหรือไม่? chat.stackexchange.com/rooms/9547/…
CVn

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

18

ลองคิดถึงทางหลวงสี่เลนที่มียานพาหนะ 1,037 คัน

ระบบปฏิบัติการของคุณต้องการกระบวนการที่กำลังทำงานจำนวนมากเพื่อให้ทำงานได้กับบริการมากมาย แม้แต่โปรแกรมกราฟิกที่ง่ายที่สุดก็ต้องมีการเขียนโปรแกรมแบบมัลติเธรด เมื่อคุณคิดว่าเปิดโปรแกรมมากมายคุณจะเห็นว่ามีความจำเป็นในการแบ่งปันทรัพยากรพลังงานคอมพิวเตอร์

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


8
"แม้แต่โปรแกรมกราฟิกที่ง่ายที่สุดก็ต้องมีการเขียนโปรแกรมแบบมัลติเธรด" ไม่ถูกต้อง. มันเป็นไปได้อย่างสมบูรณ์แบบในการเขียนแอพพลิเคชัน GUI แบบเธรดเดียว จนถึง Windows 95 สำหรับทุกเจตนารมณ์และวัตถุประสงค์ที่ทุกคนทำอย่างนั้น มันทำให้งานบางอย่างมีความซับซ้อนมากขึ้น (ตัวอย่างเช่นการพิมพ์พื้นหลังเป็นเรื่องไม่สำคัญกับหลายเธรด แต่ไม่ใช่เรื่องเล็กน้อยในแอปพลิเคชั่นเธรดเดียวโดยเฉพาะอย่างยิ่งถ้าคุณยังจำหน่วยความจำเช่นเดียวกับในกรณีนั้น) X ทำได้ง่ายขึ้นโดย Y "และ" X ต้องการ Y "
CVn

8
@ MichaelKjörling: "จนถึง Windows 95 สำหรับทุกเจตนาและทุก ๆ คนทำแบบนั้น" * - จริงเหรอ? แม้แต่ระบบ * nix ที่ใช้ Motif ในยุค 80?
LarsH

@ LarsH จุดดีและหนึ่งฉันคิดว่าสายเกินไปที่จะแก้ไขความคิดเห็น แต่นั่นไม่ได้ลบล้างประเด็น: กล่าวคือมันเป็นไปได้อย่างสมบูรณ์แบบในการเขียนแอพพลิเคชั่น GUI แบบเธรดเดียว คุณไม่จำเป็นต้องใช้มัลติเธรดสำหรับสิ่งนั้นแม้ว่ามันจะทำให้งานบางอย่าง (มาก) ง่ายขึ้นในโปรแกรมเมอร์
CVn

@ MichaelKjörling: ฉันเห็นด้วยมันไม่ได้ลบล้างประเด็นของคุณซึ่งเป็นสิ่งที่ถูกต้อง (ฉันไม่คิดว่าคำสั่งที่ไม่ถูกต้องของบทประพันธ์นั้นขัดแย้งกับประเด็นของเขา)
LarsH

ตัวอย่างของสิ่งที่ @ MichaelKjörlingกล่าวว่า Visual Basic (ก่อน. NET) ในฐานะภาษาการเขียนโปรแกรมไม่มีการสนับสนุนหลายเธรด ทุกอย่างทำงานในหัวข้อเดียว หากคุณต้องการประมวลผลอินพุตของผู้ใช้ในช่วงกลางของการดำเนินการที่ต้องใช้เวลานานคุณจะต้องโทรDoEventsซึ่งจะประมวลผลคิวข้อความ - แต่นั่นทำบนเธรดเดียวกันและจะบล็อกการดำเนินการที่รันนานจนกว่าข้อความทั้งหมดจะถูกประมวลผล . (แน่นอนคุณสามารถเรียกใช้ฟังก์ชัน Win32 API และ / หรือสร้างกระบวนการเพิ่มเติม แต่ในจุดที่คุณอาจรวมทั้งใช้หนึ่งในภาษาระดับต่ำ.)
บ๊อบ

5

เราควรถอยกลับและถามตัวเราเอง: คอมพิวเตอร์ที่มี CPU ตัวเดียวจะมีสองเธรดได้อย่างไร

เธรดเป็นเอนทิตีซอฟต์แวร์ไม่ใช่ฮาร์ดแวร์ หากต้องการมีเธรดอื่นคุณเพียงต้องการหน่วยความจำสำหรับวัตถุที่ประกอบเป็นเธรดเช่นโครงสร้างตัวอธิบายและสแต็ก

ระบบปฏิบัติการจะสลับระหว่างเธรดในเวลาต่างๆเช่นภายในบางอินเทอร์รัปต์ (เช่นตัวขัดจังหวะตัวจับเวลา) หรือเมื่อเธรดทำการโทรเข้าสู่ระบบปฏิบัติการ

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

อย่าสับสนโดย"ไฮเปอร์เธรด"ซึ่งเป็นชื่อของ Intel สำหรับคุณสมบัติฮาร์ดแวร์เฉพาะ

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