Mengapa Anda menggunakan monitor alih-alih semafor?

11

Saat ini saya menghadiri kursus pemrograman bersamaan di universitas saya dan kami baru-baru ini mulai berbicara tentang konsep monitor. Sementara saya memahami perlunya saling pengecualian, saya tidak mengerti mengapa saya akan menggunakan monitor untuk itu.

Seperti yang saya pahami, monitor menjamin bahwa hanya satu atau tidak ada proses berada di bagian kritis setiap saat. Kita dapat mencapainya dengan semaphore. Selanjutnya kami menerapkan monitor (atau setidaknya satu kemungkinan untuk mengimplementasikannya) dengan semaphores.

Jadi mengapa saya menerapkan sesuatu yang melakukan hal yang persis sama dengan semaphore dengan semaphore? Apa manfaat yang saya dapatkan?

Dennis Hein
sumber

Jawaban:

8

Mereka hampir saling dipertukarkan dan satu dapat dibangun dari yang lain. Agak tergantung pada bahasa yang diterapkan / disukai (misalnya Java memiliki monitor bawaan menggunakan kata kunci "sinkronisasi"). Namun semaphore dianggap sebagai entitas "tingkat lebih rendah" daripada monitor karena alasan & perbedaan berikut:

Baik Monitor dan Semaphores digunakan untuk tujuan yang sama - sinkronisasi utas. Tetapi, monitor lebih mudah digunakan daripada semafor karena mereka menangani semua detail penguncian dan pelepasan kunci. Aplikasi yang menggunakan semaphores harus melepaskan kunci apa pun yang didapat utas saat aplikasi berakhir - ini harus dilakukan oleh aplikasi itu sendiri. Jika aplikasi tidak melakukan ini, maka utas lainnya yang membutuhkan sumber daya bersama tidak akan dapat dilanjutkan.

Perbedaan lain ketika menggunakan semaphores adalah bahwa setiap rutin mengakses sumber daya bersama harus secara eksplisit mendapatkan kunci sebelum menggunakan sumber daya. Ini dapat dengan mudah dilupakan ketika mengkodekan rutinitas yang berurusan dengan multithreading. Monitor, tidak seperti semaphores, secara otomatis mendapatkan kunci yang diperlukan. [1]

Lihat juga jawaban Stack Overflow Semaphore vs Monitor yang sangat terpilih - apa bedanya? dengan analogi yang hebat / mengesankan dengan toilet umum & stan sepeda.

vzn
sumber
Saya pada dasarnya melakukan hal yang sama yang akan saya lakukan dengan semaphores, tetapi saya menghilangkan kebutuhan Mengunci / Membuka Kunci dari programmer dengan memberinya antarmuka yang memungkinkan dia untuk mengakses (dan memanipulasi) data, sambil memastikan saling pengecualian. Manfaatnya adalah kode yang lebih bersih dan berpotensi lebih sedikit bug dalam kode karena Anda tidak dapat lupa untuk Mengunci / Membuka Kunci (menghasilkan data yang berpotensi rusak). Apakah itu benar atau saya kehilangan sesuatu?
Dennis Hein
Teks yang direferensikan menyesatkan mengatakan, bahwa tidak perlu untuk akuisisi dan pelepasan kunci, saat menggunakan monitor. Itu mungkin benar ketika menggunakan kata kunci Java yang disinkronkan tetapi menurut en.wikipedia.org/wiki/Monitor_(synchronization) , biasanya variabel kondisi monitor memiliki panggilan tunggu / sinyal yang juga harus diterapkan dalam aplikasi. Tetapi tidak perlu menangani mutex dalam aplikasi jadi mungkin lebih mudah digunakan.
samutamm
5

Kami akhirnya membahas mengapa Anda akan menggunakan monitor alih-alih semafor di kuliah hari ini.

Ini pada dasarnya bermuara pada ini: Monitor dan semaphore sama-sama ekspresif, yang berarti Anda dapat menemukan solusi untuk masalah dengan monitor di mana awalnya semaphore digunakan dan sebaliknya.

Yah, kita sudah tahu itu, jadi mengapa Anda menggunakan monitor, bukan semafor?

Pilihan Pribadi. Biasanya aplikasi desktop akan menggunakan monitor, menyisakan lebih sedikit kemungkinan untuk kesalahan, tetapi, sebagai imbalan, memiliki struktur yang kembung secara relatif. Semaphores di sisi lain sering digunakan dalam sistem operasi, karena mereka adalah struktur yang ringan, tetapi meninggalkan lebih banyak kemungkinan untuk kesalahan.

Saya kira kita dapat menyimpulkan bahwa ini adalah keputusan situasional apakah atau tidak Anda perlu / ingin menggunakan monitor atau semaphore. Jika Anda membangun sistem waktu nyata Anda mungkin ingin menggunakan semaphore, jika Anda sedang membangun program kantor Anda mungkin juga pergi dengan monitor.

Dennis Hein
sumber
1

Mengintip misalnya "Buku kecil sempaphores"oleh Allen B. Downey. itu menyatakan dan memecahkan banyak masalah sinkronisasi. Periksa khususnya solusi yang gagal, dan Anda akan melihat bahwa semaphore adalah mechaisme tingkat sangat rendah, sangat kuat tetapi sangat mudah disalahgunakan, di mana kesalahan sederhana memiliki konsekuensi yang mengerikan (diperburuk oleh operasi inheren nondeterministik dari program bersamaan). Misalnya, mudah untuk melupakan penerapan pengecualian bersama, beroperasi pada semafor yang salah, dan sebagainya. Monitor menawarkan solusi terpaket untuk kasus-kasus yang paling sering digunakan, dan membawa serta sebagian besar keuntungan pemrograman berorientasi objek (yaitu, Anda tahu satu-satunya cara untuk mengacaukan variabel yang dikelola oleh monitor adalah melalui operasinya). Kerugiannya adalah mereka tidak dapat dipasang dengan mudah ke bahasa yang tidak berorientasi objek,

vonbrand
sumber