Страница 1 из 1

ядрышко

СообщениеДобавлено: 23.03.2008 11:42:57
Attid
жило было у меня ядрышко
ОС linux
в работу входило подключение к БД взять настройки и обслуживать устройства.

по пути наименьшего сопративления был выбран код

Код: Выделить всё
  while true do
  begin
    for i := 0 to DevList.Count - 1 do
    // куча кода
    sleep(100);
  end;   


со временем деревья выросли. компьютеры стали маленькие, у стройств становится все больше и больше.

соответсвенно ядрышку приходится развиваться, вот в собсвеном и вопрос как ?

т.к. ось линукс и меняться не планируется, то платформо логично использовать fork

значит выходит 2 варианта

1,
процесс стартует
идет к базе, получает сколько устройств надо обслуживать, отключается от БД
распаралеливается на кучу процессов
из каждого конектится и работает по своему алгоритму
+ в принципе легко реализуем, да и глюков быть не должно
- куча коннектов к БД
- не знаю как с ними общаться и как логировать

2,
процесс стартует
идет к базе, получает сколько устройств надо обслуживать,
создаетна кучу процессов, передает им инструкции
общается с ними через именованые каналы (?)
+ один конект к БД
+ возможность создавать\убивать процессы во время работы из главного процесса
- не работал с именоваными каналами, не знаю их надежность


какие мысли ?

СообщениеДобавлено: 23.03.2008 11:58:20
Sergei I. Gorelkin
Второй вариант, только с сокетами? В плане надежности - вроде бы весь линукс через сокеты взаимодействует и не разваливается...

СообщениеДобавлено: 23.03.2008 13:14:54
shade
Когда я собирался сделать что-то подобное у меня возник вопрос:
Родительский процесс порождает кучку дочерних и должен с ними общаться, хоть через сокеты, хоть через пайпы (разницы никакой). Впрос вобственно как узнать какой из процессов готов принять порцию информации или наоборот желает на о чем-то поведать... дабы не попасть в deedlock. В винде есть WaitForMultipleObjects, в линухе только wait-семейство. Хотя есть функция select, которая позволяет выбрать сокет (мб и канал?) который готов принять данные или хочет что-то нам передать. Далее, у меня была ещё проблема с отслеживанием момента завершения дочернего процесса и получения кода возврата... тут нужно обрабатывать какой-то сигнал. Кстати, если этот сигнал игнорировать или обрабатывать не правильно, то у расплодяться зомби. Процессы - которые завершили свою работу и остаются в системе, пока кто-нибудь не вызовет wait (сейчас уже точно не помню):

man 2 wait писал(а):Стандарт Single Unix Specification описывает флаг SA_NOCLDWAIT (не
реализован под Linux), такой, что если он установлен, или обработчик
сигнала SIGCHLD установлен в SIG_IGN (что, кстати, не разрешено
стандартном POSIX), то завершившиеся дочерние процессы не становятся
зомби, а вызов wait() или waitpid() блокируется, пока все дочерние
процессы не завершатся, а затем возвращает код ошибки, устанавливая
errno в ECHILD.

Re: ядрышко

СообщениеДобавлено: 23.03.2008 13:28:36
PublicJoke
Чем не устраивает TThread?

СообщениеДобавлено: 23.03.2008 14:38:37
bw
3. Создать мастер-процесс и несколько рабочих процессов. Мастер планирует список и получает от рабочих процессов результаты работы.

Вообще нужно понимать задачу. Например вариант, когда с базой работает только один клиент (процесс) годится если нагрузка на базу не большая и большая часть времени будет уходить, скажем, на обработку данных. Если нагрузка большая то работу с базой стоит отдать рабочим процессам (их число обусловленно эффективностью параллельной обработки, т.е. многопроцессорностью и возможностью СУБД работать с несколькими соединениями, я, например, использую от 3х, до 10 рабочих процессов).

