อะไรคือความแตกต่างระหว่างสปินล็อคและเซมาฟอร์


15

อะไรคือความแตกต่างพื้นฐานระหว่างสปินล็อคและเซมาฟอร์ในการทำงาน?


ความเป็นไปได้ที่ซ้ำกันของspinlock ใน Linux คืออะไร?
Gilles 'หยุดชั่วร้าย'

@Gilles ฉันก็มองไปที่สิ่งนั้นเช่นกัน แต่สิ่งที่กล่าวถึงเพียงอย่างเดียวของ semaphores ในหน้านี้คือ Warren ให้ความเห็นว่า "ถ้าใครอยากรู้ถึงความแตกต่างระหว่างสปินล็อคและพูดเซมาฟอร์นั่นเป็นคำถามที่ต่างออกไป"
Michael Mrozek

@Michael: ตกลงฉันคิดว่ามีคำตอบที่กล่าวถึงประเด็นหลัก แต่คุณก็ถูกต้องที่ไม่มีใครระบุไว้อย่างชัดเจนว่าเซมาฟอร์เป็นหนึ่งในล็อคประเภทอื่น
Gilles 'หยุดความชั่วร้าย'

คำอธิบายโดย Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut

ทำซ้ำของstackoverflow.com/questions/195853/spinlock-versus-semaphoreคำอธิบายที่ดีมากมายมีอยู่ในเธรดที่ฉันถาม
iankits

คำตอบ:


13

ทั้งจัดการทรัพยากรที่ จำกัด ฉันจะอธิบายความแตกต่างระหว่างสัญญาณแบบไบนารี (mutex) และหมุนล็อคก่อน

สปินล็อคทำการรอไม่ว่าง - นั่นคือมันยังวนรอบการทำงานอยู่:

while (try_acquire_resource ());
...
release();

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

ในอีกทางหนึ่งmutexทำตัวเหมือน:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

ดังนั้นหากเธรดจะพยายามรับทรัพยากรที่ถูกบล็อกเธรดจะถูกระงับจนกว่าจะพร้อมใช้งาน การล็อค / ปลดล็อคนั้นหนักกว่ามาก แต่การรอนั้น 'ฟรี' และ 'ยุติธรรม'

สัญญาณเป็นล็อคที่ได้รับอนุญาตให้ใช้หลายครั้ง (ที่รู้จักกันจากการเริ่มต้น) จำนวนครั้ง - ตัวอย่างเช่น 3 กระทู้ได้รับอนุญาตให้ถือทรัพยากรพร้อมกัน แต่ไม่มาก มันถูกใช้เช่นในปัญหาของผู้ผลิต / ผู้บริโภคหรือโดยทั่วไปในคิว:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

คำอธิบายที่ดีฉันต้องการเน้นเพียงจุดเดียว เซมาฟอร์ vs mutex เป็นเรื่องของอินเทอร์เฟซ: mutex ถูกเก็บไว้หรือไม่ในขณะที่เซมาฟอร์ถูกจัดขึ้นโดยเธรดถึง N; mutex เป็นกรณีพิเศษของ semaphores ที่มี N = 1 Spinlock vs ล็อคชนิดอื่นเป็นเรื่องของการใช้งาน: spinlock พยายามที่จะรับล็อคในขณะที่ชนิดอื่น ๆ รอการแจ้งเตือน ในบริบทเคอร์เนลของ Linux การล็อกเพียงอย่างเดียวที่มีการใช้งานแบบสปินมีส่วนต่อประสาน mutex
Gilles 'หยุดความชั่วร้าย'

ในบริบทเคอร์เนล Linux ล็อคเดียวที่มีการใช้งานแบบสปินมีส่วนต่อประสาน mutex ฉันไม่เข้าใจบรรทัดนี้ คุณช่วยขยายมันหน่อยได้ไหม?
Sen

@Sen: เขาหมายถึงว่าการล็อกแบบหมุนใน Linux ทำงานแบบไบนารี (ถูกล็อคหรือไม่) เป็นไปได้ที่จะมีการล็อคการหมุนที่ทำหน้าที่เป็นคำเปรียบเทียบ
Maciej Piechotka

“ แต่ถ้าด้ายล็อคจะถูกยึดไว้โดยคนอื่น ๆ ซึ่งจะพยายามเข้าถึงทรัพยากรที่เหมือนกันส่วนที่สองก็จะพยายามที่จะรับทรัพยากรจนกว่ามันจะหมดซีพียูควอนตัม”: แต่ปัญหายังคงอยู่กับ Mutex เช่นกัน เกิดอะไรขึ้นถ้างานที่มีลำดับความสำคัญมากกว่านั้นจำเป็นต้องเข้าถึงทรัพยากร…มันเป็นเพียงคิว? อาจเป็นการดีกว่าที่จะยกเลิกการแชร์ทรัพยากรระหว่างงานที่มีลำดับความสำคัญต่างกัน
Hibou57

@ Hibou57: ใช่มันถูกบล็อกเนื่องจากสถานะไม่สอดคล้องกันและการใช้ทรัพยากรจะมีผลกระทบ 'ตลก' (พูดว่าเธรดลำดับความสำคัญต่ำอยู่ตรงกลางของการเพิ่มหรือลบบางสิ่งออกจากรายการที่เชื่อมโยง) จุดของคำสั่งนี้คือว่าถ้าเธรดถูกบล็อกมันไม่ได้ถูกกำหนดเวลาไว้ดังนั้นมันจึงไม่ใช้ทรัพยากรในขณะที่เธรดที่รออยู่บน spinlock ทำ การล็อคระบบเรียลไทม์ (ยากมาก) เป็นหัวข้อที่แตกต่างกันและฉันไม่มีความรู้เพียงพอที่จะตอบคำถาม - บางครั้งระบบอาจใช้การบริจาคที่มีลำดับความสำคัญสูงหรือเทคนิคอื่น ๆ
Maciej Piechotka

2

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

สามารถใช้เซมาฟอร์ในบริบทของกระบวนการโดยที่การนอนหลับก็โอเค


1

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

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

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

แหล่งที่มา: ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมระบบระบบปฏิบัติการและวิกิพีเดีย

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