Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#1: 2008-07-04 18:52:03 ЛС | профиль | цитата
nesco писал(а):
Можешь прояснить эту тему

Всё очень просто: обычно мы работаем с файлом посредством функций API, а здесь ты работаешь с файлом, как с участком памяти. Когда оно реально в файл сбросится - тебя не должно волновать (самое позднее в момент закрытия файла). Естесственно, при открытии файла можно его не блокировать от доступа из других процессов, а также задавать режим работы (чтение и/или запись). Как долго данные будут находиться в памяти - тоже неизвестно, так что насчёт быстродействия ничего не могу сказать.
В общем и целом, это аналог файла подгрузки (pagefile.sys) в винде.
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Администрация
Ответов: 15294
Рейтинг: 1518
#2: 2008-07-04 19:02:10 ЛС | профиль | цитата
hook.dll первых версий был на FileMapping сделан. Использовать эту технологию смысла не имеет, поскольку никакой синхронизации доступа на запись там нет и соответсвующих событий тоже. В компиляторах С++ от Microsoft эта фишка была некогда встроена в препроцессор и разрешалась на уровне соответсвующих pragm. В общем цивилизованный обмен данными надо делать на pipe.
карма: 26
0
Разработчик
Ответов: 26072
Рейтинг: 2122
#3: 2008-07-04 19:09:56 ЛС | профиль | цитата
Это случаем не то, что Dilma использует в Hiasm'e, для чтения IC в редакоре

------------ Дoбавленo:


Dilma писал(а):
В общем цивилизованный обмен данными надо делать на pipe

Я пытался, но он сволочь не работает в трее -- данные не передаются, боюсь, что в фоне тоже не будет, надо проверить.

А все же может закончить PIPE модули, хотя, они уже работают, правда, в однй сторону -- от клиента к серверу

------------ Дoбавленo:


Да и нужен ли двухсторонний обмен, не проще ли поставить второй сервер в обратную строну
карма: 22

0
Ответов: 9906
Рейтинг: 351
#4: 2008-07-04 19:28:40 ЛС | профиль | цитата
nesco писал(а):
Можешь прояснить эту тему

Типа: посмотри в столе соседа, в своем всегда успеешь

Читай Рихтера
Это самый низкоуровневый способ межпроцессного обмена данными в винде
Следовательно - самый быстрый
Грубо говоря, все остальное сделано на нем, и на мьютексах
Как делать синхронизацию на мьютексе, опять - читай Рихтера (у нас он для этого совсем не приспособлен)

У нас могла бы быть дополнительная польза: такой элемент мог бы делать кадр (Stream) с супер-большого файла (int64)
И все любители 100 гиговых файлов - пусть пользуются. Типа: хай гнида подавится....

карма: 9

0
Разработчик
Ответов: 26072
Рейтинг: 2122
#5: 2008-07-04 19:39:53 ЛС | профиль | цитата
Galkov писал(а):
Читай Рихтера

Вот я и просил прояснить тему
Бум читать мат часть.
Galkov писал(а):
Как делать синхронизацию на мьютексе, опять - читай Рихтера (у нас он для этого совсем не приспособлен)

Вот это я, как раз, и читал. Все руки не доходят сделать, да и реализация не совсем еще сформировалась
Galkov писал(а):
У нас могла бы быть дополнительная польза: такой элемент мог бы делать кадр (Stream) с супер-большого файла (int64)

Оригинальное предложение по теме

------------ Дoбавленo:

По мьютексам -- слушай Galkov ты можешь пример кинуть где он точно нужен в другом ракурсе, чем сейчас, хоть будет на чем потренироваться. Хотя, не хочется тебя отвлекать, у тебя и так работы дофига.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#6: 2008-07-04 19:50:14 ЛС | профиль | цитата
nesco писал(а):
где он точно нужен в другом ракурсе

Ну так читай же
Если две алгоритмические ветки от РАЗНЫХ потоков проходят через одноименные мьютексы, то они совершенно спокойно могут работать с какими-то данными не опасаясь конфликта.
Он сделан для этого, это его основное назначение (у нас не применяемое).
Грубо говоря, если один поток работает УЖЕ справа от первого мьютекса, то второй будет спать (во втором мьютексе) до окончания работы (справа от первого мьютекса) первого потока

Эти разные потоки могут находится и в разных процессах.
Вот и все, собственно

nesco писал(а):
Вот я и просил прояснить тему

Самому уже пора для остальных прояснять

карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#7: 2008-07-04 20:44:30 ЛС | профиль | цитата
nesco писал(а):
использует в Hiasm'e, для чтения IC в редакоре

я уже расказывал про технику редактирования скриптов в среде. К FileMapping она никакого отношения не имеет и ни к каким системным фукциям тоже.

Galkov писал(а):
Это самый низкоуровневый способ межпроцессного обмена данными в винде

и именно поэтому его почти нигде не используют - чем более низкоуровневый метод, тем больше вероятность проблем с ним в будущих версиях операционок.
карма: 26
0
Ответов: 9906
Рейтинг: 351
#8: 2008-07-04 20:49:36 ЛС | профиль | цитата
Это врядли - он базовый
На нем все построенно.

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

