Middle+
Livelock деген эмне?
sobes.tech AI
AIден жооп
Livelock — бул dead-lockке окшош абал, бирок алда, агымдар үзгүлтүксүз иштөө аракетинде турушат, бири-бирин жокко чыгарып, ресурстар үчүн атаандаштыкка түшүп, алардын алдыга жылышына тоскоол болот.
Livelock мисалы: эки агым A жана B ресурстарын алууга аракет кылат. Агым 1:
- Ресурс Aны алат.
- B ресурсуна жетүүгө аракет кылат. Эгер ал жетпесе, Aны бошотуп, кайра баштайт.
Агым 2:
- B ресурсуна алат.
- A ресурсуна жетүүгө аракет кылат. Эгер ал жетпесе, Bны бошотуп, кайра баштайт.
Нәтижеде, агымдар ресурстарды үзгүлтүксүз бошотуп, кайра алууга аракет кылышат, максатка жетпей.
Dead-lock менен айырмасы:
- Dead-lock: агымдар блоктолгон, бири-бирин күтүп жатышат.
- Livelock: агымдар активдүү иштешет, бирок прогресс жасабайт.
Алдын алуу:
- Ресурстарга тартиптүү кирүү.
- Ресурс алууда убакыт чектөөлөрү.
- Ресурстар ортосундагы татаал көзкаранды болуудан качуу.
Псевдокод мисалы, livelock аракетин көрсөтөт:
// Ресурс 1
let resource1 = NSLock()
// Ресурс 2
let resource2 = NSLock()
// Агым 1
DispatchQueue.global().async {
while true {
resource1.lock()
if resource2.tryLock() {
// Эки ресурсты ийгиликтүү алуу
// Ишти аткаруу
print("Агым 1 иштеп жатат")
resource2.unlock()
resource1.unlock()
break // Ийгиликтүү алуу соңунда циклды аяктоо
} else {
// resource2 алуу мүмкүн эмес, resource1 бошотуп, кайра аракет кылуу
resource1.unlock()
// Локтун алдын алуу үчүн кичинекей күтүү
Thread.sleep(forTimeInterval: 0.01)
}
}
}
// Агым 2
DispatchQueue.global().async {
while true {
resource2.lock()
if resource1.tryLock() {
// Эки ресурсты ийгиликтүү алуу
// Ишти аткаруу
print("Агым 2 иштеп жатат")
resource1.unlock()
resource2.unlock()
break // Ийгиликтүү алуу соңунда циклды аяктоо
} else {
// resource1 алуу мүмкүн эмес, resource2 бошотуп, кайра аракет кылуу
resource2.unlock()
// Кичинекей күтүү
Thread.sleep(forTimeInterval: 0.01)
}
}
}