shared-memory (file-mapping) + синхронизация

Тема в разделе "WASM.WIN32", создана пользователем lamer2k, 31 окт 2008.

  1. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Есть задача держать некторые данные, которые должны быть доступны для чтения и записи из нескольких разных процессов. Вроде file-mapping подходит для этой задачи. Но как быть, если процесс который был овнером (выполнил CreateFileMapping) завершился ? Получается остальные процессы уже не смогут читать писать в эту разделяемую память ? Как это можно обыграть ? И паралельно с этим, вопрос по синхронизации чтения/записи в эту область памяти. Я так полагаю самое разумное это мьютексы ? Т.е если происходит запись в облась памяти - "включать" мьютекс и затем, по завершении записи, - "отключать" ?
     
  2. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    если процесс который был овнером (выполнил CreateFileMapping) завершился ?

    Процесс не является owner-ом объектов ядра.

    Получается остальные процессы уже не смогут читать писать в эту разделяемую память ?

    Смогут, если перед завершением процесса, поток которого создал file-mapping, какой-либо поток любого остального процесса открыл данный объект(т.е вызвал OpenFileMapping).
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Да, хэндлы на объекты ядра поддерживают подсчет ссылок, так что объект не уничтожится пока имеется хотя бы один открытый хэндл.
     
  4. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Все зависит от того какая гибкость тебе нужна если взаимодействие будет происходить только между двумя процессами то вполне подойдет мьютекс/ивент, если процессов больше можешь заюзать LPC там предусмотрен механизм с секцией для передачи больших данных и с синхронизацией не будет мороки.
     
  5. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Синхронизация между большим кол-вом процессов обычно будет происходить. Все процессы равноправные и поэтому не хотелось бы применять технологию LPC, которая подразумевает клиент-сервер систему. Да и документации по LPC маловато.

    Получается вопрос о синхронизации чтения/записи остается открытый.
    Будут ли какие-то грабли при синхронизации между процессами с использованием мьютексов ?

    Когда мьютекс или евент получат сигнальное состояние, и несколько процессов будут ожидать это событие, какому-то процессу отдатся предпочтение ? Тому код которого процессор начнет исполнять первым(мб там очередь какая-нить выстраивается) ? Тогда как будет происходить этот процесс на многопроцессорной машине ?

    Ссори, много вопросов, хочется быть умным :)
     
  6. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    почитай Джефри Рихтера "Windows 2000 для профессионалов", он оооч хорошо по этой теме писал, там прям раздел про мьютексы есть...
     
  7. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Собственно на сколько я знаю на многопроц. машинах проблем с ивентами/мьютексами нету, все дело в том как ты это реализуешь, и какова поставленная задача)
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    В порядке захвата ожидания.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Partner
    Что такое "захват ожидания"?
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    WaitForSingleObject, WaitForMultipleObjects etc
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Partner
    В порядке захвата ожидания.
    Например, Рихтер (4-е издание), в предпоследнем абзаце Chapter 9. Thread Synchronization With Kernel Objects. Successful Wait Side Effects, пишет "In reality, the algorithm Microsoft uses is simply the popular "first in, first out" scheme. ... However, actions can occur in the system that alter this behavior, making it less predictable. ... One such action is a thread getting suspended. If a thread waits for an object and then the thread is suspended, the system forgets that the thread is waiting for the object. This is a feature because there is no reason to schedule a suspended thread. When the thread is later resumed, the system thinks that the thread just started waiting on the object."
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Ну это очевидно. Суспендед треды исключаются из планирования. Разговор вроде о живых тредах.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Так в этой цитате Рихтер и пишет что само ожидание мютекса усыпляет поток...
    Хотя имхо в любом случае из юзермода делать предположения о работе планировщика и пытаться как то учесть результаты своих прогнозов задача неблагодарная.
    Тут имхо только играться с приоритетами потоков, хотя у меня XP SP3 (двухядерник) на конструкцию для замера тактовой частоты
    Код (Text):
    1.       mov edi, @FUNC(GetCurrentProcess)
    2.       invoke SetPriorityClass, edi, REALTIME_PRIORITY_CLASS
    3.       mov esi, @FUNC(GetCurrentThread)
    4.       invoke SetThreadPriority, esi, THREAD_PRIORITY_TIME_CRITICAL
    5.         sleep 100
    6.       invoke SetThreadPriority, esi, THREAD_PRIORITY_NORMAL
    7.       invoke SetPriorityClass, edi, NORMAL_PRIORITY_CLASS
    периодически (не всегда а ~ через 2 на 3 запуск) роняет программу - типа говорит нечего спать с таким приритетом :)))
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Y_Mur
    играться с приоритетами потоков
    Там же, на абзац выше: "... that thread priority has no effect: the highest-priority thread does not necessarily get the object."
     
  15. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Там такого не написано.
    Ждущий и суспендед поток, это разные вещи. Хотя в обоих случаях они не потребляют CPU.
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Partner
    Разговор вроде о живых тредах
    Afaik гарантии, что потоки никто не усыпит - нет.

    lamer2k
    Imho схема синхронизация зависит от задачи.
    Твоя формулировка слишком размыта: "задача держать некторые данные, которые должны быть доступны для чтения и записи из нескольких разных процессов ... большим кол-вом процессов ... Все процессы равноправные".
    Например, можно использовать процесс, который будет формировать очередь, получая задания на чтение/запись от других процессов, и только он один будет выполнять чтение и запись.