spinlock แตกต่างจากการเลือกตั้งอย่างไร


41

spinlock และการลงคะแนนเลือกตั้งเป็นสิ่งเดียวกันหรือไม่

วิกิพีเดีย:

Spinlock เป็นล็อคซึ่งเป็นสาเหตุให้เธรดพยายามรับมันเพื่อรอในลูป ("หมุน") ในขณะที่ตรวจสอบซ้ำ ๆ ว่ามีล็อคอยู่หรือไม่

ฟังดูดีมาก ๆ :

while(!ready);

ฉันถูกสอนให้หลีกเลี่ยงการลงคะแนนเลือกตั้งทุกครั้งที่ทำได้ ดังนั้น spinlock เป็นชื่อแฟนซีสำหรับการเลือกตั้งเก่าที่ไม่ดีหรือไม่? spinlock แตกต่างจากการเลือกตั้งอย่างไร

คำตอบ:


85

การสำรวจหมายถึงการตรวจสอบซ้ำ ๆ ว่าทรัพยากร ( ทรัพยากรประเภทใด ) พร้อมหรือยัง

spinlock คือเมื่อทรัพยากรที่คุณกำลังสำรวจคือล็อค

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

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

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

ทุกวันนี้ฉันปิดการแจ้งเตือนทั้งหมดแล้ว ฉันรู้ว่าเมื่อใดก็ตามที่ฉันดูในกล่องจดหมายของฉันจะมีอีเมลใหม่ที่นั่น การสำรวจมีประสิทธิภาพมากขึ้นในขณะนี้

Spinlocks นั้นมีประสิทธิภาพเมื่อ a) โอกาสที่ล็อคจะต่ำและ b) ถ้าล็อคถูกล็อกมันจะถูกเก็บไว้ในช่วงเวลาสั้น ๆ เท่านั้น กล่าวอีกนัยหนึ่ง: มีประสิทธิภาพสำหรับการล็อคแบบละเอียดที่ไม่มีการควบคุมส่วนใหญ่ แต่ไม่มีประสิทธิภาพสำหรับการล็อคแบบหยาบแบบหยาบ