Такое не пропьешь

карма: 9

0
Разработчик
Ответов: 26072
Рейтинг: 2122
#9: 2008-07-04 22:22:09 ЛС | профиль | цитата
Galkov писал(а):
Самому уже пора для остальных прояснять

Ну не все же. Просто, я тихонько начинаю копать следующий слой...
------------ Дoбавленo:

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

Вот, что пишет Рихтер по этому вопросу (то, о чем говорил Galkov)

Рихтер писал(а):
разделения данных между несколькими процессами, выполняемыми на одной машине (В Windows есть и другие методы для совместного доступа разных процессов к одним данным — но все они так или иначе реализованы на основе проецируемых в память файлов.)

карма: 22

0
Ответов: 9906
Рейтинг: 351
#10: 2008-07-04 22:38:40 ЛС | профиль | цитата
Вот то, что самый низкоуровневый метод не всегда самый удобный, это, конечно - правда

Но тут думаю, есть несколько моментов:
  • иногда, все-таки, может оказаться и удобней, всякое бывает: хочу очень просто, но быстро...
  • он ни в коей мере не должен выступать как какая-то замена, предположим - MailSlot-у
  • и такой элемент может прикрыть вопрос работы (через стандартный наш Stream) с очень большими файлами
    Это я к тому, что такой элемент, без претензий на решение всех проблем, может оказаться очень полезен
    Вот и все, ничего особенного
  • карма: 9

    0
    Разработчик
    Ответов: 26072
    Рейтинг: 2122
    #11: 2008-07-04 22:47:51 ЛС | профиль | цитата
    Единственное, что тревожит, что проекции физических и виртуальных файлов, хотя и используют одни и те же функции, но по сути немного разные вещи и преследуют разные цели. Короче говоря, для работы с физическими файлами и их проекциями нужен один компонент, а для работы с виртуальными проекциями для обмена данными -- другой
    ------------ Дoбавленo:

    Galkov писал(а):
    хочу очень просто, но быстро...

    Вот то, что это самый быстрый метод обмена данными, то это -- точно, тк как работает напрямую со страницами памяти
    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #12: 2008-07-04 23:09:02 ЛС | профиль | цитата
    nesco писал(а):
    а для работы с виртуальными проекциями для обмена данными -- другой

    Не говори ерунды
    Это не "немного разные вещи", это одно и то же.
    Настолько одно и то же, что программист этого может не заметить: открывает файл, и не проверяет результат (ленивый потому-что) - а получает INVALID_HANDLE (не зная этого), подставляет дальше, и все работает (в т.ч. и из разных процессов)
    Посмотри, там примеры на это счет должны быть

    Есть два св-ва: имя файла, и имя проекции (имя объекта ядра доступное из любого процесса).
    Если имя пустое (или просто - такого файла не существует) - значит только память.
    Если файл существует, то не только память, но и +синхронизируется с содержанием диска.
    Вот и вся разница.
    И нет тут никакой проблемы.
    карма: 9

    0
    Разработчик
    Ответов: 26072
    Рейтинг: 2122
    #13: 2008-07-04 23:23:11 ЛС | профиль | цитата
    Galkov, я не это имел в виду, и что INVALID_HANDLE создает виртуальный файл в памяти тоже знаю. Я хочу попытаться сделать мух отдельно от котлет -- для работы с физическими файлами один компонент, для работы по передаче данных между процессами -- клиент/сервер с виртуальным файлом (у Рихтера, кстати, это отдельные примеры).
    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #14: 2008-07-04 23:34:13 ЛС | профиль | цитата
    Если ты сделаешь компонент для работы с "физическими файлами", то он БУДЕТ работать с памятью при подстановке имени не существующего файла.
    Просто будет, и все.
    Какой еще компонент ты после этого делать собрался, и, интересно - зачем

    Чего ты людям (или себе) голову морочишь, не пойму...
    карма: 9

    0
    Разработчик
    Ответов: 26072
    Рейтинг: 2122
    #15: 2008-07-04 23:59:48 ЛС | профиль | цитата
    Galkov писал(а):
    то он БУДЕТ работать с памятью при подстановке имени не существующего файла

    Конечно будет, если мы не отследим INVALID_HANDLE, а передадим его дальше в создание проекции. Тут вопрос другого плана, как синхронизировать приложения при изменении данных

    ------------ Дoбавленo:


    Ну еще выдержка из книги в подтверждение слов Galkov'a

    Рихтер писал(а):
    В Windows всегда было много механизмов, позволяющих приложениям легко и быстро разделять какие-либо данные. К этим механизмам относятся RPC, COM, OLE, DDE, оконные сообщения (особенно WM_COPYDATA), буфер обмена, почтовые ящики, сокеты и т.д.. Самый низкоуровневый механизм совместного использования данных на одной машине — проецирование файла в память. На нем так или иначе базируются все перечисленные мной механизмы разделения данных. Поэтому, если Вас интересует максимальное быстродействие с минимумом издержек, лучше всего применять именно проецирование


    ------------ Дoбавленo:


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

    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)