Re: Re:самомодифицирующийся код?
- From
- Gennady Mayko ()
- To
- Vladimir Ivanov
- Date
- 2002-10-08T23:16:01Z
- Area
- SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>
Добрый день!
VI> From: "Vladimir Ivanov" <vivanov@tmsoft-ltd.kiev.ua>
>> В-третьих, квант времени потока может уменьшаться даже тогда,
>> когда поток прерывается внешним прерыванием или DPC или APC.
>> Вот еще одна цитата .....
>> Поэтому я считаю, что из-за третьего и, вероятно, второго случая,
>> такая уловка со Sleep() не приведет гарантировано к ожидаемому
>> поведению.
VI> В принципе, уловка со Sleep() выполнит всё, что от неё я ожидал -
VI> поток
VI> в любом случае будем в начале нового кванта. Другое дело, что квант может
VI> оказаться короче, чем мы ожидали, тогда действительно мы можем не успеть
VI> переписать 5 байт.
--
Скорее всего, это так.
VI> Насколько я понял, квант может укоротиться при обработке любого
VI> прерывания (не обязательно таймера) на время обработки прерывания.
VI> Ну и пусть укорачивается. Следующий квант ведь тоже будет мой (на правах
VI> самого высокого приоритета) ?
--
Не факт. При окончании кванта времени потока шедулер ставит его в конец
очереди потоков. Поэтому, если в рассматриваемом процессе есть другие потоки с
таким же приоритетом, управлением будет передано им. Здесь как раз и может
возникнуть проблема, если эти потоки, например, попытаются выполнить вызов
перехватываемой функции.
VI> Учитывая вышесказанное, глюк может действительно может проявится в
VI> том и только том случае, если в результате прерывания оставшегося кванта
VI> хватит на выполнение ровно одной из двух операций записи в память _И_ в
VI> процессе есть ещё как минимум один поток с таким же приоритетом как и
VI> мой, собирающийся в следующем кванте вызвать перехватываемую функцию.
--
Именно так. И этого уже достаточно для того, что бы не рекомендовать
использовать такой метод перехвата.
VI> Ещё можно временно поставить максимально возможный квант времени для
VI> потока (вроде тоже вещь настраиваемая), чем уменьшить и без того уже
VI> мизерную вероятность сбоя. Кстати, вероятность равная нулю, в общем
VI> случае,
VI> не означает невозможности события :) Ещё время Sleep'а чуть-чуть
VI> увеличить, хоть это и на баловство больше похоже :).
--
Мне кажется, что "вероятностный" подход к проектированию программ как раз и
приводит к известной ситуации с Windows, когда все ругают ее за "глючность" :)
Поэтому лучше так не проектировать...
VI> С APC, я к сожалению так и не понял: можешь описать случай, в котором
VI> планировщик отберёт неисчерпанный квант потока с высоким приоритетом для
VI> выполнения APC-процедуры более низкого, пусть даже в SMP среде?
--
Все 3 типа APC (asynchronous procedure calls) выполняются прежде кода потока;
они гарантировано имеют больший приоритет, чем обычные потоки. Поэтому они,
так же как и процедуры обработки прерывания и DPC, могут "отбирать" время от
потока.
VI> Не прощаюсь,
VI> Владимир Иванов
С уважением,
Геннадий Майко.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)