Deadlock
Википедиагийн чанарын стандартад нийцүүлэхийн тулд энэ өгүүллийг хянан тохиолдуулах хэрэгтэй байна. Энэ талаар хэлэлцүүлгийн хуудас дээр юм уу энэ тэмдгийг илүү нарийвчилсан тэмдгээр солино уу. |
Deadlock гэдэг нь 2 буюу түүнээс дээш тооны процесууд дундын өгөгдлийг түгжиж хандахдаа өөрийг нь хүлээж байгаа бусад процессийн түгжсэн өгөгдлийг сулрахыг хүлээн зогсох үйл явц юм. Өөрөөр хэлбэл 2 процесс бие биенээ цааш явахыг хүлээгээд төгсгөлгүй зогсох тохиолдол юм.
Жишээ нь Процесс1 болон Процесс2 гэсэн нэр бүхий процессууд А болон Б гэсэн мэдээллүүдийг хоёуланг нь түгжээд сулладаг гэж үзье. Процесс1 нь эхлээд А -г дараа нь Б -г түгждэг байхад харин Процесс 2 нь эхлээд Б -г дараа нь А -г түгжих тохиолдолд дараах зурагт үзүүлсэн тохиолдолд үүсч болох юм.
Object A = new Object();
Object B = new Object();
public void CallByThread1(){
synchronized (A) {
...
synchronized (B) {
...
}
...
}
}
public void CallByThread2(){
synchronized (B) {
...
synchronized (A) {
...
}
...
}
}
Энэ тохиолдолд Процесс 1 нь Б-г түгжих, харин Процесс 2 нь А -г түгжих үед DeadLock үүсэх юм. Учир нь яг энэ мөчид 2 процесс маань аль нь түгжих үйлдлээ хийх боломжгүй болж бие биенээ хүлээн зогсох юм.
Практикт энэ тохиолдлоос гарах нэгэн аргыг хэрэглэдэг нь хугацаатайгаар түгжих буюу timeout -тайгаар түгжих аргыг хэрэглэдэг.
Энэ аргыг хэрэглэх тохиолдолд аль нэг процесс маань хоёр өгөгдлийг хоёуланг нь зэрэг түгжих үйлдлээ амжилттай хийж чадахгүй боловч нөгөө процессдоо хоёр өгөгдлийг хоёуланг нь зэрэг түгжих боломжийг өгдөгөөрөө давуу талтай юм. Мэдээж хэрэг аль нэг нь нөгөөдөө боломж олгохгүй тохиолдолд бие биенийгээ хязгааргүйгаар хүлээн зогсох аюултай юм.
Програмчлалын хэлүүдэд дундын өгөгдлийг түгжиж хандах дараах боломжууд байдаг.
- Java - synchronized
- .Net - lock
- C/C++ - mutex, semaphore
- SQL - Select ... for update
- ... гэх мэт
дээрх боломжууд нь практикт өргөн хэрэглэгдэх хугацаатайгаар түгжих буюу timeout тайгаар хандах боломжуудыг гаргаж өгсөн байдаг байна.