อะไรคือความแตกต่างพื้นฐานระหว่างสปินล็อคและเซมาฟอร์ในการทำงาน?
อะไรคือความแตกต่างพื้นฐานระหว่างสปินล็อคและเซมาฟอร์ในการทำงาน?
คำตอบ:
ทั้งจัดการทรัพยากรที่ จำกัด ฉันจะอธิบายความแตกต่างระหว่างสัญญาณแบบไบนารี (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)
Spinlocks ถูกใช้ในบริบทอินเตอร์รัปต์ซึ่งไม่อนุญาตให้หลับ พวกเขาสำรวจในวง จำกัด ไม่ทำอะไรเลยจนกว่าจะได้รับทรัพยากร ส่วนใหญ่ใช้ใน ISR และปลอดภัยและมีประสิทธิภาพมากขึ้น
สามารถใช้เซมาฟอร์ในบริบทของกระบวนการโดยที่การนอนหลับก็โอเค
นี่คือช็อตเด็ดของฉันที่คำตอบ: ล็อคแบบสปินและเซมาฟอร์ไบนารี (ซึ่งจัดการทรัพยากรที่สามารถใช้ได้เพียงอย่างเดียว) เกือบจะเหมือนกัน ความแตกต่างคือสปินล็อคจะจัดการโค้ดที่จะทำงานในขณะที่ไบนารีเซมาฟอร์จัดการทรัพยากรเอกพจน์บางอย่าง (เช่นเวลาซีพียู, เอาต์พุตที่แสดง)
เซมาฟอร์ปกติอย่างไรก็ตามสามารถจัดการหลายเธรดที่เข้าถึงทรัพยากรที่สามารถแบ่งได้หลาย ๆ อัน แต่ถูก จำกัด (เช่นหน่วยความจำแบนด์วิธเครือข่าย)
กล่าวโดยสรุปคือสปินล็อคมีแนวโน้มที่จะถามเซมาฟอร์หากสามารถใช้ทรัพยากรได้ (ลองนึกภาพเด็กที่ต้องใช้ห้องน้ำและรอให้คนอื่นทำจนจบ)
แหล่งที่มา: ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมระบบระบบปฏิบัติการและวิกิพีเดีย