Каков правильный способ использования CreateFileMapping и MapViewOfFile, если я намереваюсь получить доступ к нескольким частям файла несколькими процессами?

Я пишу компонент на C, который будет использоваться несколькими разными процессами, обращающимися к одному и тому же файлу.

Каждый процесс будет одновременно обращаться к разным частям файла, в основном для чтения, но также и для записи.

Я пытаюсь выяснить, правильный ли это путь:

Вариант A: каждый процесс должен вызывать CreateFileMapping один раз для всего файла, а затем использовать MapViewOfFile несколько раз в разных разделах для доступа к нужным частям, то есть, если у меня есть 10 разделов, к которым я хочу получить доступ, я вызову CreateFileMapping один раз для всего файла, конец в конец, а затем MapViewOfFile 10 раз, по одному разу для каждой части файла.

OR

Вариант B: каждый процесс должен вызывать CreateFileMapping и MapViewOfFile для каждого конкретного раздела, к которому он хочет получить доступ, то есть, если у меня есть 10 разделов, к которым я хочу получить доступ, я буду вызывать CreateFileMapping и MapViewOfFile каждые 10 раз.

Спасибо!


person Che Kofif    schedule 21.01.2012    source источник


Ответы (1)


Вам обязательно нужно вызвать CreateFileMapping и MapViewOfFile по крайней мере один раз для каждого процесса, чтобы получить доступ к данным. Однако вам не нужно вызывать их более одного раза. Конечно, если само сопоставление велико, вы можете отменить сопоставление и переназначить, чтобы сэкономить виртуальное адресное пространство, но если объем данных не так велик, вы можете пропустить это.

Сопоставив ваше сопоставление файлов, ваш процесс видит данные напрямую. Операции чтения и записи выполняются мгновенно, и для сериализации доступа и предотвращения условий гонки потоков необходимо использовать Взаимодействие между процессами, например семафоры.

Возможно, вам захочется прочитать и изучить пример кода: Общая память. Также попробуйте выполнить поиск в Google по запросу MapViewOfFile + WaitForMultipleObjects для получения дополнительной информации.

person Roman R.    schedule 21.01.2012
comment
Ваше здоровье. Я с самого начала понял, что каждый процесс должен вызывать bpth, и я пытаюсь понять (и до сих пор не понимаю), должен ли я в контексте одного процесса создавать CreateFileMapping для всего файла (от начала до конца). ), а затем использовать MapViewOfFile для просмотра небольших частей файла, или же мне следует использовать CreateFileMapping несколько раз в каждом процессе, отображая меньшие части по мере продвижения. Я предполагаю, что мое основное недоразумение заключается в том, должны ли они оба использоваться для небольших частей файла или только для MapView. - person Che Kofif; 21.01.2012
comment
CreateFileMapping дублирует дескрипторы одного и того же объекта ядра. Можно несколько раз, но зачем? Вам не нужно. Вы можете вызвать его один раз для сопоставления. Что касается MapViewOfFile, вам решать, хотите ли вы отобразить/отменить отображение частей или всего этого. Вы не тратите ресурсы впустую, кроме использования ограниченного объема виртуального адресного пространства. Возможно, вам придется подумать о частях, если вы знаете, что отображение может быть довольно большим, а обработка данных, которую вы делаете, предполагает, что вам не нужны случайные части памяти, и вместо этого вы можете делать это довольно последовательно. - person Roman R.; 21.01.2012