Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Данные и логика в отдельных процессах

Автор Алексей Гринь, марта 30, 2014, 00:39

0 Пользователи и 1 гость просматривают эту тему.

Алексей Гринь

Вот есть мысль хранить документ в RAM отдельно от всей логики программы.
То есть существуют два процесса: процесс, хранящий модель документа, и процесс для всего остального (логика, UI и т.д.). Общаются они, стало быть, между собой с помощью средств межпроцессного взаимодействия, доступных на ОС.

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

Так вот, не могу правильно загуглить примеров на подобное. Это вообще разумно, или проще бэкапить на жёстком диске? Если бэкапить на диске в том же процессе, то, всё же, не исключено повреждение памяти, если ошибка в логике каким-то образом затрагивает структуры и код, которые занимаются самим бэкапированием на жёсткий диск, т.е. 100% гарантии сохранности данных нет. Плюс бэкап на жёсткий диск должен производиться через промежутки времени, а не постоянно, поэтому бэкап может быть outdated.
Не знает ли кто случайно, делают ли нечто подобное известные программы (типа OpenOffice, может быть), может быть, это вообще стандарт там?
肏! Τίς πέπορδε;

Python

Разделение данных и кода обычно делают, чтобы избежать выполнения данных как кода или изменения кода как данных. Повторно использовать данные, оставшиеся в памяти после падения процесса, мне кажется, нецелесообразно: как минимум, они могут быть повреждены и вызывать ошибки (т.е., здесь нужен какой-то инструмент для исправления ошибок, а не тот же код, наступающий на те же грабли).
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

Алексей Гринь

Цитата: Python от марта 30, 2014, 01:43
Повторно использовать данные, оставшиеся в памяти после падения процесса, мне кажется, нецелесообразно: как минимум, они могут быть повреждены и вызывать ошибки
Ну так по моей задумке процесс модели документа — это своего рода сервер, который принимает сериализуемые сообщения на изменения документа. Повредить документ вне сервера просто нереально, потому что мы не напрямую изменяем память, а только просим сервер (процесс модели документа) сделать это.

Цитата: Python от марта 30, 2014, 01:43
а не тот же код, наступающий на те же грабли
Код крэшиться может не напрямую из-за документа, а из-за каких посторонних причин на стороне клиента (out of memory, ошибки в логике обработки документа с помощью какой-то опр. функции, ошибки в UI). То есть программа юзабельна, если не делать определённых действий... Если случайно юзер напоролся на баг и всё покрешилось, то данные гарантированно восстановятся.
肏! Τίς πέπορδε;

Bhudh

А каким образом можно загрузить код в область памяти, не занятую данными? Это надо адрес данных в памяти тоже где-то бэкапить.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Тайльнемер

Цитата: Алексей Гринь от марта 30, 2014, 00:39
Вот есть мысль хранить документ в RAM отдельно от всей логики программы.
Интересная мысль!
Я, правда, ни разу не пробовал заниматься межпроцессной коммуникацией, так что ничего подсказать не смогу.

Цитата: Bhudh от марта 30, 2014, 07:01
А каким образом можно загрузить код в область памяти, не занятую данными? Это надо адрес данных в памяти тоже где-то бэкапить.
Bhudh, я не понял, о чём вы.

Bhudh

Ну ситуация: код загрузил данные в кучу, поставил себе указатель на них... И крашнулся. Данные по условию остались в памяти. А указатель где?
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Тайльнемер


Triton

Цитата: Алексей Гринь от марта 30, 2014, 00:39
Вот есть мысль хранить документ в RAM отдельно от всей логики программы.
То есть существуют два процесса: процесс, хранящий модель документа, и процесс для всего остального (логика, UI и т.д.). Общаются они, стало быть, между собой с помощью средств межпроцессного взаимодействия, доступных на ОС.
Вы изобрели клиент-серверную модель.   ;) :)
Молиться, поститься и слушать радио Ватника

Алексей Гринь

Цитата: Bhudh от марта 30, 2014, 07:01
А каким образом можно загрузить код в область памяти, не занятую данными? Это надо адрес данных в памяти тоже где-то бэкапить.
Цитата: Bhudh от марта 30, 2014, 09:04
Ну ситуация: код загрузил данные в кучу, поставил себе указатель на них... И крашнулся. Данные по условию остались в памяти. А указатель где?
Не уверен, что что-то понял (по-английски, может быть, понял бы, так как русскую терминологию с трудом читаю).

