磁気プレート/フラッシュ・セルからローカルJava変数まで、1バイト・リードには長い移動時間があります。
- 磁性板/フラッシュセル
- 内蔵ハードディスクバッファ
- SATA/IDEバス
- SATA/IDEバッファ
- PCI/PCI-Xを:これは、単一バイトが移動する経路でありバス
- コンピュータのデータバス
- DMAを介してコンピュータのRAM
- OS Page-cache
- ユーザ空間
fopen()
はOSによって行われたファイルのバッファリングのほとんどが最近の読み取りを格納し、ページキャッシュに保持され、パフォーマンス上の理由から
- ローカルの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)はすべてこれらの機能をすべてサポートしています。
出典
2011-02-02 03:00:26
vz0