C
Deadlock
Deadlock kavramını ve nasıl önleneceğini öğrenirsin.
Deadlock nedir?
Deadlock, iki veya daha çok sürecin birbirinin tuttuğu kilitleri beklemesiyle oluşan kilitlenmedir. Süreç A X'i, süreç B Y'yi kilitler; A Y'yi, B X'i bekler. Hiçbileri ilerleyemez ve program donar.
Dört koşul aynı anda oluşursa deadlock çıkar: karşılıklı dışlama, sahiplenme, bekleme, döngüsel bekleme. En yaygın önlem kilit sıralamasıdır: tüm süreçler kilitleri aynı sırayla alır. Önce a, sonra b; önce b, sonra a yerine. Böylece döngü oluşmaz. F_SETLK gibi beklemez çağrılar ve LOCK_NB bayrağı da çıkmazlar sağlar.
Sıralı kilit deseni
İki dosya kilidi gerektiğinde sıralamayı sabit tut. Önce a dosyasını, sonra b dosyasını kilitle. Bırakırken ters sırayla yap: önce b, sonra a. Bu, başka bir sürecin farklı sırada kilit alıp deadlock oluşturmasını engeller.
Test için iki dosya açıp sırayla kilitle: int a = open("/tmp/cb_a.txt", O_CREAT | O_RDWR, 0644); int b = open("/tmp/cb_b.txt", O_CREAT | O_RDWR, 0644);. flock(a, LOCK_EX); flock(b, LOCK_EX); ile sırayla al, printf("sıralı\n"); yazdır. Bırakma: flock(b, LOCK_UN); flock(a, LOCK_UN);. Son olarak close ve unlink ile temizle.
Uygulama Sıralı kilit al
int a = open("/tmp/cb_a.txt", O_CREAT | O_RDWR, 0644); ve int b = open("/tmp/cb_b.txt", O_CREAT | O_RDWR, 0644); ile iki dosya aç. flock(a, LOCK_EX); flock(b, LOCK_EX); ile sırayla kilit al. printf("sıralı\n");. flock(b, LOCK_UN); flock(a, LOCK_UN); ile bırak. close(a); close(b); ve unlink("/tmp/cb_a.txt"); unlink("/tmp/cb_b.txt");.
Örnek çözümü göster
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>
int main(void) {
int a = open("/tmp/cb_a.txt", O_CREAT | O_RDWR, 0644);
int b = open("/tmp/cb_b.txt", O_CREAT | O_RDWR, 0644);
flock(a, LOCK_EX);
flock(b, LOCK_EX);
printf("sıralı\n");
flock(b, LOCK_UN);
flock(a, LOCK_UN);
close(a);
close(b);
unlink("/tmp/cb_a.txt");
unlink("/tmp/cb_b.txt");
return 0;
}
Kendini test et
-
Deadlock'u önlemenin en yaygın yolu nedir?
- Daha fazla kilit almak
- Kilitleri hiç bırakmamak
- Sadece paylaşımlı kilit kullanmak
- Kilit sıralaması
Cevabı göster
Kilit sıralaması — Kilit sıralaması döngüsel beklemeyi kırar.
-
Deadlock kavramlarını eşle
- Karşılıklı dışlama
- Tek sahip
- Sahiplenme
- Tut-bekle
- Döngüsel bekleme
- Çember
- Kilit sıralaması
- Önlem
-
İlk kilit
flock(____, LOCK_EX);
Cevabı göster
flock(a, LOCK_EX);
Sıradaki ders: Otomatik kilit temizleme