4

Linux では、パイプへの書き込み時に、データがメモリ ページ サイズ (64 ビット rhel で少なくとも 4k) 以下の場合、OS は書き込み全体が成功するか失敗するかを保証しますが、破損はありません。複数のプロセスが同時に書き込みを行っている場合のデータの。これは、通常のファイルへの書き込みにも適用されます。

  1. 私の質問は、この原子性は Linux の仮想メモリの機能ですか? はいの場合は、2 つのプロセス間の共有メモリ シナリオを検討してください。このシナリオでは、1 つのプロセスがスケジューラによる書き込みの途中でスワップ アウトされます。仮想メモリ サブシステムは、2 番目のプロセスが同じページに書き込めないように、プロセスが書き込んでいたメモリ ページもロックされることを保証しますか?

  2. ページ レベルでのこの原子性は、プロセス全体、または同じプロセスのスレッド間でも適用できますか?

4

1 に答える 1

1
  1. いいえ。2つのプロセスが共有メモリを使用している場合、これからのプロセス間に暗黙のロックはありません。あなたは自分でそのようなロックを手配する必要があります(そしてロックの所有者が交換された場合、あなたの他のプロセスは所有者が交換されてロックを解除するまで十分に待つ必要がありますロック)。

  2. ページが他のメモリ全体と異なるという暗黙の(または明示的な)ルールはないと思います。パイプとファイルへの書き込みには特定のルールが適用されます。すべてのデータが1ページに収まる場合、OSは1つのブロックとして書き込むことができます。OSがリソースのロックを保持していることがわかると思います。一度に1ページずつ書き込みます。データがページよりも大きい場合、ロックが解除されると、他のプロセス[またはスレッド]を実行する準備が整い、最初のプロセスからロックを「盗む」可能性があります。1ページ未満で、1回のロックされた実行で書き込み全体を実行します。

ただし、明確にするために、一般にメモリページの書き込み(または読み取り)に暗黙のロックはありません。これは、特定の関数に厳密に適用されます。通常、特定の関数には、他のプロセスが同じ関数で実行されないようにする何らかのロックもあります[少なくとも特定のリソース(ファイル記述子など)では、他のプロセスが別のファイルから読み取ることができる可能性があります。ファイルの読み取りまたは書き込みのプロセスと同時に実行されますが、ファイルは、ロックが保持されているブロックのサイズごとにアトミックですが、「シェイクスピア全体を一度に書き込む」システムコールではブロックされる可能性があるため、アトミックではありません。他のいくつかの重要なプロセス。

于 2013-01-18T00:01:20.390 に答える