При такой системе обращаться к документу можно только с помощью id'ов документа, а не с конкретными указателями. Например, если есть документ в стиле "logical_path/document.doc", то чтобы что-то с ним делать, нужно получить его id. Конечно, крэшащаяся программа может предъявить не тот id, но т.к. доступ сериализован, сервер сразу же это просечёт (команда GetDocId ни разу не возвращала такой id для этого клиента) и тогда сервер ответит клиенту нужным errorcode'ом, что просигнализирует: ты какой-то болезный, иди прокрэшься и перезапустись. При перезапуске (и при старте) клиент всегда пытается найти висящий в памяти процесс документной модели и приконнектиться к нему. Процесс тот помнит, что последним незаконченным документом был "logical_path/document.doc", поэтому предложит перезапустившемуся клиенту заново им инициализировать свой View (в смысле Model-View-Controller).

Алсо, документ должен храниться в каком-то стандартизированном DOM'е, а не быть просто тупым набором байтов. В моём случае у меня есть простенький прототип в около-JSON'овском стиле (незамысловато назвал Object Hierarchy Markup). Тогда и команды изменения документа довольно простые: «найди вот этот вот элемент иерархии и замени его вот этим вот элементом», или «вот сюда вот вставь новую ветку иерархии». Межпроцессные команды я думаю сделать текстовыми (ровно как и сам DOM), т.к. формат документа базируется на текстовости ради простоты.

Вот я даже и не знаю, это прикольно всё реализовывать, но нужно ли. Может быть, всё-таки, простой бэкап suffices. С другой стороны, если ещё сохранять всё в виде delta-изменений, расшарить процесс другим машинам в сети (то есть изначально через сокеты производить прослушку), да периодически бэкапить DOM на жёсткий диск — получим свой собственный сервер с блэкджеком и шлюхами для совместного редактирования документа с возможностью отката изменений...
肏! Τίς πέπορδε;

Алексей Гринь

Цитата: Triton от марта 30, 2014, 11:19
Вы изобрели клиент-серверную модель.   ;) :)
Так я ничего не изобретал, это всё известные вещи. Просто я не знаю, использует ли известный софт такую модель для оффлайна.
肏! Τίς πέπορδε;

Triton

Цитата: Алексей Гринь от марта 30, 2014, 11:33
Цитата: Triton от марта 30, 2014, 11:19
Вы изобрели клиент-серверную модель.   ;) :)
Так я ничего не изобретал, это всё известные вещи. Просто я не знаю, использует ли известный софт такую модель для оффлайна.
Для оффлайна вряд ли. По крайней мере, не вспоминается ничего на этот счёт.
Думаю, экономическая целесообразность отсутствует.
Молиться, поститься и слушать радио Ватника

Алексей Гринь

Цитата: Triton от марта 30, 2014, 11:36
Думаю, экономическая целесообразность отсутствует.
В смысле? Тут же не экономическая целесообразность, а целесообразность стабильности. На первых порах особенно, кто знает, как часто будет крэшиться на других компах. Закрэшилось — ну так и само сразу же перезапустилось; документ целый, продолжай с того же места, не сильно напрягает.
Скорость общения между процессами — несколько гбитс, для моих задач норм.

Что касается унификации интерфейсов для оффлайна и онлайна, я вот вспомнил, что в совр. версиях Minecraft'а оффлайн-режим это на деле локалхостный сервер. Так что разумно было бы сделать такое «на вырост» (оффлайн — это изначально локалхостный сервер), чтобы потом не пришлось переписывать код (как в том же Minecraft).

Может быть, всё-таки OpenOffice делает так  :??? Если запускаю его, то он сразу три процесса создаёт. Как раз в моей модели три процесса и нужно: 1) контрольный процесс, запускающий остальные процессы и перезапускающий их в случае крэшей 2) процесс логики и UI 3) процесс документной модели.
肏! Τίς πέπορδε;

Triton

Цитата: Алексей Гринь от марта 30, 2014, 12:03
Цитата: Triton от марта 30, 2014, 11:36
Думаю, экономическая целесообразность отсутствует.
В смысле? Тут же не экономическая целесообразность, а целесообразность стабильности.
Вот стабильность и не стоит затраченных денег для большинства приложений.
Там, где mission critical, оценки, понятное дело, иные. Взять тот же QNX, который весь клиент-серверный начиная от драйверов, ибо микроядерный.
Молиться, поститься и слушать радио Ватника

