Sobes.tech
Junior

რა არის deadlock?

sobes.tech AI

პასუხი AI-სგან

დედლოკი (Deadlock) — ეს მდგომარეობაა, როდესაც ორი ან მეტი ნაკადი ან პროცესი ბლოკირებულია, ერთმანეთს ელოდებიან, რათა განაგრძონ შესრულება. ეს ხდება, როდესაც თითოეული ნაკადი ფლობს რესურსს, რომელიც საჭიროა სხვა ნაკადისთვის, და თავად ელოდება რესურსის გათავისუფლებას, რომელიც სხვა ნაკადმა დაიკავა.

ოთხი პირობაა, რომლებიც აუცილებელია დედლოკის წარმოქმნისთვის (კოფმანის პირობები):

  1. ურთიერთგამომრიცხველობა (Mutual Exclusion): რესურსი ვერ გამოიყენება ერთდროულად რამდენიმე პროცესის მიერ.
  2. შენახვა და ელოდება (Hold and Wait): ნაკადი, რომელიც უკვე ფლობს მინიმუმ ერთ რესურსს, ელოდება დამატებით რესურსებს, რომლებიც ამჟამად დაკავებულია სხვა ნაკადების მიერ.
  3. მაჟვარდობის აკრძალვა (No Preemption): რესურსებს ვერ აიძულებენ მიანიჭონ სხვა პროცესს. ისინი შეიძლება გათავისუფლდეს მხოლოდ თავად პროცესის მიერ, რომელიც მათ ფლობს.
  4. ციკლური ელოდება (Circular Wait): არსებობს ციკლური ელოდების ციკლი ორ ან მეტ ნაკადს შორის. მაგალითად, ნაკადი A ელოდება რესურსს, რომელიც დაკავებულია ნაკადი B-ის მიერ, რომელიც თავის მხრივ ელოდება რესურსს, რომელიც დაკავებულია ნაკადი C-ის მიერ, რომელიც ელოდება რესურსს, რომელიც დაკავებულია ნაკადი A-ის მიერ.

iOS-ის განვითარებაში დედლოკები ხშირად წარმოიქმნება კონკურენციის (მრავალთრაქტული) მუშაობის დროს, მაგალითად, GCD (Grand Central Dispatch) ან ოპერაციების რიგების არასათანადო გამოყენებისას:

  • ცალკე ბლოკის სინქრონული შესრულება იმ რიგში, სადაც უკვე იმყოფება მიმდინარე ნაკადი (მაგ., sync-ის გამოყენება main რიგში მთავარი ნაკადიდან).
  • ორი ნაკადი ცდილობს სხვადასხვა სემაფორის ან ლოკის დაკავებას სხვადასხვა წესით.

პროექტის მარტივი მაგალითი GCD-ის გამოყენებით:

func deadlockExample() {
    // მთავარი რიგი
    let mainQueue = DispatchQueue.main

    // სინქრონული ბლოკის შესრულება მთავარი რიგში მთავარი ნაკადიდან
    // მთავარი ნაკადი ელოდება ბლოკის დასრულებას,
    // ხოლო ბლოკი ვერ დაიწყება, რადგან მთავარი ნაკადი დაკავებულია ელოდებით.
    mainQueue.sync {
        print("ეს ხაზი არასოდეს მიაღწევს.")
    }
}