Можно обойтись и без мастера. Т.е. есть какая-то очередь задачь, например она хранится в БД. Каждый рабочий процесс при завершении очередной обращается к базе (т.е. к этой очереди) за следующей. Вот и все. Количество соединений с СУБД ограничено количеством рабочих процессов.

..bw

СообщениеДобавлено: 24.03.2008 11:30:25
Attid
PublicJoke писал(а):Чем не устраивает TThread?

я ему в фпц не доверяю, сколько уже на него жаловались да и в ДЦ тоже из-за него багов не мало было, пришлось кастылики рисовать.
да и какбы это более венждовая вещь как мне казалось =)


Sergei I. Gorelkin писал(а):Второй вариант, только с сокетами?

мастер прощес поднимает "сокет сервер" а остальные к нему конектятся ?
а в голом фпц они есть или надо доп компонеты типа инди юзать ?


shade писал(а):Впрос вобственно как узнать какой из процессов готов принять порцию информации или наоборот желает на о чем-то поведать...

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


bw писал(а):Можно обойтись и без мастера.

тогда управлять не получится или только через евенты, но в любом случее кто-то должен быть главнее =)
нагрузка на бд не большая, запустить процедурку с параметрами , но есть вероятность что в один момент времени захотят связяться все разом, тогда прийдется обождать. а конект из каждого, это в случае класик сервера птицы по процессу на устройство хотя больше сотни еще и не разу не было, а серверу то что, он железный =)

СообщениеДобавлено: 24.03.2008 14:15:10
Sergei I. Gorelkin
Attid писал(а):мастер прощес поднимает "сокет сервер" а остальные к нему конектятся ?
а в голом фпц они есть или надо доп компонеты типа инди юзать ?

Можно по-разному. Там же есть именованные сокеты (если два процесса знают нужное имя, они законнектятся - чем оно при этом от пайпа отличается, я даже не знаю), есть linux-specific "анонимные" сокеты (на самом деле, они такие же именованные, только не существуют в файловой системе). Соответственно можно сделать все наоборот - чтобы дети слушали, а родитель коннектился.
Что касается функций - юниксовое апи (fpsocket, fpbind и сотоварищи) в голом fpc есть по-любому, а дальше уже вопрос удобства.

СообщениеДобавлено: 24.03.2008 16:27:57
Attid
Sergei I. Gorelkin писал(а):Соответственно можно сделать все наоборот - чтобы дети слушали, а родитель коннектился.

ну тогда если я правельно понимаю, то тогда надо открывать столько портов сколько детей . .

ладно пойду искать где почитать про сокеты можно.

СообщениеДобавлено: 24.03.2008 17:42:44
bw
Используй потоки, в чем проблема то?
Даже если проблемы с TThread используй API Linux непосредственно уверен что на это уйдет меньше времени и меньше кода, а значит возможных ошибок будет меньше. Сами же потоки в линухе нормальные? Они может дольше чем в винде создаются, но других проблем нет, на сколько я знаю.

..bw

СообщениеДобавлено: 24.03.2008 19:08:14
Attid
bw писал(а):уверен что на это уйдет меньше времени и меньше когда, а значит возможных ошибок будет меньше.

я думаю об обратном.
в случае форка логика приложения все равно прямая и понятная, в случае процесов сама логика приложения извилистая и там проще запутаться. конечно это мое ИМХО =)

СообщениеДобавлено: 25.03.2008 14:26:39
PublicJoke
Могу порекомендовать отпортировать потоки из Common C++ (http://www.gnu.org/software/commoncpp/, качать отсюда ftp://ftp.gnu.org/gnu/commoncpp/), под Виндой и Линуксом работают без замечаний.

СообщениеДобавлено: 25.03.2008 17:06:41
Sergei I. Gorelkin
Я бы не назвал TThread в FPC 2.3.1 особо глючным. Во всяком случае, связанный с ним код у меня с винды на линукс переехал как-то без приключений и никаких изменений не потребовал. Что меня даже удивило...