Bisakah seseorang tolong jelaskan dengan contoh (kode) apa perbedaan antara kebuntuan dan livelock ?
multithreading
pthreads
deadlock
livelock
macindows
sumber
sumber
Jawaban:
Diambil dari http://en.wikipedia.org/wiki/Deadlock :
sumber
Livelock
Perbedaan utama antara livelock dan jalan buntu adalah bahwa utas tidak akan diblokir, sebaliknya mereka akan mencoba saling merespons secara terus menerus.
Pada gambar ini, kedua lingkaran (utas atau proses) akan mencoba memberi ruang kepada yang lain dengan bergerak ke kiri dan ke kanan. Tetapi mereka tidak bisa bergerak lebih jauh.
sumber
Semua konten dan contoh di sini berasal
Sistem Operasi: Internal dan Prinsip Desain
William Stallings
Edisi 8º
Jalan buntu : Situasi di mana dua atau lebih proses tidak dapat dilanjutkan karena masing-masing menunggu satu sama lain untuk melakukan sesuatu.
Sebagai contoh, pertimbangkan dua proses, P1 dan P2, dan dua sumber daya, R1 dan R2. Misalkan setiap proses memerlukan akses ke kedua sumber daya untuk melakukan bagian dari fungsinya. Maka dimungkinkan untuk memiliki situasi berikut: OS menetapkan R1 ke P2, dan R2 ke P1. Setiap proses menunggu salah satu dari dua sumber. Tidak satu pun akan melepaskan sumber daya yang sudah dimiliki sampai memiliki sumber daya lain dan melakukan fungsi yang membutuhkan kedua sumber daya. Kedua proses menemui jalan buntu
Livelock : Situasi di mana dua atau lebih proses secara terus-menerus mengubah keadaan mereka sebagai respons terhadap perubahan dalam proses lain tanpa melakukan pekerjaan yang bermanfaat:
Kelaparan : Suatu situasi di mana proses runnable diabaikan tanpa batas oleh penjadwal; meskipun ia dapat melanjutkan, itu tidak pernah dipilih.
Misalkan tiga proses (P1, P2, P3) masing-masing memerlukan akses berkala ke sumber daya R. Pertimbangkan situasi di mana P1 memiliki sumber daya, dan kedua P2 dan P3 tertunda, menunggu sumber daya itu. Ketika P1 keluar dari bagian kritisnya, P2 atau P3 harus diizinkan mengakses R. Asumsikan bahwa OS memberikan akses ke P3 dan bahwa P1 lagi membutuhkan akses sebelum P3 menyelesaikan bagian kritisnya. Jika OS memberikan akses ke P1 setelah P3 selesai, dan kemudian secara bergantian memberikan akses ke P1 dan P3, maka P2 tanpa batas waktu dapat ditolak akses ke sumber daya, meskipun tidak ada situasi jalan buntu.
LAMPIRAN A - TOPIK DALAM KONSURENSI
Contoh kebuntuan
Jika kedua proses mengatur flag mereka menjadi true sebelum salah satu telah menjalankan pernyataan while, maka masing-masing akan berpikir bahwa yang lain telah memasuki bagian kritisnya, menyebabkan kebuntuan.
Contoh Livelock
[...] pertimbangkan urutan kejadian berikut:
Urutan ini dapat diperpanjang tanpa batas waktu, dan tidak ada proses yang bisa masuk ke bagian kritisnya. Sebenarnya, ini bukan jalan buntu , karena setiap perubahan dalam kecepatan relatif dari dua proses akan memutus siklus ini dan memungkinkan seseorang untuk memasuki bagian kritis. Kondisi ini disebut livelock . Ingat bahwa kebuntuan terjadi ketika serangkaian proses ingin memasuki bagian kritis mereka tetapi tidak ada proses yang bisa berhasil. Dengan livelock , ada kemungkinan urutan eksekusi yang berhasil, tetapi juga dimungkinkan untuk menggambarkan satu atau lebih urutan eksekusi di mana tidak ada proses yang pernah memasuki bagian kritisnya.
Tidak puas dari buku lagi.
Dan bagaimana dengan spinlocks?
Spinlock adalah teknik untuk menghindari biaya mekanisme kunci OS. Biasanya yang akan Anda lakukan:
Masalah mulai muncul ketika
beginLock()
harganya jauh lebih mahaldoSomething()
. Dalam istilah yang sangat luas, bayangkan apa yang terjadi ketikabeginLock
biaya 1 detik, tetapidoSomething
biaya hanya 1 milidetik.Dalam hal ini jika Anda menunggu 1 milidetik, Anda akan terhindar selama 1 detik.
Mengapa
beginLock
harganya sangat mahal? Jika kunci gratis tidak memerlukan biaya banyak (lihat https://stackoverflow.com/a/49712993/5397116 ), tetapi jika kunci tidak gratis OS akan "membekukan" utas Anda, siapkan mekanisme untuk membangunkan Anda ketika kunci dibebaskan, dan kemudian membangunkan Anda lagi di masa depan.Semua ini jauh lebih mahal daripada beberapa loop yang memeriksa kunci. Itulah sebabnya terkadang lebih baik melakukan "spinlock".
Sebagai contoh:
Jika implementasi Anda tidak hati-hati, Anda dapat jatuh cinta, menghabiskan semua CPU pada mekanisme kunci.
Lihat juga:
https://preshing.com/20120226/roll-your-own-lightweight-mutex/
Apakah implementasi penguncian spin saya benar dan optimal?
Ringkasan :
Deadlock : situasi di mana tidak ada yang maju, tidak melakukan apa-apa (tidur, menunggu dll.). Penggunaan CPU akan rendah;
Livelock : situasi di mana tidak ada kemajuan, tetapi CPU dihabiskan untuk mekanisme kunci dan bukan pada perhitungan Anda;
Kelaparan: situasi di mana satu penuntut tidak pernah mendapat kesempatan untuk lari; karena nasib buruk atau oleh beberapa propertinya (prioritas rendah, misalnya);
Spinlock : teknik menghindari biaya menunggu kunci dibebaskan.
sumber
DEADLOCK Deadlock adalah suatu kondisi di mana tugas menunggu tanpa batas untuk kondisi yang tidak pernah dapat dipenuhi - tugas mengklaim kontrol eksklusif atas sumber daya bersama - tugas memegang sumber daya sambil menunggu sumber daya lainnya akan dirilis - tugas tidak dapat dipaksa untuk melemahkan sumber daya - menunggu melingkar kondisi ada
LIVELOCK Kondisi Livelock dapat muncul ketika dua atau lebih tugas bergantung pada dan menggunakan beberapa sumber daya yang menyebabkan kondisi dependensi melingkar di mana tugas-tugas terus berjalan selamanya, sehingga memblokir semua tugas tingkat prioritas yang lebih rendah dari berjalan (tugas-tugas prioritas yang lebih rendah ini mengalami kondisi yang disebut kelaparan)
sumber
Mungkin dua contoh ini menggambarkan Anda perbedaan antara jalan buntu dan livelock:
Java-Contoh untuk kebuntuan:
Output sampel:
Java-Contoh untuk livelock:
Output sampel:
Kedua contoh memaksa utas untuk mendapatkan kunci dalam pesanan yang berbeda. Sementara kebuntuan menunggu kunci lainnya, livelock tidak benar-benar menunggu - itu mati-matian mencoba untuk mendapatkan kunci tanpa kesempatan mendapatkannya. Setiap percobaan mengkonsumsi siklus CPU.
sumber
Bayangkan Anda memiliki utas A dan utas B. Keduanya berada
synchronised
di objek yang sama dan di dalam blok ini ada variabel global yang keduanya diperbarui;Jadi, ketika benang A masuk dalam
while
lingkaran dan memegang kunci, itu tidak apa yang harus dilakukan dan mengaturcommonVar
untuktrue
. Kemudian benang B masuk, masuk dalamwhile
lingkaran dan karenacommonVar
initrue
sekarang, itu dapat memegang kunci. Itu melakukannya, mengeksekusisynchronised
blok, dan mengaturcommonVar
kembali kefalse
. Sekarang, benang A lagi mendapat itu jendela CPU baru, itu adalah tentang untuk keluar dariwhile
lingkaran tapi thread B baru saja mengatur kembali kefalse
, sehingga siklus berulang lagi. Utas melakukan sesuatu (jadi mereka tidak diblokir dalam arti tradisional) tetapi untuk hampir tidak ada.Mungkin juga menyenangkan untuk menyebutkan bahwa livelock tidak harus muncul di sini. Saya berasumsi bahwa scheduler lebih menyukai utas lainnya setelah
synchronised
blok selesai dieksekusi. Sebagian besar waktu, saya pikir itu adalah ekspektasi yang sulit dicapai dan tergantung pada banyak hal yang terjadi di bawah tenda.sumber