Объем локального кэша против синхронизации с общей памятью, предоставляемой мьютексом - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть два процесса: клиент, который потребляет данные, и сервер, который считывает данные с диска, расшифровывает их и делает их доступными для клиента.Они взаимодействуют через разделяемую память, и хотя никогда не возникает конфликт доступа при записи, поскольку они никогда не записывают в одни и те же области памяти, мне пришлось использовать мьютекс, чтобы заставить значения разделяемой памяти быть «актуальными» (согласованными) по отношению к-а-вид их копии в локальном кэше двух процессов.Этот вопрос касается степени (объема) разделяемой памяти, которую мьютекс заставит быть согласованным.

Обычно моя проблема заключается в

Process A changes shared memory variable from value X to value Y, but...
... in fact it only updates its local cache copy immediately.
... the main memory variable will be updated at some later time.

So process B will not "see" that change in shared memory immediately ...
... unless some sort of data synchronisation is enforced

Поэтому я использую общий мьютекс для обеспечения синхронизации.Я вполне понимаю, что если у меня есть два процесса и я выполняю (в псевдокоде) процесс A:

lock_mutex
update [shared variables]
release mutex

, то содержимое [общих переменных] будет согласованным, когда процесс B блокирует мьютекс и проверяет его,потому что последовательность блокировки / разблокировки мьютекса вынуждает выполнять обновление из локально кэшированных значений.

Но хотя документация по мьютексам очень четко описывает исполняемые строки, защищенные между событиями блокировки / освобождения, не так ясно о степенипамяти, которая вынуждена быть последовательной в этом процессе.Он говорит более или менее, что «память в текущей области будет защищена», но не определяет, что такое «текущая область».

Так что насчет этого фрагмента псевдокода (все в пределах одной функции):

update [block of data in shared memory]
lock_mutex
update [a few other shared variables elsewhere in shared memory]
release mutex

Каково состояние согласованности между локальным кешем и разделяемой памятью блока данных [в общем хранилищепамять], когда другой процесс блокирует этот мьютекс?Он входит в сферу действия функции, но не входит в фрагмент кода блокировки / разблокировки мьютекса, поэтому я не знаю, каким будет его статус согласованности.

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

Я должен добавить, что я пишу на простом Ansi C, как на Windows (с использованием собственных API-интерфейсов Win32), так и на Linux (с использованием pthreads), работая на обычном многоядерном оборудовании x86_64.

Заранее спасибо.

...