(และแน่นอน spinlocks จะทำงานเฉพาะเมื่อมีการขนานที่แท้จริงมิฉะนั้นเธรดอื่น ๆ จะไม่มีโอกาสปลดล็อคฉันเดาว่ามันชัดเจนมาก


5
Spinlocks สามารถสัมผัสได้อย่างสมบูรณ์แบบในสภาพแวดล้อมแบบมัลติทาสก์ที่ทำงานร่วมกัน คุณต้องทำให้แน่ใจว่าคุณยอมควบคุมวง
เควิน

4
ตัวอย่างที่ดีกับอีเมล เตือนฉันว่าคุณมักจะมีอีเมล ...
Petr Pudlák

2
@ เควิน: ฉันมีความคิดที่พิถีพิถันมากเกี่ยวกับ spinlock นั่นคือล็อคที่หมุนวนเป็นวงเปล่า ( atomically_do { while (lock.is_locked?); lock.acquire! }) ถ้ามันให้ผลก็ไม่ได้เป็นวงว่างเปล่าและไม่ใช่ spinlock ในมุมมองที่พิถีพิถัน :-D แต่แน่นอนว่าการผสมข้ามพันธุ์กับล็อคชนิดอื่น ๆ
Jörg W Mittag

3
@bubakazouba: spinlock ทำงานโดยใช้ตัวอักษร "หมุน" ในวงว่างและตรวจสอบ "ล็อคออกแล้วหรือยังล็อคออกหรือยังล็อคออกหรือยังล็อคออกหรือยังล็อคออกหรือยัง? ครั้งแล้วครั้งเล่า. หากไม่มีการขนานกันจะไม่มีเธรดอื่นทำงานในเวลาเดียวกันที่สามารถปลดล็อคได้ดังนั้นคุณจึงมีการวนซ้ำไม่รู้จบ! ดูความคิดเห็นด้านบนของคุณโดยตรง
Jörg W Mittag

1
@kasperd: คุณยังสามารถเห็นการทำงานมัลติทาสก์แบบร่วมมือในซอฟต์แวร์เซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์เช่น nginx ในกรณีนี้มีหนึ่งเธรดและไม่มีการล็อกซึ่งหมายความว่าคุณจะใช้ประโยชน์จากแกนเดียวเท่านั้น ความรู้ที่ดีที่สุดของฉันไม่มีตัวอย่างแท้จริงในโลกของการทำงานมัลติทาสกิ้งแบบมัลติคอร์ที่แท้จริง ระบบดังกล่าวจะโง่เนื่องจากคุณจะได้รับข้อเสียทั้งหมดของการทำงานมัลติทาสกิ้งแบบมีส่วนร่วมโดยไม่มีการกลับหัวกลับหาง
Kevin

10

spinlock เป็นล็อคชนิดหนึ่งโดยเฉพาะซึ่งทำได้ผ่านการสำรวจ

การสำรวจเป็นวิธีการตรวจสอบสถานะของบางสิ่งบางอย่าง (โดยขอสถานะเมื่อเทียบกับการรอการบอกสถานะ)

ไม่ใช่การลงคะแนนเลือกตั้งทั้งหมดเป็น spinlock เช่นการสำรวจสถานะของแป้นคีย์บอร์ด


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


5

Spinlock นั้นแตกต่างจากการทำโพลเพราะมันจะเกิดขึ้นในช่วงเวลาสั้น ๆเพียงแค่ไม่กี่มิลลิวินาทีหรือน้อยกว่า การเลือกตั้งสามารถดำเนินต่อไปเรื่อย ๆ

ในการเขียนโปรแกรมแบบขนานตอนสั้น ๆของการปั่นมักจะดีกว่าการบล็อกเนื่องจากจะหลีกเลี่ยงค่าใช้จ่ายในการสลับบริบทและการเปลี่ยนเคอร์เนล

อ่านเพิ่มเติม
SpinLock และ SpinWait ใน C #
Spinlocks และล็อคอ่าน - เขียนใน C


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

@ Peter บางทีนั่นอาจเป็นความหมายของ Albahari นั่นคือสิ่งที่เขาพูด
Robert Harvey

4

ข้อแตกต่างคือ Spinlock นั้น (หวังว่า) จะใช้เฉพาะในสถานการณ์ที่เหมาะสมเท่านั้นและในสถานการณ์เหล่านี้จะมีประสิทธิภาพมาก

คุณใช้ spinlock หากคุณคาดหวังว่าทรัพยากรจะถูกล็อคในเวลาอันสั้นเท่านั้น - ตัวอย่างเช่นหากใช้การล็อคเพื่อปรับปรุงตัวแปรเท่านั้น Spinlock ทำการสำรวจล็อคด้วยความเร็วสูงสุด แต่หวังว่าจะน้อยกว่าไมโครวินาที mutex ปกติจะต้องใช้ในการเรียกใช้ระบบปฏิบัติการ หากล็อคจะถูกเก็บไว้เพียงระยะเวลาสั้น ๆ แล้ว spinlock จะใช้เวลาเพียงเล็กน้อยของ CPU ในขณะที่การเรียกใช้ระบบปฏิบัติการจะใช้เวลานานกว่า แต่ถ้าความคาดหวังนี้ผิดพลาด spinlock จะไม่มีประสิทธิภาพมาก - มันจะใช้เวลา CPU 100% ในหนึ่ง CPU ในขณะที่ mutex ปกติใช้เวลาในการเข้าสู่ระบบปฏิบัติการและส่งคืนเท่านั้น

บางครั้งทั้งสองอย่างรวมกัน; คุณเรียกใช้การล็อกการหมุนในช่วงเวลาสั้น ๆ และเปลี่ยนไปใช้กลยุทธ์อื่นหาก Spinlock ไม่ทำงาน


2

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

ตัวอย่างการสำรวจมากเกินไปจะได้รับภาระของ CPU ถึง 100% ในกรณีที่งานจริงจะส่งผลให้โหลด 2% เท่านั้น

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

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

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

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