2012-01-21 47 views
1

私は同じファイルにアクセスするいくつかの異なるプロセスによって使用されるコンポーネントをC言語で書いています。複数のプロセスでファイルの複数の部分にアクセスする場合、CreateFileMappingとMapViewOfFileを使用する正しい方法は何ですか?

各プロセスは、ファイルの異なる部分に同時にアクセスします。ほとんどの場合、読み込み用と書き込み用です。

私は正しい方法であるかを把握しようとしています:

Opition A: 各プロセスはファイル全体に対して一度CreateFileMapping関数を呼び出し、それが必要とする部品にアクセスするためのさまざまなセクションでのMapViewOfFileを複数回使用するにはつまり、私がアクセスしたいセクションが10つある場合、ファイルの各部分に対して1回、ファイル全体に対して1回、終わりから終わりに、そしてMapViewOfFileを10回呼び出すことになります。

OR

オプションB: それぞれ特定のセクションにCreateFileMapping関数&のMapViewOfFileを呼び出すために、各プロセスのために、それは私が10個のセクションを持っている場合、私は私がCreateFileMapping関数&のMapViewOfFile各10回を呼び出しますアクセスしたいという意味、アクセスしたいです。

ありがとうございます!

答えて

3

データにアクセスするには、プロセスごとに少なくとも1回、CreateFileMappingMapViewOfFileに電話する必要があります。しかし、あなたはそれを一度以上呼び出す必要はありません。もちろん、マッピング自体が大きければ、マップを解除して再マップして仮想アドレス空間を保存することもできますが、データ量がそれほど多くない場合は、これをスキップできます。

ファイルマッピングをマップすると、プロセスはデータを直接参照します。読み書き操作は即座に行われ、アクセスをシリアライズし、スレッド競合状態を防ぐためにセマフォなどのInterprocess Communicationを使用する必要があります。

サンプルコード:Shared Memoryを読んで勉強したいことがあります。また、詳細については、MapViewOfFile + WaitForMultipleObjectsのgoogle検索をお試しください。

+0

乾杯。最初から、各プロセスがbpthを呼び出す必要があり、理解しようとしている(まだ理解していない)のは、単一のプロセスのコンテキストで、ファイル全体でCreateFileMappingを行うかどうかということです)そして、MapViewOfFileを使用してファイルの小さな部分を表示するか、または各プロセスでCreateFileMappingを何度も使用する必要があるかどうかを確認します。 私は基本的な誤解は、両方をファイルの小さな部分で使用するのか、それともMapViewだけで使用するのかということです。 –

+0

'CreateFileMapping'は、同じカーネルオブジェクトにハンドルを複製します。あなたは何回もすることができますが、なぜですか?あなたはする必要はありません。マッピングのために一度呼び出しても問題ありません。 'MapViewOfFile'に関しては、部分や全体をマップ/アンマップするかどうかはあなた次第です。限られた量の仮想アドレス空間を消費する以外に、リソースを無駄にすることはありません。マッピングがかなり大きいことがわかっている場合は、部分を考える必要があります。データ処理では、メモリのランダムな部分が不要で、代わりにむしろ順番に行うことができます。 –

+0

華麗な、ありがとう:D –

関連する問題