ทำไมคุณถึงต้องใช้จอภาพแทนเซมาฟอร์?


11

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

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

เหตุใดฉันจึงต้องใช้บางสิ่งที่ทำเหมือนกับเซมาฟอร์กับเซมาฟอร์ ฉันจะได้รับประโยชน์อะไรบ้าง?

คำตอบ:


8

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

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

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

ดูเพิ่มเติม Stack Overflow ที่ได้รับการโหวตอย่างสูงจากSemaphore vs. Monitors - ความแตกต่างคืออะไร? ด้วยการเปรียบเทียบที่ยอดเยี่ยม / น่าจดจำกับห้องสุขาสาธารณะและแท่นวางจักรยาน


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

ข้อความอ้างอิงที่ทำให้เข้าใจผิดว่าไม่จำเป็นต้องมีการได้มาและล็อคเมื่อใช้จอภาพ นั่นอาจเป็นจริงเมื่อใช้คีย์เวิร์ดที่ซิงโครไนซ์ของ Java แต่ตามen.wikipedia.org/wiki/Monitor_(synchronization)โดยปกติแล้วตัวแปรสภาพของมอนิเตอร์จะมีการเรียกรอ / สัญญาณที่ควรนำมาใช้ในแอปพลิเคชัน แต่ไม่จำเป็นต้องจัดการ mutex ในแอปพลิเคชันดังนั้นอาจใช้งานง่ายกว่า
samutamm

5

ในที่สุดเราก็คุยกันว่าทำไมคุณถึงใช้มอนิเตอร์แทนเซมาฟอร์ในการบรรยายวันนี้

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

ทีนี้เรารู้แล้วว่าทำไมคุณจะใช้มอนิเตอร์แทนเซมาฟอร์?

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

ฉันเดาว่าเราสามารถสรุปได้ว่ามันเป็นการตัดสินใจตามสถานการณ์หรือไม่คุณต้องการ / ต้องการใช้จอภาพหรือเซมาฟอร์ หากคุณสร้างระบบเรียลไทม์คุณอาจต้องการไปกับสัญญาณถ้าคุณกำลังสร้าง programm office คุณอาจไปกับจอภาพ


1

ลองดูที่"หนังสือเล่มเล็ก ๆ ของเซมาปู"โดย Allen B. Downey ระบุและแก้ไขปัญหาการซิงโครไนซ์จำนวนมาก ตรวจสอบโดยเฉพาะอย่างยิ่งการแก้ปัญหาเรียบร้อยแล้วและคุณจะเห็นว่า semaphores เป็นกลไกในระดับต่ำมากที่ทรงพลังมาก แต่ง่ายมากในทางที่ผิดที่ผิดพลาดง่ายมี consecuences สาหัส (ทำยิ่งเลวร้ายยิ่ง มันเป็นเรื่องง่ายที่จะลืมบังคับใช้การกีดกันซึ่งกันและกันการใช้เซมาฟอร์ผิดและอื่น ๆ จอภาพเสนอวิธีแก้ปัญหาแบบ prepackaged ให้กับกรณีที่ใช้บ่อยที่สุดและนำข้อดีของการเขียนโปรแกรมเชิงวัตถุมาใช้ (เช่นคุณรู้วิธีเดียวที่จะยุ่งกับตัวแปรที่จัดการโดยจอภาพคือการใช้งาน) ข้อเสียคือไม่สามารถดัดแปลงเป็นภาษาที่ไม่ใช่เชิงวัตถุได้อย่างง่ายดาย

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