Junior
Deadlock деген эмне?
sobes.tech AI
AIден жооп
Дедлок — бул көптөгөн агымдарда (жиптерде) бир-бирин блоктоп, башка агымдар колдонуп жаткан ресурстарды күтүп жатканда пайда болгон абал.
Дедлоктун пайда болушунун шарттары (Кофман шарттары):
- Өз ара ажыратуу (Mutual Exclusion): Ресурстар бир убакта бир нече агым тарабынан колдонулбайт.
- Туура жана күтүү (Hold and Wait): Бир ресурска ээ болгон агым башка ресурсты күтүп жатат.
- Алдын ала алууга болбойт (No Preemption): Ресурс агымдан күч менен алынып салынбайт, ал агым өзү гана бошотушу керек.
- Дөңгөлөк күтүүлөр (Circular Wait): Бир нече агымдар ресурстарды күтүп, алардын бири-биринин ээси болуп турган чынжыр түзүшөт.
Жөнөкөй мисал:
Эки агым, эки ресурс (A жана B).
- Агым 1 ресурс Aны алат.
- Агым 2 ресурс Bны алат.
- Агым 1 ресурс Bны алууга аракет кылат (ал азыр Агым 2де).
- Агым 2 ресурс Aны алууга аракет кылат (ал азыр Агым 1де).
Эки агым да мәңги блокко алынып турат.
// Жөнөкөй дедлок симуляциясы lock колдонуу менен
object resourceA = new object();
object resourceB = new object();
void Thread1Method()
{
lock (resourceA) // Агым 1 Aны алды
{
Console.WriteLine("Агым 1 ресурс Aны алды");
Thread.Sleep(100); // Агымдардын алмашуусун көрсөтүү үчүн кичинекей кечиктирүү
lock (resourceB) // Агым 1 Bны алууга аракет кылат
{
Console.WriteLine("Агым 1 ресурс Bны алды");
}
}
}
void Thread2Method()
{
lock (resourceB) // Агым 2 Bны алды
{
Console.WriteLine("Агым 2 ресурс Bны алды");
Thread.Sleep(100); // Кичинекей кечиктирүү
lock (resourceA) // Агым 2 Aны алууга аракет кылат
{
Console.WriteLine("Агым 2 ресурс Aны алды");
}
}
}
// Агымдарды түзүү жана иштетүү дедлокко алып келиши мүмкүн.
// new Thread(Thread1Method).Start();
// new Thread(Thread2Method).Start();
// Бул кодду иштетүү дедлокту көрсөтүшү мүмкүн, бирок милдеттүү эмес,
// анткени аткаруу тартиби планировщикке көз каранды.
// Эгер Агым 1 Aны алса, ал эми Агым 2 Bны алса, биринчи
// Bны алууга аракет кылганча, дедлок пайда болот.
Дедлокту алдын алуу үчүн:
- Ресурстарды алуу тартибин бирдей кылуу (эч качан ресурстарды бир эле тартипте алуу).
- Убакыт чектелген алуу методдорун колдонуу (ресурсты белгиленген убакытта алууга аракет кылуу).
- Бир эле учурда бир нече блокировканы кармоо керек болбогон дизайн түзүү.
- Атомардык операцияларды же жогорку деңгээлдеги синхрондаштыруу primitives колдонуу (мисалы,
Monitor.TryEnter,ReaderWriterLockSlim).
Дедлокторду аныктоо кыйын, анткени алар агымдардын аткаруу тартибине көз каранды жана көбүнчө жүктөө астында гана көрүнөт. Visual Studio алардын аныкталышы жана анализи үчүн инструменттерди сунуштайт.