Neden semafor yerine bir monitör kullanasınız?


11

Şu anda üniversitemde eşzamanlı programlama kursuna katılıyorum ve yakın zamanda bir monitör kavramı hakkında konuşmaya başladık. Karşılıklı dışlamanın gerekliliğini anlasam da, bunun için neden bir monitör kullanacağımı anlamıyorum.

Anladığım kadarıyla, bir monitör her zaman kritik bölümde tam olarak bir veya hiç sürecin olmadığını garanti eder. Tam olarak bunu bir semaforla başarabiliriz. Ayrıca semaforlu monitörler uyguluyoruz (veya bunları uygulamak için en az bir olasılık).

Peki neden semaforlu bir semaforla aynı şeyi yapan bir şey uygulayayım ki? Ne gibi avantajlar elde ederim?

Yanıtlar:


8

Neredeyse birbirinin yerine kullanılabilirler ve biri diğerinden yapılabilir. Biraz dile bağlı olan / tercih edilen (örneğin Java'da "senkronize" anahtar kelimesini kullanan yerleşik monitörler vardır). Ancak semafor aşağıdaki nedenlerden ve farklılıklardan dolayı monitörden "düşük seviye" bir varlık olarak kabul edilir:

Hem Monitörler hem de Semaforlar aynı amaç için kullanılır - iplik senkronizasyonu. Ancak, monitörlerin kullanımı semaforlardan daha basittir çünkü kilit alma ve serbest bırakmanın tüm ayrıntılarını işlerler. Semaforlar kullanan bir uygulama, uygulama sona erdiğinde bir iş parçacığının aldığı kilitleri serbest bırakmak zorundadır - bu, uygulamanın kendisi tarafından yapılmalıdır. Uygulama bunu yapmazsa, paylaşılan kaynağa ihtiyaç duyan başka bir iş parçacığı devam edemez.

Semaforları kullanırken bir başka fark, paylaşılan bir kaynağa erişen her rutinin, kaynağı kullanmadan önce açıkça bir aa kilidi alması gerektiğidir. Bu, çoklu kullanım ile ilgili rutinleri kodlarken kolayca unutulabilir. Monitörler, semaforların aksine, gerekli kilitleri otomatik olarak alır. [1]

Ayrıca yüksek oy alan Stack Overflow cevabı Semaphore ve Monitörler - fark nedir? umumi tuvaletler ve bisiklet standlarına büyük / unutulmaz bir benzetme ile.


Temel olarak semaforlarla yapacağım aynı şeyi yapıyorum, ancak karşılıklı dışlama sağlarken ona verilere erişmesini (ve manipüle etmesini) sağlayan bir arabirim vererek programcıdan Kilitleme / Kilit Açma ihtiyacını ortadan kaldırıyorum. Bir fayda daha temiz kod ve kodda potansiyel olarak daha az hata olacaktır çünkü Kilitleme / Kilidi Açmayı unutamazsınız (potansiyel olarak bozuk verilere neden olur). Bu doğru mu yoksa bir şey mi kaçırıyorum?
Dennis Hein

Referans verilen metin, monitörleri kullanırken kilit alımına ve serbest bırakılmasına gerek olmadığını söyleyerek yanıltıcıdır. Java'nın senkronize edilmiş anahtar kelimesini kullanırken bu doğru olabilir , ancak en.wikipedia.org/wiki/Monitor_(senkronizasyon) 'a göre , genellikle monitörün durum değişkenleri uygulamada da uygulanması gereken bekleme / sinyal çağrılarına sahiptir. Ancak uygulamada muteksi işlemeye gerek yoktur, bu nedenle kullanımı daha kolay olabilir.
samutamm

5

Nihayet bugün derste semafor yerine bir monitör kullanacağınızı tartıştık.

Temel olarak buna gelir: Monitör ve semafor eşit derecede etkileyici, yani orijinal olarak bir semaforun kullanıldığı bir monitörle ilgili bir soruna bir çözüm bulabilir ve tersi de geçerlidir.

Bunu zaten biliyorduk, neden semafor yerine bir monitör kullanasınız ki?

Kişisel tercih. Normalde bir masaüstü uygulaması, monitörleri kullanır ve hata olasılığını azaltır, ancak takas olarak göreli olarak şişirilmiş bir yapıya sahiptir. Öte yandan semaforlar, hafif bir yapı olduğu için işletim sistemlerinde sıklıkla kullanılır, ancak hatalara daha fazla olasılık bırakır.

Bir monitör veya semafor kullanmaya ihtiyacınız olsun veya olmasın durumsal bir karar olduğu sonucuna varabiliriz. Gerçek zamanlı bir sistem oluşturursanız, bir semaforla gitmek isteyebilirsiniz, bir ofis programı oluşturuyorsanız, bir monitörle de gidebilirsiniz.


1

Örneğin "Küçük sempaphores kitabı" na bir göz atınAllen B. Downey tarafından. birçok senkronizasyon problemini belirtir ve çözer. Özellikle botch çözümleri kontrol edin, ve semaforların çok düşük seviyeli bir mechaizm olduğunu göreceksiniz, basit hataların korkunç sonuçlara sahip olduğu (eşzamanlı programların doğal olmayan belirsiz çalışmasıyla daha da kötüleşen) çok güçlü ama kötüye kullanımı son derece kolaydır. Örneğin karşılıklı dışlamayı zorlamayı, yanlış semaforda çalışmayı vb. Unutmak kolaydır. Monitörler, en sık kullanılan durumlara önceden paketlenmiş çözümler sunar ve nesne yönelimli programlamanın avantajlarının çoğunu yanlarında taşır (yani, monitör tarafından yönetilen değişkenlerle uğraşmanın tek yolunun işlemleri aracılığıyla olduğunu biliyorsunuz). Dezavantajı, nesneye yönelik olmayan dillere kolayca uyarlanamamalarıdır,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.