มิวเท็กซ์ vs Semaphore – ความแตกต่างระหว่างพวกเขา
ความแตกต่างที่สำคัญระหว่าง Mutex และ Semaphore
- Mutex เป็นกลไกการล็อคในขณะที่ Semaphore เป็นกลไกการส่งสัญญาณ
- Mutex เป็นเพียงวัตถุในขณะที่ Semaphore เป็นจำนวนเต็ม
- Mutex ไม่มีชนิดย่อย ในขณะที่เซมาฟอร์มีสองประเภท: การนับเซมาฟอร์และเซมาฟอร์ไบนารี
- Semaphore รองรับการปรับเปลี่ยนการดำเนินการรอและสัญญาณ ในขณะที่มิวเท็กซ์จะถูกปรับเปลี่ยนโดยกระบวนการที่อาจร้องขอหรือปล่อยทรัพยากรเท่านั้น
- Semaphore ค่าจะถูกปรับเปลี่ยนโดยใช้การดำเนินการ wait () และ signal () ในทางกลับกัน การดำเนินการ Mutex จะถูกล็อคหรือปลดล็อค
ที่นี่ฉันได้วิเคราะห์ความแตกต่างระหว่าง Mutex และ Semaphore และจะประเมินข้อดีข้อเสียอย่างครอบคลุม
ข้อเท็จจริงทั่วไปเกี่ยวกับ Mutex และ Semaphore
จากการฝึกของฉัน นี่คือข้อเท็จจริงทั่วไปบางประการเกี่ยวกับ Mutex เทียบกับ Semaphore:
- มีเพียงงานเดียวเท่านั้นที่สามารถรับ mutex ได้ ดังนั้น mutex จึงมีความเป็นเจ้าของ และมีเพียงเจ้าของเท่านั้นที่สามารถปล่อยมันได้
- เหตุผลในการใช้ mutex และ semaphore แตกต่างกันอาจเนื่องมาจากความคล้ายคลึงกันในการนำไปใช้งาน mutex จึงถูกเรียกว่า binary semaphore
- ความเข้าใจผิดอย่างหนึ่งที่ทราบกันดีคือ Mutexes และ Semaphores เกือบจะเหมือนกัน โดยมีข้อแตกต่างเพียงอย่างเดียวคือ Mutex สามารถนับถึง 1 ได้ในขณะนั้น Semaphoreสามารถนับ 0 ถึง N ได้
- มีความไม่แน่นอนอยู่เสมอระหว่างสัญญาณไบนารีและ mutex คุณอาจได้ยินว่า mutex เป็นสัญญาณไบนารีซึ่งไม่ถูกต้อง
อะไรคือ a Semaphore?
เซมาฟอร์ เป็นเพียงตัวแปรที่ไม่เป็นลบและแชร์กันระหว่างเธรด เซมาโฟร์เป็นกลไกการส่งสัญญาณ และเธรดที่กำลังรอเซมาโฟร์สามารถส่งสัญญาณโดยเธรดอื่นได้ โดยใช้การดำเนินการอะตอมมิกสองอย่างคือ 1) รอ และ 2) สัญญาณสำหรับ การซิงโครไนซ์กระบวนการ.
A สัญญาณ อนุญาตหรือไม่อนุญาตการเข้าถึงทรัพยากร ซึ่งขึ้นอยู่กับวิธีการตั้งค่า
การใช้งานของ Semaphore
ในกรณีที่มีบัฟเฟอร์เดียว เราสามารถแยกบัฟเฟอร์ 4 KB ออกเป็นบัฟเฟอร์ 1 KB จำนวน XNUMX ชุดได้ Semaphore สามารถเชื่อมโยงกับบัฟเฟอร์ทั้งสี่นี้ได้ ซึ่งจะช่วยให้ผู้ใช้และผู้ผลิตสามารถทำงานกับบัฟเฟอร์ที่แตกต่างกันได้ในเวลาเดียวกัน
ข้อดีของการ Semaphore
ในทางปฏิบัติของฉัน นี่คือข้อดีที่สำคัญของการใช้เซมาฟอร์:
- อนุญาตให้มีมากกว่าหนึ่งเธรดในการเข้าถึงส่วนที่สำคัญ
- Semaphores เป็นอิสระจากเครื่องจักร
- Semaphores ถูกนำไปใช้ในโค้ดที่ไม่ขึ้นอยู่กับเครื่องของไมโครเคอร์เนล
- พวกเขาไม่อนุญาตให้หลายกระบวนการเข้าสู่ส่วนที่สำคัญ
- เนื่องจากมีกำหนดการรอที่ยุ่งวุ่นวายในเซมาฟอร์ จึงไม่เสียเวลาและทรัพยากรในการดำเนินการ
- พวกมันไม่ขึ้นกับเครื่องจักร ซึ่งควรรันในโค้ดที่ไม่ขึ้นกับเครื่องจักรของไมโครเคอร์เนล
- ช่วยให้สามารถจัดการทรัพยากรได้อย่างยืดหยุ่น
ข้อเสียของ Semaphores
นี่คือข้อเสียของเซมาฟอร์ที่ฉันพบ
- ข้อจำกัดที่ใหญ่ที่สุดประการหนึ่งของเซมาฟอร์คือการผกผันลำดับความสำคัญ
- ระบบปฏิบัติการจะต้องติดตามการโทรทั้งหมดเพื่อรอและส่งสัญญาณเซมาโฟร์
- การใช้งานของพวกเขาไม่เคยมีการบังคับใช้ แต่เป็นไปตามแบบแผนเท่านั้น
- เพื่อหลีกเลี่ยงการหยุดชะงักในเซมาโฟร์ การรอและ Signal การดำเนินการต้องดำเนินการตามลำดับที่ถูกต้อง
- Semaphore การเขียนโปรแกรมเป็นวิธีการที่ซับซ้อน ดังนั้นจึงมีโอกาสที่จะไม่สามารถแยกออกจากกันได้
- นอกจากนี้ยังไม่ใช่วิธีการในทางปฏิบัติสำหรับการใช้งานขนาดใหญ่เนื่องจากการใช้งานนำไปสู่การสูญเสียความเป็นโมดูล
- Semaphore มีแนวโน้มที่จะเกิดข้อผิดพลาดของโปรแกรมเมอร์มากขึ้น
- อาจทำให้ การหยุดชะงัก หรือการละเมิดการยกเว้นร่วมกันเนื่องจากข้อผิดพลาดของโปรแกรมเมอร์
Mutex คืออะไร?
Mutex รูปแบบเต็มคือ Mutual Exclusion Object เป็นเซมาฟอร์ไบนารีชนิดพิเศษที่ใช้สำหรับควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกัน ประกอบด้วยกลไกการสืบทอดลำดับความสำคัญเพื่อหลีกเลี่ยงปัญหาการผกผันลำดับความสำคัญที่ขยายออกไป ช่วยให้งานที่มีลำดับความสำคัญสูงกว่าในปัจจุบันถูกเก็บไว้ในสถานะที่ถูกบล็อกโดยใช้เวลาสั้นที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตาม การสืบทอดลำดับความสำคัญไม่ได้แก้ไขการกลับลำดับความสำคัญ แต่จะลดผลกระทบให้เหลือน้อยที่สุดเท่านั้น
การใช้ Mutex
มิวเท็กซ์จะให้การแยกกันซึ่งกันและกัน ซึ่งอาจเป็นผู้ผลิตหรือผู้บริโภคที่สามารถมีคีย์ (มิวเท็กซ์) และดำเนินการกับงานของตนได้ ตราบใดที่ผู้ผลิตเติมบัฟเฟอร์ ผู้ใช้จะต้องรอ และในทางกลับกัน ในการล็อกมิวเท็กซ์ เธรดเดียวเท่านั้นที่สามารถทำงานกับบัฟเฟอร์ทั้งหมดได้เสมอ
ข้อดีของ Mutex
จากสิ่งที่ฉันสังเกต นี่คือคุณประโยชน์หลักของ Mutex:
- Mutex เป็นเพียงล็อคง่ายๆ ที่ได้รับก่อนเข้าสู่ส่วนวิกฤติแล้วปล่อยมัน
- เนื่องจากมีเพียงเธรดเดียวเท่านั้นที่อยู่ในส่วนวิกฤติในช่วงเวลาหนึ่งๆ จึงไม่มีสภาวะการแข่งขัน และข้อมูลยังคงสอดคล้องกันอยู่เสมอ
ข้อเสียของ Mutex
ในทางปฏิบัติของฉัน ฉันได้ระบุข้อเสียหลายประการของ Mutex
- หากเธรดได้รับการล็อคและเข้าสู่โหมดสลีปหรือถูกยึดไว้ล่วงหน้า จากนั้นเธรดอื่นอาจไม่สามารถก้าวไปข้างหน้าได้ สิ่งนี้อาจนำไปสู่ความอดอยาก
- ไม่สามารถล็อคหรือปลดล็อคจากบริบทที่แตกต่างจากที่ได้รับมา
- ควรอนุญาตให้ใช้เธรดเดียวเท่านั้นในส่วนที่สำคัญในแต่ละครั้ง
- การใช้งานตามปกติอาจทำให้สถานะรอไม่ว่าง ซึ่งทำให้เสียเวลา CPU
ความแตกต่างระหว่าง Semaphore และมิวเท็กซ์
จากสิ่งที่ฉันได้เรียนรู้จากการทำงานร่วมกับพวกเขา นี่คือวิธี Mutexes และ Semaphoreแตกต่างกัน:
พารามิเตอร์ | Semaphore | มิวเท็กซ์ |
---|---|---|
กลไก | เป็นกลไกการส่งสัญญาณชนิดหนึ่ง | มันเป็นกลไกการล็อค |
ประเภทข้อมูล | Semaphore เป็นตัวแปรจำนวนเต็ม | Mutex เป็นเพียงวัตถุ |
การเปลี่ยนแปลง | การดำเนินการรอและสัญญาณสามารถปรับเปลี่ยนเซมาโฟร์ได้ | ได้รับการแก้ไขโดยกระบวนการที่อาจร้องขอหรือปล่อยทรัพยากรเท่านั้น |
การจัดการทรัพยากร | หากไม่มีทรัพยากรใดว่าง กระบวนการจะต้องใช้ทรัพยากรที่จะดำเนินการรอ ควรจะรอจนกว่าจำนวนเซมาโฟร์จะมากกว่า 0 | หากถูกล็อค กระบวนการต้องรอ ควรเก็บกระบวนการไว้ในคิว จำเป็นต้องเข้าถึงสิ่งนี้เฉพาะเมื่อมีการปลดล็อค mutex เท่านั้น |
ด้าย | คุณสามารถมีเธรดโปรแกรมได้หลายเธรด | คุณสามารถมีเธรดโปรแกรมได้หลายเธรดในมิวเท็กซ์แต่ไม่พร้อมกันได้ |
กรรมสิทธิ์ | ค่าสามารถเปลี่ยนแปลงได้โดยกระบวนการใดๆ ที่ปล่อยหรือรับทรัพยากร | การล็อคอ็อบเจ็กต์จะถูกปล่อยโดยกระบวนการเท่านั้น ซึ่งได้รับการล็อคไว้แล้วเท่านั้น |
ประเภท | ประเภทของ Semaphore กำลังนับเซมาโฟร์และไบนารีเซมาโฟร์ | Mutex ไม่มีชนิดย่อย |
Operaการ | Semaphore ค่าจะถูกแก้ไขโดยใช้การดำเนินการ wait () และ signal () | อ็อบเจ็กต์ Mutex ถูกล็อคหรือปลดล็อค |
การครอบครองทรัพยากร | จะถูกครอบครองถ้าทรัพยากรทั้งหมดถูกใช้ไปแล้ว และกระบวนการร้องขอทรัพยากรดำเนินการรอ () และบล็อกตัวเองจนกว่าจำนวนซีมาโฟร์จะกลายเป็น >1 | ในกรณีที่อ็อบเจ็กต์ถูกล็อคอยู่แล้ว กระบวนการที่ร้องขอทรัพยากรจะรอและเข้าคิวโดยระบบก่อนที่จะปลดล็อค |
สรุป
จากประสบการณ์ของฉัน สิ่งสำคัญในการเลือกใช้ระหว่างมิวเท็กซ์และเซมาโฟร์คือการรับรู้ถึงความแตกต่างในการใช้งานของมัน Semaphores เหมาะอย่างยิ่งสำหรับการซิงโครไนซ์ที่ซับซ้อน ในขณะที่มิวเท็กซ์เหมาะสำหรับการแยกกันโดยตรง ช่วยให้มั่นใจถึงความปลอดภัยของทรัพยากรในบริบทที่ง่ายกว่า