apa perbedaan antara kunci pengunci dan semafor?

15

Apa perbedaan mendasar antara penguncian putaran dan semafor dalam aksi?

Renjith G
sumber
kemungkinan duplikat dari Apa itu spinlock di Linux?
Gilles 'SO- stop being evil'
@Gilles Saya melihat yang itu juga, tetapi satu-satunya penyebutan semafor pada halaman adalah Warren berkomentar bahwa "Jika seseorang ingin mengetahui perbedaan antara kunci putaran dan, katakanlah, semafor, itu pertanyaan yang berbeda."
Michael Mrozek
@ Michael: ok, saya pikir jawaban di sana membahas poin utama, tetapi Anda benar bahwa tidak ada yang secara eksplisit menyatakan bahwa semaphore adalah salah satu dari jenis kunci lainnya.
Gilles 'SO- stop being evil'
Penjelasan oleh Linus Torvalds: yarchive.net/comp/linux/semaphores.html
myaut
Duplikat stackoverflow.com/questions/195853/spinlock-versus-semaphore Banyak penjelasan bagus ada di utas yang saya tanyakan.
iankits

Jawaban:

13

Keduanya mengelola sumber daya yang terbatas. Pertama saya akan menjelaskan perbedaan antara binary semaphore (mutex) dan spin lock.

Putar kunci menjalankan menunggu sibuk - yaitu itu terus berjalan:

while (try_acquire_resource ());
...
release();

Ini melakukan penguncian / penguncian yang sangat ringan tetapi jika utas penguncian akan didahului oleh yang lain yang akan mencoba untuk mengakses sumber daya yang sama, yang kedua hanya akan mencoba untuk mengambil sumber daya sampai kehabisan CPU kuanta.

Di sisi lain, perilaku mutex lebih seperti:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

Karenanya, jika utas akan mencoba memperoleh sumber daya yang diblokir, ia akan ditangguhkan hingga tersedia. Mengunci / membuka kunci jauh lebih berat tetapi penantiannya 'gratis' dan 'adil'.

Semaphore adalah kunci yang diizinkan untuk digunakan berkali-kali (diketahui dari inisialisasi) beberapa kali - misalnya 3 utas diizinkan untuk secara bersamaan memegang sumber daya tetapi tidak lebih. Ini digunakan misalnya dalam masalah produsen / konsumen atau secara umum dalam antrian:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
Maciej Piechotka
sumber
Penjelasan yang bagus, saya hanya ingin menekankan satu poin. Semaphore vs mutex adalah masalah antarmuka: sebuah mutex dipegang atau tidak, sementara semaphore dipegang hingga hingga N utas; mutex adalah kasus khusus semaphore dengan N = 1. Spinlock vs jenis kunci lainnya adalah masalah implementasi: spinlock terus berusaha mendapatkan kunci, sedangkan jenis lainnya menunggu pemberitahuan. Dalam konteks kernel Linux, satu-satunya kunci dengan implementasi putaran memiliki antarmuka mutex.
Gilles 'SO- stop being evil'
Dalam konteks kernel Linux, satu-satunya kunci dengan implementasi putaran memiliki antarmuka mutex. Saya tidak mengerti baris ini. Bisakah Anda mengembangkannya?
Sen
@ Sen: Maksudnya spin lock di Linux berperilaku biner (terkunci atau tidak). Dimungkinkan untuk memiliki kunci pemintalan yang berfungsi sebagai semafor.
Maciej Piechotka
“Tetapi jika utas penguncian akan didahului oleh pihak lain yang akan mencoba mengakses sumber daya yang sama, yang kedua hanya akan mencoba untuk mengambil sumber daya sampai kehabisan CPU quanta.”: Tetapi masalah masih ada pada Mutex juga. Bagaimana jika tugas dengan prioritas lebih banyak perlu mengakses sumber daya ... apakah itu baru saja diantrikan? Mungkin lebih baik untuk membatalkan berbagi sumber daya antara tugas dengan prioritas yang berbeda.
Hibou57
@ Hibou57: Ya itu diblokir karena negara tidak konsisten dan menggunakan sumber daya akan memiliki efek 'lucu' (misalnya utas prioritas rendah berada di tengah menambah atau menghapus sesuatu ke / dari daftar tertaut). Maksud dari pernyataan ini adalah bahwa jika utas diblokir maka tidak dijadwalkan sehingga tidak menggunakan sumber daya sementara utas menunggu pada spinlock. Mengunci untuk sistem waktu nyata (terutama yang sulit) adalah topik yang berbeda dan saya tidak memiliki pengetahuan yang cukup untuk menjawabnya - namun sistem itu terkadang menerapkan sumbangan prioritas atau teknik lainnya.
Maciej Piechotka
2

Spinlocks digunakan dalam konteks interupsi, di mana tidur tidak diperbolehkan. Mereka melakukan jajak pendapat dalam lingkaran yang ketat, tidak melakukan apa-apa lagi sampai sumber daya diperoleh. Paling banyak digunakan dalam ISR, dan lebih aman dan efisien.

Semafor dapat digunakan dalam konteks proses, di mana tidur ok.

Kapil
sumber
1

Inilah jawaban cepat saya pada jawaban: kunci pengunci dan semaphore biner (yang mengelola sumber daya yang hanya dapat digunakan oleh satu hal) hampir identik. Perbedaan mereka adalah bahwa kunci kunci mengelola kode yang akan dijalankan sementara semaphore biner mengelola beberapa jenis sumber daya tunggal (misalnya waktu cpu, menampilkan output)

Semafor biasa, namun mampu mengelola beberapa utas mengakses sumber daya yang dapat dibagi di antara beberapa, tetapi terbatas (misalnya memori, bandwidth jaringan)

Singkatnya, spin-lock kemungkinan akan terus menanyakan semafor jika dapat menggunakan sumber daya. (Bayangkan seorang anak harus menggunakan kamar mandi dan menunggu orang lain selesai.)

Sumber: Pengantar Pemrograman Sistem, Sistem Operasi, dan wikipedia

valbaca
sumber