|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Синхронизация доступа к разделяемой памяти21.02.2017, 12:08. Показов 12094. Ответов 73
Метки нет (Все метки)
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится в общей памяти и используя этот объект можно делать mutex.lock() определенной секции а при завершении работы mutex.unlock();
А как синхронизировать доступ к данным shared memory между процессами? Подозреваю что в таком случае мьютекс нужно хранить разделяемой памяти Но как конкретно это реализуется плохо представляю Подскажите пожалуйста кто знает
0
|
|
| 21.02.2017, 12:08 | |
|
Ответы с готовыми решениями:
73
Реализация стека строк в разделяемой памяти (MPI)
Есть ли оверхед от использования разделяемой памяти, в сравнении с глобальной? |
|
|
|
| 23.02.2017, 12:15 | |
|
Renji, где-то писал, что какие-то из атомарных операций по стандарту обязаны быть Lock-free. Всё остальное можно проверить специальным интерфейсом, являются ли примитивы, работающие с конкретной переменной, Lock-free
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 23.02.2017, 12:18 | |||||||
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 23.02.2017, 12:25 [ТС] | |||
В целом подумал о проблемах локов более углубленно после твоего постаДобавлено через 1 минуту Разве этот процесс не может сместиться на то смещение в шареде где находятся метаданные и по ним определить где чего откатывать? Добавлено через 3 минуты Renji, Ну или просто использовать атомарный булевный флаг как предлагал (гарантировать последовательность записи данных в память) Evg и перед записью данных делать его фолс а после тру. Если фолс так и остался фолсом - значит данные повреждены
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 23.02.2017, 12:26 | ||
|
0
|
||
|
|
||
| 23.02.2017, 12:28 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.02.2017, 12:32 [ТС] | |
|
Evg,
Но тем не менее проблема с откатом частично же решается если мы гарантировано знаем что последовательность записи данных в памяти будет одинаковой. Если там фолс - значит такие данные читать нельзя... И вообще не факт что может понадобится откат. Ну похерились данные ну и пофиг. Такое тоже может быть. Главное знать что они повреждены. Я не говорю что это решит проблему с мертвыми процессами которые захватили примитив но тем не менее хотя бы устранит проблему чтения кривых данных Возвращаясь к примеру с использованием СУБД так же хочу отметить, что она тоже может "упасть" и тормознуть весь процесс... Значит надежности все таки нет. Можно конечно создавать процессы "которые следят за процессами которые следят за следящими процессами" но то что они не рухнут все равно не гарантируется.... Наверное надо копать в сторону алгоритмов а не решений за счет вспомогательных процессов/потоков
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 23.02.2017, 12:37 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 23.02.2017, 12:39 [ТС] | ||
![]() Но все же думаю можно решить как-то на уровне алгоритмов... пока еще не придумал т.к новичок в таких вопросах, может со временем и найду золотую середину
0
|
||
|
|
||
| 23.02.2017, 16:27 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||||||||||||||||
| 25.02.2017, 13:37 [ТС] | ||||||||||||||||||||||
|
В общем я разобрался с порядком выполнения программного кода и пожалуй поделюсь тем, что узнал.
Процессор и его кеши Как известно у каждого ядра есть свой кеш, который это ядро использует для работы с данными потому что лазить в RAM на каждый чих очень дорого. Но данные с точки зрения системы одни, и эти данные могут использовать несколько потоков одновременно. Соответственно кешам ядер нужно каким то образом синхронизироваться. Когда мы пишем данные в переменную в одном потоке, то все остальные ядра которые содержат у себя в кеше данные этой переменной должны инвалидировать свой кеш этой переменной, потому что эти данные уже не актуальны. Соответственно то ядро которое изменило значение переменной должно оповестить другие ядра об измененном значении для обеспечения синхронизации данных в кешах ядер. Процесс инвалидации кеша ядра представляет собой замену старого значения на новое, которое прислало ядро изменившее значение этой переменной. Процесс синхронизации кешей Когда другое ядро получает сообщение о том, что его кеш относительно измененной переменной устарел, оно не сразу обновляет у себя в кеше это значение а помещает/может поместить его в специальную очередь под названием invalidate queue, которую возможно разгребет чуть позже так как сейчас у этого ядра есть более важные дела. При этом ядро изменившее значение переменной тоже не сразу кладет свои данные в свой кеш. Что бы положить эти данные в свой кеш это ядро должно убедиться в том, что все ядра которым он отправил сообщение об инвалидации своих значений успешно приняли это сообщение. Что бы не простаивать в ожидании подтверждения от других ядер что они получили его сообщение, записавшее значение ядро кладет его в свою очередь на запись в кеш, которая называется store buffer. Чтение потоками (ядрами) данных Возвращаемся к примеру
Но тут возникает вопрос. О какой памяти вообще идет речь? А речь идет именно о кеше читающего эти данные потока(ядра), то есть:
Но если процессор таких гарантий не предоставляет, программисту нужно позаботиться об этом самостоятельно. Почему же на самом деле читающий данные поток может не иметь в наличи data не смотря на то, что ready все таки true? Как уже упомяналось выше, может возникнуть ситуация когда читающий поток получит сообщение на инвалидацию данных переменной data, но применит эти изменения к своему кешу чуть позже. На момент чтения data, это "чуть позже" может еще не наступить, и у читающего потока на руках будут старые данные а не свежие, которые появятся после выполнения invalidate queue для синхронизации кешей процессоров. Барьеры памяти Барьер это своего рода гарантия, что при выполнении процессором инструкций потока, наши данные будут в находится в том состоянии, которое гарантирует примененный барьер памяти. То есть в эти процессы отложенной обработки очередей для чтения и записи программист все таки имеет возможность вмешаться. Например, для того, что бы гарантировано знать, что при выполнении ready = true;, данные data = 100; уже сидят в кеш линии текущего ядра, нужно применить барьер StoreStore который гарантирует следующее:
В итоге мы получаем такую вот согласованность. Эти барьеры применяются только к тому ядру, на котором выполняется код. Соответственно под каждый код - свои барьеры, если они нужны. Некоторые детали были опущены специально, что бы упростить изложение этой весьма непростой темы. Добавлено через 19 минут ...
0
|
||||||||||||||||||||||
|
|
||||
| 25.02.2017, 15:15 | ||||
|
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 25.02.2017, 15:19 [ТС] | ||
|
0
|
||
|
|
|
| 25.02.2017, 15:56 | |
|
std::atomic_thread_fence - это слишком консервативное решение, которое надёжно "барьеризует" всё, что можно. А вот запись с std::memory_order_release - это частный случай, который барьеризует только то, что реально надо. И этот вариант работает быстрее, чем std::atomic_thread_fence. Но при этом программист должен понимать, что он делает (т.е. чётко понимать значение всех семантик и как они работают совместно друг с другом). В посте #37 приведён один из вариантов использования. Когда атомарная переменная используется в качестве семафора для критической секции, то запись значения "занято" нужно делать с семантикой "acquire", а запись значения "свободно" - с семантикой "release". Собственно при такой работе мы и получим нужные синхронизации кэшей. Конечно же всё это можно сделать и через std::atomic_thread_fence, но в общем случае это будет работать более медленно (но конкретно на intel'е разницы скорее всего не будет)
Добавлено через 2 минуты Хотя я всё это описывал из общих соображений, никак не связанных конкретно с классом std::atomic. Я никогда с этими классами не работал, просто предполагаю, что они должны работать именно так (было бы совсем нелогично, если бы они работали как-то по другому)
0
|
|
| 25.02.2017, 15:56 | |
|
Аська на основе разделяемой памяти Запись и считывание разделяемой памяти Хранение указателей в разделяемой памяти Считать структуру из разделяемой памяти Сделать массив из 10 int в разделяемой памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж»
Уважаемые коллеги!
Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
|
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
|
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
|
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
|
|
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|