Deadlocks
8 отговора
402 прегледа
Deadlocks
Hi,
kogato proekta nabybne i ni6kite stanat mnogo, ako 4ovek izpusne kontrola, ima opasnost da se sblyska s deadlocks. :( Vie kak se spravjate s tjah. Polzvate li njakakvi interesni metodi ili tool-ove? kakvo pove4e ot TRACE moje da polzva 4ovek vsy6tnost. Ima li ne6to specifi4no za MSVC++. Do kolko moje da pomogne Spy++.
6te se radvam na vsjakakav komentar.
Mnogo pozdravi !
kogato proekta nabybne i ni6kite stanat mnogo, ako 4ovek izpusne kontrola, ima opasnost da se sblyska s deadlocks. :( Vie kak se spravjate s tjah. Polzvate li njakakvi interesni metodi ili tool-ove? kakvo pove4e ot TRACE moje da polzva 4ovek vsy6tnost. Ima li ne6to specifi4no za MSVC++. Do kolko moje da pomogne Spy++.
6te se radvam na vsjakakav komentar.
Mnogo pozdravi !
Re: Deadlocks
Znaesh li neshto za "Metoda na bankera" ili "Sediashtite filosofi" tova sa tipichni sluchai na Deadlock i borba sreshtu tova.
Re: Deadlocks
Седящите философи са пример за възможен дедлок като недостатък от алгоритъма. Представи си следната картинка: Кръгла маса, на която има седнали n философи. Всеки си има чиния със спагети пред себе си, а от двете страни на чинията има по една вилица, която се ползва за ядене. Между всеки двама философи обаче има по една вилица, така че трябва да си ги споделят.
Всеки философ мисли известно време след което решава, че му се яде. С дясната си ръка вдига вилицата вдясно от чинията (или чака тя да се освободи, и тогава), след това с лявата си ръка вдига вилизата вляво от чинията (или чака тя да се освободи, и тогава), яде колкото яде, после оставя дясната вилица, оставя лявата вилица, и продължава да мисли.
Всичко е точно, освен в случая, когато всички едновременно вдигнат вилиците вдясно от тях. Всеки чака да се освободи лявата вилица, но никой не пуска своята. Може да се симулира и с програма - в зависимост от подбраните времена за мислене, ядене, и вдигане на вилицата, може почти веднага да се случи, а може да го чакаш и с часове, докато стане, но в крайна сметка винаги се получава.
Алгоритъмът на банкера се учи в курса по Операционни Системи (поне във ФМИ). При него идеята е, че споделяните ресурси се отпускат от централен контролен орган (или банкер). Всеки процес / нишка предварително заявява от колко ресурси (например памет) ще има нужда, за да завърши, и банкерът, отпускайки ресурсите, се съобразява с всички заявени максимални изисквания, като не позволява да се стигне до ситуация, в която може да се стигне до дедлок (т.е. ситуация, в която всеки е лапнал ресурси, но няма достатъчно свободни ресурси, за да завърши никой от процесите). Общо взето това е идеята...
Всеки философ мисли известно време след което решава, че му се яде. С дясната си ръка вдига вилицата вдясно от чинията (или чака тя да се освободи, и тогава), след това с лявата си ръка вдига вилизата вляво от чинията (или чака тя да се освободи, и тогава), яде колкото яде, после оставя дясната вилица, оставя лявата вилица, и продължава да мисли.
Всичко е точно, освен в случая, когато всички едновременно вдигнат вилиците вдясно от тях. Всеки чака да се освободи лявата вилица, но никой не пуска своята. Може да се симулира и с програма - в зависимост от подбраните времена за мислене, ядене, и вдигане на вилицата, може почти веднага да се случи, а може да го чакаш и с часове, докато стане, но в крайна сметка винаги се получава.
Алгоритъмът на банкера се учи в курса по Операционни Системи (поне във ФМИ). При него идеята е, че споделяните ресурси се отпускат от централен контролен орган (или банкер). Всеки процес / нишка предварително заявява от колко ресурси (например памет) ще има нужда, за да завърши, и банкерът, отпускайки ресурсите, се съобразява с всички заявени максимални изисквания, като не позволява да се стигне до ситуация, в която може да се стигне до дедлок (т.е. ситуация, в която всеки е лапнал ресурси, но няма достатъчно свободни ресурси, за да завърши никой от процесите). Общо взето това е идеята...
интересна тема :)
разбира се и на мен са се случвали. вече имам достатъчно опит и в повечето случаи надушвам от къде могат да се появят, но разбира се винаги има изненади. тук някой спомена за метода на банкера, обаче не са редки дедлоците получавани не от ресурси, а от алгоритъм за синхромизация на паралелните процеси. абе май панацея няма. тези които гонят идеалния безгрешен стил на програмиране мисля че гонят михаля, аз наблягам на идеалният стил на дебъгване :)
Re: Deadlocks
друг метод - ако имаш примерно 5 ресурса, ги номерираш. и един процес, ако ще иска достъп до няколко, винаги го иска достъпа в този предвариелно определен ред. но се предполага, че ще ги пусне всички едновременно накрая...
също в МСДНа имаше статия за дедлокове и мрежи на Петри.
също в МСДНа имаше статия за дедлокове и мрежи на Петри.
Re: Deadlocks
Има такъв вариант, да - всички функции, които взимат някакви ресурси, да ги взимат в точно определен ред, след което да ги пускат в реда на заемането им - първо заетият първи се освобождава. Защото, ако например, имаш кафеварка и котлон, ако една функция иска първо кафеварката, а после котлона, а друга - обратно, може да стане як дедлок... Ако обаче и двете искат първо кафеварката, и после котлона, нещата се сериализират от само себе си. А пускането в реда на заемане е за оптимизиране на процеса и за допълнително осигуряване срещу deadlock при по-сложна логика на програмата.
Re: Deadlocks
мдам.
и примерно обядващите философи ако взимат по този алгоритъм, ще се получи, че ако всички без един взимат първо лявата, после дясната, ще трябва един философ да ги взима обратно.
и примерно обядващите философи ако взимат по този алгоритъм, ще се получи, че ако всички без един взимат първо лявата, после дясната, ще трябва един философ да ги взима обратно.
Re: Deadlocks
Ами да, защото ако вилиците са номерирани (например от 0 до n-1, където n е броя на философите), този, който отляво има вилица с номер n-1, а отдясно - с номер 0, трябва да вземе първо дясната...
Редактирано от ironcode на