3

ひとつのプログラムがファイルF.txtを読み込んでいて、別のプログラムが同時にこのファイルに書き込んでいるとしましょう。ファイルを読み書きしているときに(OSレベルで)何が起こっていますか?

私はあいまいさがあることを実感(私はシステムプログラマであればどのように私はこの機能を実装するだろうことを考えている):最初のプログラムは何を参照します

  1. ここで、第2プログラムは新しいバイトを書き込みますか? (すなわち、「所定の場所に書き込む」とは新しいファイルに書き込んだり、古いファイルを新しいファイルに置き換えたりする)

  2. いくつのプログラムが同じファイルに同時に書き込むことができるのか?

    ..多分それほど明白ではない。だから、

、私の質問は以下のとおりです。

  1. ファイルに機能を読出し/書込みのための主要な戦略は何ですか?

  2. どのOSでサポートされていますか(Windows、Linux、Mac OSなど)?

  3. 特定のプログラミング言語に依存する可能性がありますか? (私はJavaがサポートされているすべてのOS上でいくつかの統一された動作を提供しようとすることができると仮定することができます)

答えて

5

磁気プレート/フラッシュ・セルからローカルJava変数まで、1バイト・リードには長い移動時間があります。

  1. 磁性板/フラッシュセル
  2. 内蔵ハードディスクバッファ
  3. SATA/IDEバス
  4. SATA/IDEバッファ
  5. PCI/PCI-Xを:これは、単一バイトが移動する経路でありバス
  6. コンピュータのデータバス
  7. DMAを介してコンピュータのRAM
  8. OS Page-cache
  9. ユーザ空間fopen()はOSによって行われたファイルのバッファリングのほとんどが最近の読み取りを格納し、ページキャッシュに保持され、パフォーマンス上の理由から
  10. ローカルのJava変数

を読み出しバッファ別名LIBCは、バッファを読みますファイルの内容をRAMに書き込む。 Javaコードからのすべての読み取りおよび書き込み操作は、ローカルバッファからとに行われることを意味

FileInputStream fis = new FileInputStream("/home/vz0/F.txt"); 

// This byte comes from the user space buffer. 
int oneByte = fis.read(); 

ページには、通常、メモリの4キロバイトの単一のブロックです。すべてのページには特別なフラグと属性があり、そのうちの1つは「汚いページ」です。つまり、ページにはフィジカルメディアに書き込まれていない変更データがあります。

OSが汚れたデータをディスクにフラッシュすることを決定すると、しばらくしてから、データは来た場所とは反対の方向にデータを送ります。二つの異なるプロセスが同じファイルにデータを書き込むたび

は、結果の動作は以下のとおりです。

  • インポッシブル、ファイルがロックされている場合。 2番目のプロセスはファイルを開くことができません。
  • ファイルの同じ領域に書き込む場合は未定義です。
  • ファイルの異なる領域を操作する場合に必要です。

"region"は、アプリケーションが使用する内部バッファサイズに依存します。たとえば、2メガバイトのファイルでは、2つの別個のプロセスが次のように書くことがあります。

  • 最初の1kBのデータ(0,1024)に1つ。
  • データの最後1kBの上の他の(2096128; 2097152)ローカルバッファのサイズは2メガバイトである場合にのみ

バッファ重複やデータ破損が発生します。 Javaでは、Channel IOを使用して、内部で起こっていることをきめ細かく制御できるファイルを読み取ることができます。

多くのトランザクションデータベースでは、sync operationを発行してローカルRAMバッファからの書き込みをディスクに強制的に戻します。 1つのファイルに関連するすべてのデータが磁気プレートまたはフラッシュセルにフラッシュされ、停電時にデータが失われることはありません。

最後に、memory mapped fileは、ユーザープロセスがユーザー空間のバッファリングをバイパスしてページキャッシュから直接読み書きできるようにするメモリ領域です。

ページキャッシュシステムは、マルチタスキングprotected mode OSのパフォーマンスにとって不可欠であり、最新のオペレーティングシステム(Windows NT以上、Linux、MacOS、* BSD)はすべてこれらの機能をすべてサポートしています。

0

戦略は、ファイルシステムと同じくらいすることができます。一般に、SOはディスクと同期する前にファイルをキャッシュすることによってI/O操作を回避することに重点を置いています。バッファから読み込むと、以前に保存されたデータがバッファに読み込まれます。

JVMは、ファイル記述子バッファをクローズファイルでディスクに同期させるか、またはプログラムがfsync()のようなメソッドを呼び出すときにバッファを同期化させることができます(この場合、MySQLのMyISAMエンジンはこのレイヤーを多く使用します)。また、定義されたしきい値を超えたときにはSOによって示されます。 JVMでは、これはもちろん、サポートされているすべてのOSで統一されています。

関連する問題