Deadlock
- C kursu
- İleri seviye
- Ders 40/83
- 5 dk
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");.
Başlangıç kodu
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>
// iki dosya aç
// a, b sırayla kilit al ve yazdır
// b, a sırayla bırak, kapat ve sil
int main(void) {
return 0;
}Örnek çözüm
#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;
}Beklenen çıktı
sıralı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Deadlock'u önlemenin en yaygın yolu nedir?
- Daha fazla kilit almak
- Kilitleri hiç bırakmamak
- Sadece paylaşımlı kilit kullanmak
- Kilit sıralaması Doğru cevap
Açıklama: Kilit sıralaması döngüsel beklemeyi kırar.
2 Deadlock kavramlarını eşle
| Kavram | Anlamı |
|---|---|
Karşılıklı dışlama |
Tek sahip |
Sahiplenme |
Tut-bekle |
Döngüsel bekleme |
Çember |
Kilit sıralaması |
Önlem |
3 İlk kilit
flock(____, LOCK_EX);
flock(a, LOCK_EX);
Açıklama: Sıralı desende önce a, sonra b kilidi alınır.