Triton

Цитата: Алексей Гринь от марта 30, 2014, 12:03
Что касается унификации интерфейсов для оффлайна и онлайна, я вот вспомнил, что в совр. версиях Minecraft'а оффлайн-режим это на деле локалхостный сервер. Так что разумно было бы сделать такое «на вырост» (оффлайн — это изначально локалхостный сервер), чтобы потом не пришлось переписывать код (как в том же Minecraft).
Да, при проектировании на вырост это разумно. Собственно, это первое, что пришло мне на ум при чтении топика.


Цитата: Алексей Гринь от марта 30, 2014, 12:03
Может быть, всё-таки OpenOffice делает так  :??? Если запускаю его, то он сразу три процесса создаёт.
У меня так:
> 16598 /bin/sh /usr/bin/lowriter
> 16600 /usr/lib/libreoffice/program/oosplash --writer
> 16615 /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=5

Имхо, по названиям видно, что нужен только soffice.bin. Если его вручную запустить, запускается и работает.
Молиться, поститься и слушать радио Ватника

Алексей Гринь

Цитата: Triton от марта 30, 2014, 12:08
Вот стабильность и не стоит затраченных денег для большинства приложений.
Ну мой софт, подразумевается, будет оперировать большим количеством данных, в том числе, с кэшем промежуточных представлений в RAM (кэш принадлежит логике и UI, а не самому документу), поэтому out of memory вполне могут быть частыми, особенно на более слабых компьютерах. В похожей программе у меня частенько внезапно бывают out of memory, и тогда теряются последние изменения, что реально бесит.
肏! Τίς πέπορδε;

mnashe

Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Алексей Гринь

Цитата: mnashe от марта 30, 2014, 12:59
Довлеет?
Offtop
Хватает. Я думаю по-английски, иногда аналогов русских вспомнить не могу.
肏! Τίς πέπορδε;


mnashe

Offtop
Цитата: Чайник777 от марта 30, 2014, 23:47
А довлеть когда-то и значил to suffice
:yes:
У «хватает» в принципе то же значение, но управление другое (логический субъект при нём не в номинативе, а в партитиве).
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Sutinator

Я так понимаю, хранить документ в памяти необходимо В ЦЕЛЯХ редкого обращения к диску, а т.ж. скорости i/o?

На всякий случай: MS Office восстанавливает все несохранённые результаты работы после крашей.

Если я правильно понял чего Вы хотите (проекция ФС в ОЗУ), то должно помочь такое средство, как RAM drive - (wiki/en) RAM_drive

Sutinator

Наверно не все так как ув. Гринь, могут не то чтобы думать но и осмысленно читать на английцких языках. По-Русски:
(wiki/m) RAM_drive

Алексей Гринь

Цитата: Sutinator от марта 31, 2014, 11:59
Я так понимаю, хранить документ в памяти необходимо В ЦЕЛЯХ редкого обращения к диску, а т.ж. скорости i/o?
Нет. Цель — не хранить документ в памяти (вместо диска); цель — хранить рабочее представление документа в месте, изолированном от прочего кода. Под рабочим представлением документа я имею в виду некое дерево структур, с которым программа может работать в конкретный момент времени. Разумеется, документ можно сериализовать и сохранить на диск, всё-такое. Я не о том. Я, наверное, конечно, over-engineer (переинженериваю?), но хостить сам документ в том же процессе, что и логика — не 100% безопасно. Если в программе есть ошибка типа переполнения буфера, то забагованный код может повредить рабочую модель документа в памяти, и бэкапь не бэкапь — забэкапишь повреждённый документ. И прощай работа нескольких часов, а то и дней. Конечно, можно применять что-то вроде CRC для верификации структур — но не муторнее ли это? Плюс, при CRC-верификации мы только можем сказать, что данные повреждены, мы не можем предостеречься от этого так, чтобы этого не происходило вообще.
肏! Τίς πέπορδε;

Sutinator

Уфф, мудрено...Что из себя представляет рабочая область?
Нужно специально спроектированное приложение, некая студия: процесс для отображения древа проекта, и отдельно вызываемые утилиты для работы с разными данными его частей.
См. также COM и DDE.

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

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр