Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Здравствуй ALL!

В QNX 4.25 при создании именованой Shared Memory в одном процессе, и открытии в другом процессе возращают указатели на один и тот же адрес памяти.

Этой памятью можно пользоваться для межпроцессного обмена данными и созданием семафоров(!).

В Линухе я заметил, что процессы возвращают указатели на разные участки памяти(!), но обмен данными между процессами идёт.

А вот с семафорами атас - не работают.

Насколько я понимаю процессы в Линуховом ядре работают с физически РАЗНЫМИ shared memory, но ядро скрыто от них занимается копированием данных из одной памяти в другую.

Я прав или ошибаюсь?

Если прав, то от чего это зависит? (старая версия ядра и т.д.)

Можно ли процессы заставить пользоваться физически одной и той же shared nmemory ?

Можно ли заставить процессы нормально работать с семафорами через shared memory?

Работают ли именованая память и семафоры в ядре 2.6 как положено?

Вопросы возникают в связи с портированием кода из QNX 4.25 в Линух.

Опубликовано

Что знаю - расскажу.

Не то, не то вы думаете. Семафор это различное от разделяемой памяти понятие Сис5ипц. То есть, "нормально работать с семафорами через shared memory" - это не есть верная постановка задачи. Шаред мемори не используется при создании и использовании семафора.

Бегло проглядев примеры к труду Стивенса по сетевому программированию в юникс увидел, что указатель на начало разделяемой памяти во всех процессах указывал в одну и ту же ячейку. Система на ядре 2.6.0. Не думаю, что в предыдущих версиях было что-то неверно в реализации сис5ипц.

Вызов shmat() СТЫКУЕТ разделяемую память к адресному пространству процесса, причём по адресу, который зависит от второго и третьего аргумента shmat(shmid, shmaddr, shmflag)

Опубликовано

Спасибо большое за ответ.

Просто в QNX 4.25 два процесса хорошо синхронизировались семафорами (POSIX sem_init()) через именнованую память, там же лежали данные.

В Линухе и то не в каждом ядре работает shm_open() , но синхронизации между процессами просто нет. Именованные семафоры POSIX sem_open() пишут - function not implemented.

Сложно портировать под Линух готовые задачи однако Sad

  • 4 месяца спустя...
Опубликовано

В Линухе есть semop(2) & Co.

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

Я тоже занимаюсь портированием кода из-под qnx 4.x в Линукс.

И мой совет пользоваться семафорами sysV_IPC.

Вы же память открывкаете shmget-ом? Там ключ нужен. Его же можно использовать и для семафоров.

Пока что семафоры сис5 не вызывали нареканий у меня.

Но код переделать надо будет хорошо Smile

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...