ฉันจะมี 1805 เธรดได้อย่างไรเมื่อฉันมี CPU เสมือน 4 ตัวเท่านั้น


10

ฉันสงสัยว่ามีบางคนสามารถอธิบายให้ฉันทราบได้อย่างไรใน Activity Monitor ของฉันมันบอกว่าฉันมี 1805 กระทู้ สกรีนช็อตของ OS X Activity Monitor

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

แก้ไข:เหตุผลที่ฉันคิดว่ามีเพียง 4 กระทู้ในเครื่องของฉันมาจากคำตอบนี้ ฉันเชื่อว่าความเข้าใจผิดของฉันเกิดจากการใช้คำว่า 'thread' ในบริบทที่แตกต่างกัน


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
bmike

คำตอบ:


24

การกำหนด

1,805 ของคุณหัวข้อไม่ทำงานพร้อมกัน พวกเขาแลกเปลี่ยน แกนหนึ่งรันบิตของเธรดจากนั้นตั้งค่าไว้เพื่อรันบิตของเธรดอื่น แกนอื่น ๆ ทำเช่นเดียวกัน รอบและรอบกระทู้ดำเนินการเล็กน้อยในเวลาไม่ได้ทั้งหมดในครั้งเดียว

ความรับผิดชอบที่สำคัญของระบบปฏิบัติการ (ดาร์วินและ macOS) คือการกำหนดเวลาที่จะให้เธรดดำเนินการบนแกนกลางใด

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

โปรแกรมเมอร์แอปสามารถช่วยเหลือการดำเนินการจัดตารางเวลานี้ได้โดยการนอนเธรดของเธอเป็นระยะเวลาหนึ่งเมื่อเธอรู้ว่าการรอทรัพยากรภายนอกจะใช้เวลาสักครู่ และถ้าเรียกใช้ลูปที่“ แน่น” ซึ่งมี CPU มากโดยไม่มีสาเหตุที่ต้องรอทรัพยากรภายนอกโปรแกรมเมอร์สามารถแทรกการเรียกไปยังอาสาสมัครเพื่อตั้งค่าไว้ในเวลาสั้น ๆ เพื่อไม่ให้แกนกลางติดขัดและอนุญาตให้เธรดอื่นทำงาน

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่หน้าวิกิพีเดีย multithreading

มัลติเธรดพร้อมกัน

สำหรับคำถามที่เชื่อมโยงของคุณกระทู้มีเหมือนกันที่นี่

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

ผู้ผลิต CPU บางรายได้พัฒนาเทคโนโลยีเพื่อลดเวลานี้เพื่อให้สามารถสลับระหว่างเธรดได้เร็วขึ้นมาก อินเทลเรียกเทคโนโลยีHyper-Threading รู้จักกันในชื่อมัลติเธรด (SMT) พร้อมกัน

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

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

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

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


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
bmike

นอกจากนี้ไม่มีใครyield()เรียกระบบในหัวข้อ CPU แบบเข้มข้น (ยกเว้นว่าเป็นรหัสดั้งเดิมจากการทำงานหลายอย่างพร้อมกันบน Classic MacOS) การจัดตารางเวลาแบบมัลติทาสกิ้ล่วงหน้าที่จัดไว้ล่วงหน้าหลังจากที่เธรดใช้เวลามากขึ้น
Peter Cordes

คำอธิบายการทำไฮเปอร์เธรดของคุณผิด เธรดฮาร์ดแวร์! = ซอฟต์แวร์เธรดพวกเขากำลังประมวลผลบริบท / โลจิคัลคอร์ ทั้งสองแกนตรรกะบนแกนหลักทางกายภาพทำตามคำแนะนำของพวกเขาในเวลาเดียวกัน ฟรอนต์เอนด์สลับระหว่างเธรด (แต่ละรอบ) แต่คอร์ประมวลผลที่ไม่เป็นไปตามลำดับสามารถเรียกใช้งานคำสั่ง / uops จากเธรดทั้งสองในรอบเดียวกัน สิ่งนี้แสดงให้เห็นถึงความเท่าเทียมกันในระดับคำสั่งจากสองเธรดไปสู่การดำเนินการ OoO เพื่อให้หน่วยการดำเนินการที่ป้อนเข้าทำงานได้ดีขึ้น (นี่คือจุดสำคัญของ SMT) ไม่ใช่แค่ "การสลับบริบทที่ปรับให้เหมาะสม"
Peter Cordes


7

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

ป้อนคำอธิบายรูปภาพที่นี่

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

หากคุณแปลงการดำเนินการเธรดที่เกิดขึ้นในช่วงเวลาสีดำ / สีน้ำเงินและแปลงเป็นหนึ่งวินาที = 1 ns สิ่งที่เราสนใจเป็นเหมือนดิสก์ IO ใช้เวลา 100 microseconds เป็น 4 วันและ 200 ms อินเทอร์เน็ตไปกลับคือ การหน่วงเวลา 20 ปีหากคุณนับวินาทีในสเกลเวลา CPU เช่นเดียวกับพลังหลายสิบแบบฝึกหัดในเกือบทุกกรณีซีพียูไม่ได้ใช้งานเป็นเวลา "เดือน" รอการทำงานที่มีความหมายจากโลกภายนอกที่ช้ามาก ๆ

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

หากคุณคลิกขวา (คลิกควบคุม) บนเธรดคำในแถวส่วนหัวที่ด้านบนเพิ่มสถานะของแอพและคุณจะเห็นเธรดส่วนใหญ่มีแนวโน้มที่จะไม่ทำงานไม่หลับไม่ทำงานในช่วงเวลาใดเวลาหนึ่ง


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
bmike

1

คุณไม่ถามคำถามพื้นฐานที่มีเนื้อหามากกว่านี้ว่า "ฉันจะมีกระบวนการ 290 เมื่อ CPU ของฉันมีสี่คอร์ได้อย่างไร" คำตอบนี้เป็นประวัติย่อซึ่งอาจช่วยให้คุณเข้าใจภาพรวมได้แม้ว่าคำถามเฉพาะนั้นจะได้รับคำตอบแล้ว ดังนั้นฉันจะไม่ให้รุ่น TL; DR

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

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

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

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

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

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

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