Junior
Deadlock деген эмне?
sobes.tech AI
AIден жооп
Дедлок (Deadlock) — бул эки же андан көп агым же процесстер блоктолоочу абалда турганда, бири-бирин күтүп, ишин уланта албай турган абал. Бул, ар бир агым башка агымга керек болгон ресурска ээ болуп, ал ресурсту бошотконду күтүп жатканда пайда болот.
Дедлок пайда болуу үчүн керек болгон төрт шарт (Кофман шарттары):
- Өз ара чыгармачылык (Mutual Exclusion): Ресурс бир мезгилде бир нече процесстин колдонушуна болбойт.
- Туура жана күтүү (Hold and Wait): Алгач бир ресурска ээ болгон агым, азыркы учурда башка агымдар колдонуп жаткан кошумча ресурстарды күтүп жатат.
- Мажбурлоо жок (No Preemption): Ресурстар агымдан мажбурлап алына албайт. Алар гана өз каалоосу менен бошотулушу мүмкүн.
- Циклик күтүүлөр (Circular Wait): Эки же андан көп агымдар арасында циклдик күтүүлөр болот. Мисалы, A агымы B агымы кармап турган ресурска күтүп жатат, ал эми B агымы C агымы кармап турган ресурска күтүп жатат, ал эми C агымы A агымы кармап турган ресурска күтүп жатат.
iOS иштеп чыгууда дедлокдор көбүнесе көп агымдуу иштөөдө пайда болот, мисалы, GCD (Grand Central Dispatch) же Operation Queues туура эмес колдонулганда:
- Бир блокту учурдагы агымда синхрондуу аткарууга аракет кылуу (мисалы,
syncколдонууmainкезегинде негизги агымдан). - Эки агым ар башка семафорлорду же кутучаларды башка тартипте кармоого аракет кылат.
GCD колдонуу менен жөнөкөй дедлоктун мисалы:
func deadlockExample() {
// Негизги кезек
let mainQueue = DispatchQueue.main
// Негизги кезекте синхрондукту ишке ашыруу
// Негизги агым күтүп жатат, ал эми блок ишке кире албайт, анткени негизги агым иштөөдө.
mainQueue.sync {
print("Бул сап эч качан жетпейт.")
}
}