ฉันสงสัยอยู่เสมอว่าพวกมันคืออะไรทุกครั้งที่ฉันได้ยินเกี่ยวกับพวกเขาภาพของอุปกรณ์ที่คล้ายล้อฟลายเวลล้ำยุคกำลังเต้น (กลิ้ง?) ผ่านความคิดของฉัน ...
พวกเขาคืออะไร?
ฉันสงสัยอยู่เสมอว่าพวกมันคืออะไรทุกครั้งที่ฉันได้ยินเกี่ยวกับพวกเขาภาพของอุปกรณ์ที่คล้ายล้อฟลายเวลล้ำยุคกำลังเต้น (กลิ้ง?) ผ่านความคิดของฉัน ...
พวกเขาคืออะไร?
คำตอบ:
เมื่อคุณใช้ล็อคปกติ (mutexes ส่วนสำคัญ ฯลฯ ), ระบบปฏิบัติการทำให้หัวข้อของคุณอยู่ในสถานะรอและpreemptsมันโดยการตั้งเวลาหัวข้ออื่น ๆ บนแกนเดียวกัน สิ่งนี้มีผลเสียหากเวลาในการรอสั้นจริงๆเนื่องจากเธรดของคุณต้องรอใบจองเพื่อรับเวลา CPU อีกครั้ง
นอกจากนี้เคอร์เนลอ็อบเจ็กต์ยังไม่พร้อมใช้งานในทุกสถานะของเคอร์เนลเช่นในตัวจัดการขัดจังหวะหรือเมื่อไม่มีการเพจเป็นต้น
Spinlocks ไม่ทำให้ใบจอง แต่รอวนซ้ำ ("หมุน") จนกว่าคอร์อื่น ๆ จะคลายล็อก วิธีนี้จะป้องกันไม่ให้เธรดสูญเสียควอนตัมและดำเนินการต่อทันทีที่คลายล็อก กลไกง่ายๆของ spinlocks ช่วยให้เคอร์เนลสามารถใช้งานได้ในเกือบทุกสถานะ
นั่นเป็นเหตุผลที่ในเครื่องแกนเดียว Spinlock เป็นเพียง "ปิดใช้งานการขัดจังหวะ" หรือ "เพิ่ม IRQL" ซึ่งป้องกันการตั้งเวลาเธรดอย่างสมบูรณ์
Spinlocks ช่วยให้เมล็ดสามารถหลีกเลี่ยง "Big Kernel Lock" ได้ในที่สุด (ล็อคที่ได้มาเมื่อคอร์เข้าสู่เคอร์เนลและปล่อยออกที่ทางออก) และมีการล็อกแบบละเอียดบนเคอร์เนลแบบดั้งเดิมทำให้เกิดการประมวลผลแบบมัลติคอร์ที่ดีขึ้นบนเครื่องมัลติคอร์จึงมีประสิทธิภาพที่ดีขึ้น
แก้ไข : มีคำถามเกิดขึ้น: "นั่นหมายความว่าฉันควรใช้ Spinlock ทุกที่ที่เป็นไปได้หรือไม่" และฉันจะพยายามตอบ:
ดังที่ฉันได้กล่าวไปแล้ว Spinlocks มีประโยชน์เฉพาะในสถานที่ที่เวลารอคอยที่คาดไว้จะสั้นกว่าควอนตัม (อ่าน: มิลลิวินาที) และใบจองไม่สมเหตุสมผลมากนัก (เช่นเคอร์เนลออบเจ็กต์ไม่มี)
หากไม่ทราบเวลารอหรือหากคุณอยู่ในโหมดผู้ใช้ Spinlocks ไม่มีประสิทธิภาพ คุณใช้เวลา CPU 100% บนคอร์รอขณะตรวจสอบว่ามีสปินล็อกหรือไม่ คุณป้องกันไม่ให้เธรดอื่นทำงานบนคอร์นั้นจนกว่าควอนตัมของคุณจะหมดอายุ สถานการณ์นี้เป็นไปได้สำหรับการระเบิดสั้น ๆ ที่ระดับเคอร์เนลและไม่น่าจะเป็นตัวเลือกสำหรับแอ็พพลิเคชันโหมดผู้ใช้
นี่คือคำถามเกี่ยวกับ SO ที่ระบุว่าSpinlocks มีประโยชน์อย่างไร?
สมมติว่าทรัพยากรได้รับการป้องกันโดยการล็อกเธรดที่ต้องการเข้าถึงทรัพยากรจำเป็นต้องได้รับการล็อกก่อน หากไม่สามารถใช้ล็อคได้เธรดอาจตรวจสอบซ้ำ ๆ ว่าล็อคได้รับการปลดปล่อยหรือไม่ ระหว่างนี้เธรดไม่ว่างกำลังรอตรวจสอบการล็อกโดยใช้ CPU แต่ไม่ได้ทำงานที่เป็นประโยชน์ ล็อคดังกล่าวเรียกว่าล็อคหมุน
มันเป็นห่วงมากที่จะดำเนินต่อไปจนกว่าจะตรงตามเงื่อนไข:
while(cantGoOn) {};
sleep(0)
มันจะเอาไว้ก่อนด้ายฆ่าจุดประสงค์ของการใช้ spinlock ในตอนแรก หากคุณต้องการยอมให้กับเธรดอื่นคุณควรใช้การล็อกแบบปกติ (ฉันรู้ว่าความคิดเห็นของคุณเก่ามาก แต่ต้องการป้องกันไม่ให้คนอื่นเห็นว่าเป็นคำแนะนำ)
while(something != TRUE ){};
// it happend
move_on();
SpinLocks คือสิ่งที่เธรดรอจนกว่าจะมีการล็อค โดยปกติจะใช้เพื่อหลีกเลี่ยงค่าใช้จ่ายในการรับเคอร์เนลอ็อบเจ็กต์เมื่อมีขอบเขตของการรับเคอร์เนลอ็อบเจ็กต์ภายในช่วงเวลาเล็ก ๆ
เช่น:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
คุณต้องการใช้ Spinlock เมื่อคุณคิดว่าราคาถูกกว่าในการเข้าสู่วงรอบการรอที่วุ่นวายและรวมทรัพยากรแทนการบล็อกเมื่อทรัพยากรถูกล็อค
การหมุนจะเป็นประโยชน์เมื่อการล็อคเป็นแบบละเอียดและมีจำนวนมาก (ตัวอย่างเช่นการล็อกต่อโหนดในรายการที่เชื่อมโยงกัน) รวมทั้งเมื่อเวลาล็อคจะสั้นมากเสมอ โดยทั่วไปในขณะที่ถือสปินล็อคเราควรหลีกเลี่ยงการบล็อกเรียกสิ่งที่ตัวเองอาจปิดกั้นถือล็อคการหมุนมากกว่าหนึ่งครั้งพร้อมกันทำการโทรแบบไดนามิก (อินเทอร์เฟซและเวอร์ชวล) ทำการโทรแบบคงที่ส่งไปยังรหัสใด ๆ ที่ไม่ได้ เป็นเจ้าของหรือจัดสรรหน่วยความจำ
สิ่งสำคัญที่ควรทราบคือ SpinLock เป็นประเภทค่าด้วยเหตุผลด้านประสิทธิภาพ ด้วยเหตุนี้เราจึงต้องระมัดระวังอย่างยิ่งที่จะไม่คัดลอกอินสแตนซ์ SpinLock โดยไม่ได้ตั้งใจเนื่องจากทั้งสองอินสแตนซ์ (ต้นฉบับและสำเนา) จะเป็นอิสระจากกันโดยสิ้นเชิงซึ่งอาจนำไปสู่พฤติกรรมที่ผิดพลาดของแอปพลิเคชัน หากต้องส่งอินสแตนซ์ SpinLock ไปรอบ ๆ อินสแตนซ์นั้นควรถูกส่งผ่านโดยการอ้างอิงแทนที่จะเป็นค่า
โดยสรุป Spinlock ใช้การเปรียบเทียบและแลกเปลี่ยนอะตอม (CAS) หรือคำแนะนำในการทดสอบและตั้งค่าเช่นเดียวกับการใช้งานแบบล็อคฟรีรอสำนวนที่ปลอดภัยสำหรับเธรดฟรี โครงสร้างดังกล่าวปรับขนาดได้ดีในเครื่องมัลติคอร์
มันเป็นวงที่หมุนไปรอบ ๆ จนกว่าจะตรงตามเงื่อนไข
ใช่แล้ว - จุดของการล็อคการหมุน (เทียบกับส่วนที่สำคัญแบบดั้งเดิม ฯลฯ ) คือพวกเขาให้ประสิทธิภาพที่ดีขึ้นภายใต้สถานการณ์บางอย่าง (ระบบมัลติคอร์ .. ) เนื่องจากไม่ได้ให้ควอนตัมที่เหลือในทันที
Spinlock เป็นล็อคประเภทหนึ่งซึ่งไม่สามารถปิดกั้นและไม่สามารถนอนหลับได้ เธรดใด ๆ ที่ต้องการได้รับสปินล็อกสำหรับทรัพยากรที่ใช้ร่วมกันหรือทรัพยากรที่สำคัญใด ๆ จะหมุนอย่างต่อเนื่องเสียวงจรการประมวลผล CPU จนกว่าจะได้รับการล็อกสำหรับทรัพยากรที่ระบุ เมื่อได้รับ Spinlock แล้วมันจะพยายามทำงานในควอนตัมให้เสร็จสมบูรณ์แล้วปล่อยทรัพยากรตามลำดับ Spinlock เป็นประเภทของการล็อกที่มีลำดับความสำคัญสูงสุดพูดง่ายๆก็คือมันไม่ใช่การล็อกแบบไม่หวังผลล่วงหน้า