Malaja
|
|
« : 22-04-2010 13:58 » |
|
Господа, кто-нибудь сталкивался с этим предметом? Где бы посмотреть пример (лучше на с#) или описание алгоритма? Общее описание я прочла, но посмотреть бы на примерную реализацию...
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Sla
|
|
« Ответ #1 : 22-04-2010 14:00 » |
|
Программный watchdog?
Где мои 1725 лет?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #2 : 22-04-2010 14:08 » |
|
Алгоритм достаточно прост.
Инициализация таймера watchdog.
Программный код.
Выполнение кода в цикле. Каждый цикл watchdog переинициализируется. В случае зацикливания, или же по какой-либо причине не происходит перезапуск "собаки" Все начинается с "нуля"
Это на пальцах.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Malaja
|
|
« Ответ #3 : 22-04-2010 14:19 » |
|
Слав, ну и где они, твои 25 лет? А заодно и мои тоже? ) Ага, видимо, программный (т.е. с железом ничего общего не имеет). Суть задачки: Есть тест, который для своей работы стартует парочку других ехе-шников (как процессы). Так вот иногда один из этих процессов зависает, что приводит к общему зависанию теста. Появилась идея написать эту самую собаку, которая следила бы за тестом и в случае зависания давала бы команду "убить Билла" , т.е. killProcess. Спасибочки за описание - судя по всему, все выглядит не так уж и плохо! я почему-то сначала думала, что там должно быть больше наворотов. Ща попробую.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #4 : 22-04-2010 14:22 » |
|
Sla, замутил чего-то.
Что значит "в случае зацикливания", если все и так крутится в цикле? "С нуля" всё начинается, как раз тогда когда сброс (или как у тебя "перезапуск") происходит. А если он НЕ происходит, то отслеживаемая система считается повисшей (неработоспособной, не успевающей и т.д.).
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 22-04-2010 14:25 » |
|
Не забывай, бывают моменты что время выполнения некоторых тестов может быть больше времени перезапуска собаки. Для этого из теста нужно посылать собаке информацию о том, что процесс скорее жив, чем мертв.
У нас была подобного рода система. Но она была программно-аппаратным комплексом.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #6 : 22-04-2010 14:26 » |
|
resource, под зацикливанием понимался не основной процесс, а второстепенный.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Malaja
|
|
« Ответ #7 : 22-04-2010 15:29 » |
|
Слав, у меня полный тормоз... Только не убивай - не поможет... Начала рисовать себе схемку взаимодействия и поняла, что я ничего не понимаю...
Есть основной процесс - тест.длл. 1) куда помещаем сторожа? Надо создавать отдельную длл-лину или это класс в нашем тесте? 2) если стартуем и убиваем таймер в тесте, как это связано со сторожем ? Такое ощущение, что я что-то не так понимаю...
По моей логике:
тест сторож
StartTimer(30 sec) Event1 = CreateEvent(autoreset)
OnTimer(): - SetEvent(Event1) - SendMsg(CheckEvent) - WaitForSingleObject(Event1, 10 sec)
OnMsg() { WaitForSingleObject(Event1, 0 sec) - сразу reset } - если не сработало - перезапуск теста - killTimer ; startTimer
|
|
« Последнее редактирование: 22-04-2010 16:21 от Malaja »
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #8 : 22-04-2010 16:24 » |
|
Тут система такая. Есть 2 процесса: 1. следящий процесс (он же watchdog) 2. отслеживаемый процесс (1) просто запускает таймер. Если этот таймер сработал, значит (2) завис. (2) через какой-то период времени сбрасывает этот таймер, чтоб показать что он не умер. На самом деле (2) может, например, посылать команду (1) (событие вполне подходит), и (1) уже сбрасывает свой таймер.
Ну т.е. набор функций совершенно правильный.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 22-04-2010 16:28 » |
|
Это проще показать на аппаратном уровне
Отдельный девайс = watchdog Инициализация его - задать время его работы.
Далее идет основной цикл программы В этом цикле watchdog, а вернее таймер, перезапускается.
Если по какой-либо причине не пришел сигнал перезапуска, то происходит программный ресет. И все начинается с начала.
Как это реализовать программно?
Устанавливаешь таймер.
Заходишь в основной цикл, из цикла запускаешь свои процессы. Если алгоритм линейный, то вроде все понятно. А если параллельно запускаются процессы, или процесс достаточно длителен, то каждый процесс дает сигнал собаке что он жив. Как это должно происходить - не знаю. Обменивайся сигналами, или как-то по другому. Соответственно, видимо, собака должна "считать" количество выходящих и входящих, возможно также и знать о приблизительном времени выполнения каждого процесса.
Структура { proccess1:id,time; proccess2:id,time; ..... }
while true { Истекло(proccess1.time) ? kill(proccessid) : continue и так далее } Это просто, наверное.
Сложнее когда не знаешь времени работы процесса.
Запуск собаки Запуск процессов и регистрация while true { Жив(proccess[id]) ? continue : kill }
Вот это жив должен анализировать время работы процесса. если он превысил, то килять его.
ps Это все без теории...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #10 : 22-04-2010 16:30 » |
|
Malaja, давай без всех этих привязок к языку. Формально алгоритм понятен?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Malaja
|
|
« Ответ #11 : 22-04-2010 17:21 » |
|
Слав, да какая привязка - просто я сначала указала язык, т.к. думала, что у кого-то есть примерчик. В любом случае всем спасибо за помощь и терпение! Насчет алгоритма - я вижу это так: ctor_MainProc() { startWatchDogProcess( WatchDogFunc );
timerMain = startTimer(15 sec); }
OnTimer() { if (timerID == timerMain) { SetEvent(Watchdog_Event); // teper' on svoboden } else if (timerID == timerWatchdog) { restartMainProc(); // раз тест висит, с этим надо что-то делать killTimer(timerWatchdog); startTimer(timerWatchdog); }
}
WatchDogFunc() { Watchdog_Event = CreateEvent(занято); timerWatchdog = startTimer(30 sec);
while() { WaitForSingleObject(Watchdog_Event, 15 sec); If(OK) { Watchdog_Event = ResetEvent(занято); // или это происходит автоматически при manualFlag = false killTimer(timerWatchdog); startTimer(timerWatchdog); } } }
Так? Или я опять что-то не понимаю?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 22-04-2010 17:31 » |
|
Ирин, пусть главный процесс (сложный и подверженный глюкам) запускает простой до офигения процессик WatchDogProcess. Пусть главный процесс в некоем цикле постоянно взводит событие (и это должно происходить, скажем, не реже, чем раз в 10 секунд).
WatchDogProcess делает очень простую вещь:
1) проверяет, взведено ли событие - если да, то сбрасывает в 0. - если нет, то проверяет время простОя. Если время превысило таймаут - то мочит и перезапускает главный процесс 2) переход к пункту 1
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #13 : 22-04-2010 17:35 » |
|
Леш, так вроде бы я именно это и нарисовала... Или нет?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 22-04-2010 17:38 » |
|
я не знаю, у тебя какая то сложная замута с таймерами, а поскольку я не шарполог, то точно понять не могу Тут тебе даже виднее
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 22-04-2010 17:39 » |
|
По идее watchdog пассивен Его активирует дочерний процесс Как собака - мимо него проходят он и гавкает, каждый раз себя взводя и продолжает спать. Но иногда он просыпается от тишины и тогда спасайся кто может. Но можно и watchdog сделать активным. т.е. как топливо в двигателе. Есть топливо - работает, нет умираем. Кстати, http://khpi-iip.mipk.kharkiv.edu/library/extent/os/qnx/qnx_3.htmlтут и теория и реализация
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 22-04-2010 17:44 » |
|
без соблюдения синтаксиса, я мыслю вот как-то так: //главный процесс ctor_MainProc() { startWatchDogProcess( WatchDogFunc ); }
feedbackFunc() { SetEvent(Watchdog_Event);//я жив!! }
TestFunc(feedbackFunc) { for(;;) { feedbackFunc(); ... ... } }
//---------------------------- //ватчдог WatchDogFunc() { while() { If(событие_установлено_?_ожидаем_это_15_секунд) { процесс жив
сбросить событие } else { перезапустить главный процесс } } }
|
|
« Последнее редактирование: 22-04-2010 17:57 от Алексей1153++ »
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #17 : 22-04-2010 17:48 » |
|
Леш, какой на фиг шарп! Обычный родной с++ в полуструктурном виде! Т.е. названия функций верны (за исключением больших-маленьких буквочек), а параметры - нет А как ты без таймера сделаешь: Пусть главный процесс в некоем цикле постоянно взводит событие (и это должно происходить, скажем, не реже, чем раз в 10 секунд).
О! Пока писала тебе ответ, появился код. Теперь поняла, как ты без таймера хочешь обойтись. Но подозреваю, что это будет стоить много времени, т.к. постоянно будет идти проверка в цикле. Надо будет попробовать оба варианта. /////////// Слав, так я его вроде как пассивным и сделала - сратую как процесс из основного теста... Спасибочки за ссылку! Мне в процессе поиска сегодня она не попадалась - не захотел меня родной политех порадовать Еще раз всем огромное спасибо!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #18 : 22-04-2010 17:50 » |
|
Алексей1153++, по логике будет правильно если следящий процесс, содержащий "псину", будет запускать другие процессы. Как-то расточительно по отдельному процессу-"псу" на каждый отслеживаемый процесс. С другой стороны, отдельный watchdog на каждый процесс это конечно проще (гораздо проще) в реализации.
В коде поста #11, я как-то не понял, зачем нужен timerMain.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 22-04-2010 17:53 » |
|
Не, процессор кушать ватчдог не будет, если влепить Sleep(100) - там даже 1 уже будет почти незаметно с точки зрения нагрузки на процессор
If(событие_установлено_?_ожидаем_это_15_секунд) { процесс жив Sleep(100); } else
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 22-04-2010 17:58 » |
|
resource, мне не жалко по собаке на процесс, если, особенно, процессов немного - один кстати, я забыл сбросить событие - дописал в пост №16
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #21 : 22-04-2010 17:59 » |
|
Ну если один, то понятно. А если 10 или 20? С "собаками" это 20 и 40 соответственно.
А кто кого запускает это без разницы. Просто для меня логичнее, когда следящий процесс запускает отслеживаемый
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 22-04-2010 18:05 » |
|
resource, легко - один собак и 20-40 событий. Только нужно будет немного иначе ожидание организовать: WatchDogFunc() { while() {
for(int i=0;i<количество процессов;i++) { If(событие_i_установлено_?)//проверяем без ожидания { процесс_i жив сбросить событие_i } else { перезапустить процесс_i } Sleep(1000); } } }
если наличие Sleep сказывается на гибкости, можно переписать с применением GetTickCount
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #23 : 22-04-2010 18:13 » |
|
С алгоритмической точки зрения - да, легко. Но я конечно не пытаюсь сказать, что это дико сложная задача но алгоритм действительно выглядит попроще чем сам код. ЗЫ Задержки (Sleep) не знаю зачем вообще нужны
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 22-04-2010 18:17 » |
|
ЗЫ Задержки (Sleep) не знаю зачем вообще нужны
запусти бесконечный цикл без слипа - поймёшь, зачем
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #25 : 22-04-2010 18:23 » |
|
Ну серьезно, что будет?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 22-04-2010 18:28 » |
|
ну, 100% загрузка процессора, а так ничего страшного ))
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #27 : 22-04-2010 18:35 » |
|
от чего это 100% загрузка? от инкремента и вызова WaitForMultipleObjects ? Ну если задать потоку огромный приоритет.... и то.....
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 22-04-2010 18:46 » |
|
msdn под рукой нет, чем проверяются события не помню ( - а проверять надо тут без ожидания события
Но в любом случае, я без слипа не запускал бы так ватчдог
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #29 : 22-04-2010 18:56 » |
|
msdn под рукой нет, чем проверяются события не помню WaitForMultipleObjects и проверяются. И почему обязательно без ожидания? Можешь ожидать там как раз столько, сколько и в Sleep ждал. Можешь и больше.
|
|
|
Записан
|
|
|
|
|