|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Синхронизация доступа к разделяемой памяти21.02.2017, 12:08. Показов 12452. Ответов 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 в разделяемой памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|