オペレーティングシステムの概念
ディスク上のファイルを順次読み込むことを検討してください。標準システムコール open(), read() および write() の使用。すべてのファイルアクセスにはシステムコールとディスクアクセスが必要です。。
あるいは、これまでに説明した仮想メモリ技術を使用して、ファイルI / Oを通常のメモリアクセスとして扱うこともできます。この方法は メモリマッピングファイル、仮想アドレス空間の一部をファイルに論理的に関連付けることができます。今後見ていきますが、これは次のような結果につながる可能性があります。大幅に向上したパフォーマンス。ファイルのメモリマッピングは、ディスクブロックをメモリの1つ以上のページにマッピングすることによって行われる。ファイルへの初期アクセスは、通常の要求ページングを介して行われるため、ページエラーが発生します。ただし、ファイルのページサイズ部分はファイルシステムから物理ページに読み込まれます(一部のシステムは一度にページサイズよりも多くのメモリブロックを読み取ることを選択できます)。ファイルへの後続の読み書きは通常のメモリアクセスとして扱われます。 read() および write() システムコールを使用してオーバーヘッドを発生させるのではなく、メモリ内でファイルを操作することで、ファイルへのアクセスと使用を簡素化および高速化できます。
メモリマップされたファイルのパフォーマンスを分析できますか?
私が正しい場合、メモリマッピングファイルは次のように動作します。メモリマップを生成するにはシステムコールが必要です。その後、マップされたメモリにアクセスすると、ページ障害が発生します。ページフォルトにもオーバーヘッドがあります。
メモリマッピングファイルは、標準I / Oシステムコールと比較してどのようにパフォーマンスを大幅に向上させますか?
ベストアンサー1
メモリマッピングファイルは、呼び出し時に発生するコピーとバッファread()
リングを直接防ぎます。データが格納されているプロセスアドレス空間のバッファへのポインタをwrite()
呼び出してread()
含めます。write()
カーネルはこれらの場所間でデータをコピーする必要があります。 Use はmmap()
ファイルをプロセスのアドレス空間にマッピングするため、プロセスはコピーせずにファイルアドレスを直接指定できます。
ファイルが最初にメモリにロードされると、最初の呼び出し後にメモリマップされたファイルにアクセスするときにシステムコールのオーバーヘッドはありませんmmap()
。マップされたファイルのページがメモリにない場合、アクセス中にエラーが発生し、カーネルがページをメモリにロードする必要があります。ファイルの読み込み中に多くのエラーが発生した場合は、大きなチャンクを読み取る方がこの場合より速くなる可能性がread()
あります。 (事前カーネルに通知できます。mmap()
mmap()
madvise()
カーネルがページにアクセスする前にページを事前にロードできるようにします。
詳細については、Stack Overflowに関する質問をご覧ください。mmap() と読み出しブロック