Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: watchdog - с чем его едят?  (Прочитано 15557 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 22-04-2010 13:58 » 

Господа,
кто-нибудь сталкивался с этим предметом? Где бы посмотреть пример (лучше на с#) или описание алгоритма?  Здесь была моя ладья...
Общее описание я прочла, но посмотреть бы на примерную реализацию...
Записан

холоднокровней, Маня, Ви не на работе
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-04-2010 14:00 » 

Программный watchdog?

Где мои 1725 лет?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 22-04-2010 14:08 » 

Алгоритм достаточно прост.

Инициализация таймера watchdog.


Программный код.

Выполнение кода в цикле. Каждый цикл watchdog переинициализируется.
В случае зацикливания, или же по какой-либо причине не происходит перезапуск "собаки" Все начинается с "нуля"


Это на пальцах.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 22-04-2010 14:19 » 

Слав,
ну и где они, твои 25 лет? А заодно и мои тоже?  Улыбаюсь)

Ага, видимо, программный (т.е. с железом ничего общего не имеет).
Суть задачки:
Есть тест, который для своей работы стартует парочку других ехе-шников (как процессы). Так вот иногда один из этих процессов зависает, что приводит к общему зависанию теста.
Появилась идея написать эту самую собаку, которая следила бы за тестом и в случае зависания давала бы команду "убить Билла" Ага , т.е. killProcess.

Спасибочки за описание - судя по всему, все выглядит не так уж и плохо!
я почему-то сначала думала, что там должно быть больше наворотов.
Ща попробую.
Записан

холоднокровней, Маня, Ви не на работе
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 22-04-2010 14:22 » 

Sla, замутил чего-то.

Что значит "в случае зацикливания", если все и так крутится в цикле?
"С нуля" всё начинается, как раз тогда когда сброс (или как у тебя "перезапуск") происходит. А если он НЕ происходит, то отслеживаемая система считается повисшей (неработоспособной, не успевающей и т.д.).
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 22-04-2010 14:25 » 

Не забывай, бывают моменты что время выполнения некоторых тестов может быть больше времени перезапуска собаки. Для этого из теста нужно посылать собаке информацию о том, что процесс скорее жив, чем мертв.

У нас была подобного рода система. Но она была программно-аппаратным  комплексом.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 22-04-2010 14:26 » 

resource, под зацикливанием понимался не основной процесс, а второстепенный.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #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
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 22-04-2010 16:24 » 

Тут система такая.  Есть 2 процесса: 1. следящий процесс (он же watchdog)  2. отслеживаемый процесс
(1) просто запускает таймер. Если этот таймер сработал, значит (2) завис. (2) через какой-то период времени сбрасывает этот таймер, чтоб показать что он не умер. На самом деле (2) может, например, посылать команду (1) (событие вполне подходит), и (1) уже сбрасывает свой таймер.

Ну т.е. набор функций совершенно правильный.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 22-04-2010 16:30 » 

Malaja, давай без всех этих привязок к языку.
Формально алгоритм понятен?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #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);
    }
  }
}


Так? Или я опять что-то не понимаю?
Записан

холоднокровней, Маня, Ви не на работе
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 22-04-2010 17:31 » 

Ирин, пусть главный процесс (сложный и подверженный глюкам) запускает простой до офигения процессик WatchDogProcess.
Пусть главный процесс в некоем цикле постоянно взводит событие (и это должно происходить, скажем, не реже, чем раз в 10 секунд).

WatchDogProcess делает очень простую вещь:

1) проверяет, взведено ли событие
   - если да, то сбрасывает в 0.
   - если нет, то проверяет время простОя. Если время превысило таймаут - то мочит и перезапускает главный процесс
2) переход к пункту 1
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 22-04-2010 17:35 » 

Леш, так вроде бы я именно это и нарисовала... Или нет?
Записан

холоднокровней, Маня, Ви не на работе
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 22-04-2010 17:38 » 

я не знаю, у тебя какая то сложная замута с таймерами, а поскольку я не шарполог, то точно понять не могу Улыбаюсь Тут тебе даже виднее
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 22-04-2010 17:39 » 

