|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Синхронизация доступа к разделяемой памяти21.02.2017, 12:08. Показов 12125. Ответов 73
Метки нет (Все метки)
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится в общей памяти и используя этот объект можно делать mutex.lock() определенной секции а при завершении работы mutex.unlock();
А как синхронизировать доступ к данным shared memory между процессами? Подозреваю что в таком случае мьютекс нужно хранить разделяемой памяти Но как конкретно это реализуется плохо представляю Подскажите пожалуйста кто знает
0
|
|
| 21.02.2017, 12:08 | |
|
Ответы с готовыми решениями:
73
Реализация стека строк в разделяемой памяти (MPI)
Есть ли оверхед от использования разделяемой памяти, в сравнении с глобальной? |
|
|
|||
| 22.02.2017, 11:52 | |||
|
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 22.02.2017, 12:03 [ТС] | ||
|
0
|
||
|
|
||
| 22.02.2017, 12:12 | ||
|
В изначальных редакциях языков не было никакого понятия многопоточности и прочего. Я не знаю тонкостей стандартов, но скорее всего везде описывается программная модель, соответствующая однопоточной в нашем понимании. Т.е. в языке есть просто указатель, но нет таких понятий, как "указатель на память, доступную из других мест". Косвенно такие понятия реализуются через volatile, но концепция volatile - это одно из гнилых мест стандарта, про который до сих пор у различных разработчиков нет общего и чёткого понимания. Не говоря уж о том, что это слишком консервативно Про то, чем различается реализация различных семантик на пальцах я объяснял здесь: Std::atomic. Реализация свободного от блокировок стека И такие понятия вводятся в язык через более высокоуровневые конструкции (типа класса std::atomic в C++)
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 22.02.2017, 12:37 [ТС] | |||
|
Спасибо
0
|
|||
|
|
||
| 22.02.2017, 13:20 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 22.02.2017, 13:27 [ТС] | ||
|
Странно что такие гарантии не даются
0
|
||
|
|
||
| 22.02.2017, 13:59 | ||
|
C void foo (int *p) { *p = 0; }
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 22.02.2017, 16:10 [ТС] | |
|
0
|
|
|
|
||
| 22.02.2017, 16:29 | ||
|
В конечном итоге поток1 вызовет интерфейс "освободить мьютекс". Внутри этой функции проверяется очередь и первый из очереди (а нашем случае это поток2) будет разбужен через тот же самый системный вызов futex (т.е. поток1 отдаёт ядру приказ "разбудить поток2"). При этом сам мьютекс останется в состоянии "занято". После чего поток1 выйдет из этого интерфейса и продолжит работу. Разбуженный поток2 выполняет действия в критической секции и вызовет интерфейс "освободить мьютекс". В процессе этого ядру будет отдан приказ "разбудить поток3", а сам мьютекс по прежнему останется в состоянии "занято". Поток2 продолжает свою работу, а поток 3 просыпается и так далее. Когда в конечном итоге поток3 вызовет интерфейс "освободить мьютекс", то очередь опустеет, после чего будить будет некого. Тогда мьютекс переведётся в состоянии "свободно"
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 22.02.2017, 16:39 [ТС] | |
|
Evg,
Интересно Но lock-free который мы обсуждали прежде по любому выигрывает у этого мьютекса1. Нет системных вызовов 2. Если захват недоступен можно выполнять другую полезную работу
0
|
|
|
|
||
| 22.02.2017, 16:49 | ||
|
Термином lock-free называют несколько другую вещь (или даже свойство)
Добавлено через 1 минуту Точнее, в вашей реализации была операция lock, она реализована в виде жужжания. Я уже писал ранее, что она имеет ограниченое применение. То, что вы реализовали, по сути является понятием "spinlock"
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 22.02.2017, 17:14 [ТС] | ||||
Lock-free насколько мне известно это просто принцип синхронизации доступа на основе атомарных операций, обычно это CAS. Не знаю, может существуют и другие подобные операции
0
|
||||
|
|
|
| 22.02.2017, 19:11 | |
|
Нет. Lock-free - это свойство атомарного примитива, говорящее о том, что ВНУТРИ СЕБЯ примитив реализован без использования дополнительных объектов синхронизации, а использует исключительно аппаратную поддержку. Вы использовали метод (примитив) compare_exchange_weak, который сам по себе в общем случае может быть реализован как угодно, в том числе содержать мьютексы или что-то подобное (т.е. имитирует атомарность). Если такой примитив (compare_exchange_weak или любой другой) реализован аппаратной операцией, то говорят, что это Lock-free примитив. Т.е. при любых внешних условиях примитив либо гарантированно выполнится, либо гарантированно не выполнится, никаких промежуточных состояний быть не может. Но вот если внутри реализации использован мьютекс, то тут возможно промежуточное состояние. Т.е. примитив при своей работе захватил мьютекс (я говорю именно о внутреннем мьютексе реализации примитива, а не о пользовательском мьютексе, который реализуется через примитив), а потом по каким-то причинам процесс сдох, повис или что-то подобное. Это приведёт к Dead-lock'у. Для примитивов, обладающих свойством Lock-free, Dead-lock невозможен
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||||||
| 23.02.2017, 10:12 [ТС] | ||||||||||||
|
Renji,
Синхронизация доступа к разделяемой памяти Представим ситуацию из следующего примера: 1. Процесс пробился через флаг и пошел работать сделав состояние флага снова "занято" 2. Этот самый процесс сдох по каким то причинам не добравшись до memory_order_release 3. Состояние флага остается "занято" Выходит при таком раскладе событий этот участок больше ни кем не может быть выполнен? Как это называется и разруливается? Дедлок насколько я понимаю это когда два или более задания держат блокировку на ресурсы которые нужны и одному, а этот самый "одному" держит блокировку на тот ресурс который нужен другому Вопрос навеян постом #54 (там где про дедлоки) Добавлено через 14 минут Добавлено через 32 минуты Renji, Вот еще что интересно. Что бы этот флаг был виден в процессах его нужно сохранить в шаред мемори но тут я не вижу соответствующего конструктора который принимает флаг http://en.cppreference.com/w/c... tomic_flag Однако инициализация происходит успешно если написать так:
0
|
||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 23.02.2017, 11:59 | ||||
|
1) Процесс подключается к серверу базы данных и инициирует начало транзакции. 2) Спустя, скажем, десять секунд сервер решает "чего-то долго ждем, наверно, процесс сдох" и откатывает транзакцию. Но нужно пилить поддержку транзакций и, собственно, сервер базы данных. И тут уже в полный рост встает вопрос зачем все это пилить, вместо того чтобы взять готовую СУБД. Добавлено через 1 минуту
1
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 23.02.2017, 12:05 [ТС] | ||
|
Renji,
Не очень понял как СУБД связана с данной проблемой. Или это был просто пример? Пока думаю решить так: запускать фоновый процесс который проверяет жив ли процесс который в последний раз захватил блокировку, если время захвата более чем нас устраивает, в этом процессе сделать release флага и дать возможность продолжить работу другим потокам и откатить изменения сделанные уже мертвым процессом в общей памяти Добавлено через 1 минуту
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 23.02.2017, 12:10 | ||||
|
1
|
||||
|
|
|||
| 23.02.2017, 12:12 | |||
|
Твоя ситуация. Кто-то захватил мьютекс и сдох. Программа-диспетчер увидела, что сдох процесс, который захватил мьютекс, процесс прибила, мьютекс освободила. При этом в непонятном состоянии оказались данные Моя ситуация. Кто-то начал захватывать мьютекс (который является non-lock-free) и сдох. Т.е., грубо говоря, речь идёт о мьютексе, работоспособность которого изнутри обеспечивает другой мьютекс. В этом случае в непонятном состоянии находится мьютекс - непонятно, он открыт или закрыт. Т.е. другие процессы, которые хотят захватить мьютекс, даже не в состоянии понять, свободен мьютекс, или занят Вот примерно такая разница между примтивами lock-free и non-lock-free. Примитив - это грубо говоря операции compare_exchange_weak, посредством которых реализуется мьютекс. Lock-free примитив compare_exchange_weak гарантирует, что в процессе его работы значение переменной будет либо гарантированно старым, либо гарантированно новым. В то время как не-lock-free примитив такого гарантировать не сможет. В случае, если в процесс работы примитива что-то случится, то значение переменной может оказаться в промежуточном неизвестном состоянии
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 23.02.2017, 12:15 [ТС] | ||||
|
Я почему интересуюсь решением без СУБД... есть ведь lock-free контейнеры которые работают без СУБД. Они же как то справляются только за счет алгоритма... Вот мне интересно как это реализуется. Мне пока нужно просто понять идею что бы легко читать сложные исходники
0
|
||||
| 23.02.2017, 12:15 | |
|
Аська на основе разделяемой памяти Запись и считывание разделяемой памяти Хранение указателей в разделяемой памяти Считать структуру из разделяемой памяти Сделать массив из 10 int в разделяемой памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|