では、ポイントごとにお答えしましょう...
質問 1 : NTFS でファイルを作成すると、物理ハード ディスクに連続して保存されますか?
質問は意味がありません。ファイルを作成すると、NTFS は、追跡に必要なメタデータ用に MFT にスペースを割り当てます。小さなファイルは、実際にはファイルの MFT レコード内に収まる場合があります。そのような常駐ファイルは、定義上、連続しています。ファイルが MFT 内に収まらない場合は、必要に応じて領域のブロックが割り当てられ、連続している場合と連続していない場合があります。一般的に言えば、ファイルの大きさや事前に割り当てる容量がわからないため、NTFS は必要に応じて容量を割り当てますが、SetEndOfFile
関数を呼び出すことでヒントを与えることができます。しかし、それはヒントを提供するだけであり、保証はありませんファイル データがディスクの連続した領域に格納されるようにします。実際、たとえファイルシステムがリアルタイムで最適化を実行したとしても、空き領域が単一の連続したディスク アドレスのブロックとして利用可能であることを *保証できないことを自分自身に納得させるのは簡単なことです。
質問 2 :そうでない場合 - ファイルに書き込むときに、データが連続して (ハードディスクに) 格納されるようにファイルを作成する方法はありますか? データベースのエクステントのようなもの。
なぜこれが重要な懸念事項だと思いますか。通常、ファイルシステムがデータをどのように格納するかは気にする必要はありません。データを保存するという事実だけを気にする必要があります。継続的に保存されていないファイルへのアクセスは遅くなると思うかもしれませんが、必ずしもそうとは限りません。高度なキャッシュ アルゴリズムと O/S によるプリフェッチにより、速度低下が完全に解消されることがよくあります。懸念事項がパフォーマンスである場合、ファイルシステムによる断片化が問題であることを示す実際のハードデータはありますか? その場合、正しいアプローチは、別のファイルシステムを使用するか、ファイルシステムをまったく使用しないことです。
質問 3 :そのようなファイルが存在する場合 - そのファイルから (C read システム コールを使用して) 束/ブロックでデータを読み取る方法はありますか。使用できる最大束サイズは?
C システム コール ( などfread
) は、NTFS、断片化、「束」、およびブロックについて認識しません。彼らが知っているのは、指定されたファイルハンドルから要求されたバイト数を読み取る方法と、指定したバッファにデータを入れる方法だけです。実際には任意のサイズを指定できますが、C ライブラリは O/S およびファイルシステム固有の API を呼び出して、ブロック サイズの倍数でデータを読み取りますが、これは実装定義です。