По идее watchdog пассивен
Его активирует дочерний процесс
Как собака - мимо него проходят он и гавкает, каждый раз себя взводя и продолжает спать. Но иногда он просыпается от тишины и тогда спасайся кто может.

Но можно и watchdog сделать активным.
т.е. как топливо в двигателе.
Есть топливо - работает, нет умираем.

Кстати, http://khpi-iip.mipk.kharkiv.edu/library/extent/os/qnx/qnx_3.html
тут и теория и реализация

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #17 : 22-04-2010 17:48 » 

Леш, какой на фиг шарп! Обычный родной с++ в полуструктурном виде! Ага
Т.е. названия функций верны (за исключением больших-маленьких буквочек), а параметры - нет Ага
А как ты без таймера сделаешь:
Цитата
Пусть главный процесс в некоем цикле постоянно взводит событие (и это должно происходить, скажем, не реже, чем раз в 10 секунд).

О! Пока писала тебе ответ, появился код.
Теперь поняла, как ты без таймера хочешь обойтись. Но подозреваю, что это будет стоить много времени, т.к. постоянно будет идти проверка в цикле.
Надо будет попробовать оба варианта.

///////////

Слав, так я его вроде как пассивным и сделала - сратую как процесс из основного теста...  Здесь была моя ладья...
Спасибочки за ссылку! Мне в процессе поиска сегодня она не попадалась - не захотел меня родной политех порадовать   Жаль

Еще раз всем огромное спасибо!
Записан

холоднокровней, Маня, Ви не на работе
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 22-04-2010 17:50 » 

Алексей1153++, по логике будет правильно если следящий процесс, содержащий "псину", будет запускать другие процессы. Как-то расточительно по отдельному процессу-"псу" на каждый отслеживаемый процесс.
С другой стороны, отдельный watchdog на каждый процесс это конечно проще (гораздо проще) в реализации.

В коде поста #11, я как-то не понял, зачем нужен timerMain.
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 22-04-2010 17:53 » 

Не, процессор кушать ватчдог не будет, если влепить Sleep(100) - там даже 1 уже будет почти незаметно с точки зрения нагрузки на процессор

    If(событие_установлено_?_ожидаем_это_15_секунд)
    {
       процесс жив
       Sleep(100);
    }
    else
Записан

Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 22-04-2010 17:58 » 

resource, мне не жалко по собаке на процесс, если, особенно, процессов немного - один Улыбаюсь

кстати, я забыл сбросить событие - дописал в пост №16
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 22-04-2010 17:59 » 

Ну если один, то понятно. А если 10 или 20? С "собаками" это 20 и 40 соответственно.

А кто кого запускает это без разницы. Просто для меня логичнее, когда следящий процесс запускает отслеживаемый
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 22-04-2010 18:13 » 

С алгоритмической точки зрения - да, легко. Но я конечно не пытаюсь сказать, что это дико сложная задача Улыбаюсь но алгоритм действительно выглядит попроще чем сам код.

ЗЫ  Задержки (Sleep) не знаю зачем вообще нужны
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 22-04-2010 18:17 » 

ЗЫ  Задержки (Sleep) не знаю зачем вообще нужны

запусти бесконечный цикл без слипа - поймёшь, зачем Улыбаюсь
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 22-04-2010 18:23 » 

Ну серьезно, что будет?
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 22-04-2010 18:28 » 

ну, 100% загрузка процессора, а так ничего страшного ))
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 22-04-2010 18:35 » 

 Не понял  от чего это 100% загрузка? от инкремента и вызова WaitForMultipleObjects ? Ну если задать потоку огромный приоритет.... и то.....
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 22-04-2010 18:46 » 

msdn под рукой нет, чем проверяются события не помню (  - а проверять надо тут без ожидания события

Но в любом случае, я без слипа не запускал бы так ватчдог
Записан

resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 22-04-2010 18:56 » 

msdn под рукой нет, чем проверяются события не помню

WaitForMultipleObjects и проверяются. И почему обязательно без ожидания? Можешь ожидать там как раз столько, сколько и в Sleep ждал. Можешь и больше.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines