Middle+
Livelock nima?
sobes.tech AI
AIdan javob
Livelock — bu holat, o'xshash dead-lockga, ammo u yerda oqimlar bloklanmaydi, ular doimiy ravishda ishni bajarishga harakat qiladilar, bir-birining harakatlarini bekor qiladilar, resurslar uchun raqobat tufayli, bu ularning oldinga siljishiga olib kelmaydi.
Livelock misoli: ikki oqim A va B resurslarini olishga harakat qilmoqda. Oqim 1:
- Resurs A ni oladi.
- Resurs B ni olishga harakat qiladi. Agar muvaffaqiyatsiz bo'lsa, A ni bo'shatadi va qayta boshlaydi.
Oqim 2:
- Resurs B ni oladi.
- Resurs A ni olishga harakat qiladi. Agar muvaffaqiyatsiz bo'lsa, B ni bo'shatadi va qayta boshlaydi.
Natijada, oqimlar doimiy ravishda resurslarni bo'shatib, ularni qayta olishga harakat qiladilar, maqsadga erishmay.
Deadlock bilan farqi:
- Deadlock: oqimlar bir-birini kutib, bloklanadi.
- Livelock: oqimlar faol ishlaydi, ammo rivojlanmaydi.
Oldini olish:
- Resurslarga tartibli kirish.
- Resursni olishga harakat qilishda vaqt chegarasi.
- Resurslar o'rtasidagi murakkab bog'liqliklardan qochish.
Livelockga misol pseudokod:
// Resurs 1
let resource1 = NSLock()
// Resurs 2
let resource2 = NSLock()
// Oqim 1
DispatchQueue.global().async {
while true {
resource1.lock()
if resource2.tryLock() {
// Ikkala resurs muvaffaqiyatli olindi
// Ishni bajarish
print("Oqim 1 ish bajarayapti")
resource2.unlock()
resource1.unlock()
break // Muvaffaqiyatdan so'ng siklni tugatish
} else {
// resource2 ni olish muvaffaqiyatsiz, resource1 ni bo'shatish va qayta urinish
resource1.unlock()
// Tezkor to'xtash, darhol qayta urinishni oldini olish uchun
Thread.sleep(forTimeInterval: 0.01)
}
}
}
// Oqim 2
DispatchQueue.global().async {
while true {
resource2.lock()
if resource1.tryLock() {
// Ikkala resurs muvaffaqiyatli olindi
// Ishni bajarish
print("Oqim 2 ish bajarayapti")
resource1.unlock()
resource2.unlock()
break // Muvaffaqiyatdan so'ng siklni tugatish
} else {
// resource1 ni olish muvaffaqiyatsiz, resource2 ni bo'shatish va qayta urinish
resource2.unlock()
// Tezkor to'xtash
Thread.sleep(forTimeInterval: 0.01)
}
}
}