CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
flock(____, LOCK_EX);
Cevap
flock(a, LOCK_EX);

Açıklama: Sıralı desende önce a, sonra b kilidi alınır.

İleri seviye bölümündeki tüm dersler