ความแตกต่างระหว่าง Mutex และ Semaphore (พร้อมตาราง)

สารบัญ:

Anonim

การจัดการความสมบูรณ์ของข้อมูลที่ใช้ร่วมกันนั้นอาศัยการซิงโครไนซ์กระบวนการเป็นอย่างมาก สำหรับการจัดการกับปัญหาส่วนสำคัญ มีทั้งโซลูชันซอฟต์แวร์และฮาร์ดแวร์ ในทางกลับกัน โซลูชันฮาร์ดแวร์สำหรับปัญหาส่วนวิกฤตนั้นดำเนินการได้ยากมาก มาตรวจสอบและเปรียบเทียบ Mutex และ Semaphore สองโซลูชันแอปพลิเคชันสำหรับจัดการกับปัญหาส่วนที่สำคัญ

Mutex กับ Semaphore

ความแตกต่างระหว่าง mutex และ Semaphore คือ semaphore เป็นกระบวนการส่งสัญญาณ ซึ่งหมายความว่ากระบวนการใช้ wait() และ signal() เพื่อแสดงว่าพวกเขากำลังได้รับหรือกำลังจะปล่อยทรัพยากร ในขณะที่ mutex เป็นวิธีที่ล็อคได้ ซึ่งหมายความว่าหากการดำเนินการต้องการรับทรัพยากร จะต้องได้รับล็อกบนวัตถุ mutex ก่อน

Mutex ย่อมาจาก Mutual Exclusion Object เป็นประเภทของสัญญาณไบนารีที่ใช้ในการจำกัดการเข้าถึงทรัพยากรที่ใช้ร่วมกัน เพื่อป้องกันข้อกังวลเรื่องการกลับรายการที่มีลำดับความสำคัญเป็นเวลานาน จึงมีกลไกการสืบทอดลำดับความสำคัญ อนุญาตให้บล็อกงานที่มีลำดับความสำคัญสูงกว่าที่มีอยู่ภายในระยะเวลาน้อยที่สุด ในทางกลับกัน การสืบทอดลำดับความสำคัญไม่ได้แก้ไขการผกผันของลำดับความสำคัญ ค่อนข้างจะลดผลกระทบ

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

ตารางเปรียบเทียบระหว่าง Mutex และ Semaphore

พารามิเตอร์ของการเปรียบเทียบ

Mutex

สัญญาณ

กลไก

มันเป็นระบบล็อค มันเป็นระบบสัญญาณบางอย่าง
วัตถุประสงค์

เธรดแสดงโดย mutex กระบวนการแสดงด้วยสัญญาณ
ธรรมชาติ

Mutex มักจะเป็นอะตอมและเอกพจน์ สัญญาณเป็นอะตอมในธรรมชาติ แต่ไม่ใช่เอกพจน์
ประเภทข้อมูล

Mutex เป็นเพียงชิ้นส่วนของซอฟต์แวร์เท่านั้น สัญญาณเป็นตัวแปรที่มีค่าจำนวนเต็ม
ประเภท

Mutex ไม่มีประเภทย่อยใดๆ การนับและสัญญาณไบนารีเป็นสัญญาณสองประเภท
การดัดแปลง

เฉพาะกระบวนการที่สามารถร้องขอหรือปล่อยทรัพยากรเท่านั้นที่สามารถแก้ไขได้ สัญญาณสามารถปรับเปลี่ยนได้โดยใช้ฟังก์ชันรอและสัญญาณ

Mutex คืออะไร?

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

เมื่อใดก็ตามที่โปรแกรมขอทรัพยากรจากระบบ ระบบจะสร้างอ็อบเจ็กต์ mutex ด้วยเอกลักษณ์หรือ ID เฉพาะ ด้วยเหตุนี้ เมื่อใดก็ตามที่โปรแกรมต้องการใช้ทรัพยากรนั้น โปรแกรมจะล็อกวัตถุไว้ จากนั้นโปรแกรมจะใช้ทรัพยากรก่อนที่จะปล่อยวัตถุ mutex ในที่สุด วัตถุ mutex สามารถสร้างและใช้งานโดยโปรแกรมอื่นในลักษณะเดียวกันได้

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

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

เซมาฟอร์คืออะไร?

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

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

ใน Binary Semaphores ค่าของตัวแปร semaphore จะเป็น 0 หรือ 1 เมื่อโปรเซสต้องการใช้ทรัพยากร จะมีการเรียกใช้เมธอด wait() และค่าของ semaphore จะถูกปรับเป็น 0 จาก 1 กระบวนการจึงทำให้ การใช้ทรัพยากรและหลังจากทำเสร็จแล้วจะเรียกเมธอด signal() และค่าของตัวแปรสัญญาณถูกกำหนดเป็น 1 หากค่าของตัวแปรสัญญาณเป็น 0 ณ จุดที่กำหนดในเวลาและโปรแกรมอื่นต้องการ ในการเข้าถึงทรัพยากรเดียวกันนั้น จะต้องรอให้โปรแกรมก่อนหน้าทำการไล่เบี้ยให้ฟรี การซิงโครไนซ์กระบวนการสามารถทำได้ในลักษณะนี้ มันเทียบได้กับ mutex แต่มันไม่ได้ล็อคอะไรเลย

ความแตกต่างหลักระหว่าง Mutex และ Semaphore

บทสรุป

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

อ้างอิง

ความแตกต่างระหว่าง Mutex และ Semaphore (พร้อมตาราง)