ファイルシステムの進化
ディスク オペレーティング システムで動作するようにコンピューターを開発する前は、各コンピューターが、コンピューター全体を完全かつ排他的に制御できる単一の独自のアプリケーションを実行するように構築されていました。 アプリケーションは、コマンドをディスク コントローラーに直接送信することで、永続データをディスクまたはドラムに直接書き込みます。 アプリケーションは、ディスク上のデータの絶対位置を管理し、既存のデータが上書きされていないことを確認する役割を担いました。 コンピューター上で実行されていたアプリケーションは 1 つだけであるため、このタスクは難しすぎなかった。
複数のアプリケーションを実行できるコンピューター システムの登場には、アプリケーションが互いのデータを書き込まないようにするためのメカニズムが必要でした。 アプリケーション開発者は、使用されているディスク セクターと空きディスク セクターを適切にマークすることで区別するための単一の標準を採用することで、この問題に対処しました。 これらの標準が合体してディスク オペレーティング システムになり、永続ストレージを管理するためのファイル システムなど、さまざまなサービスがアプリケーションに提供されました。 ファイル システムの登場により、アプリケーションは物理記憶域メディアを直接処理する必要がなくなりました。 代わりに、単にファイル システムにデータ ブロックをディスクに書き込み、その方法をファイル システムに心配させるよう伝えるだけです。 さらに、ファイル システムでは、アプリケーションがディレクトリと呼ばれる抽象化を使用してデータ階層を作成することができました。 ディレクトリには、ファイルだけでなく他のディレクトリも含まれる可能性があり、そのディレクトリには独自のファイルやディレクトリなどが含まれる可能性があります。
ファイル システムは、アプリケーションとディスクの間に単一レベルの間接参照を提供し、その結果、ファイル システムが実際にファイルを非連続セクターに格納している場合でも、すべてのアプリケーションがディスク上の単一の連続したバイト ストリームとしてファイルを見たという結果になりました。 間接参照により、アプリケーションはストレージ デバイス上のデータの絶対位置を追跡する必要がなくなった。
現在、ファイル入出力用のほぼすべてのシステム API は、フラット ファイルに情報を書き込むアプリケーションを提供しています。 アプリケーションでは、このファイルは、ディスクがいっぱいになるまで、必要に応じて大きくなる可能性がある 1 つのバイト ストリームと見なされます。 長い間、これらの API は、アプリケーションが永続的な情報を格納するのに十分でした。 アプリケーションは、1 つの情報ストリームを処理して、増分の "高速" 保存などの機能を提供する方法に大きなイノベーションを加えています。
ただし、コンポーネント オブジェクトの世界では、単一のフラット ファイルにデータを格納することは効率的ではなくなりました。 ファイル システムが複数のアプリケーションで同じ記憶域メディアを共有する必要性から生じたのと同様に、コンポーネント オブジェクトには、1 つのファイルの概念フレームワーク内でストレージを共有できるシステムが必要になります。 従来のフラット ファイル ストレージを使用して個別のオブジェクトを格納できますが、オブジェクトの 1 つがサイズを大きくする場合、または単に別のオブジェクトを追加する場合は、ファイル全体をメモリに読み込み、新しいオブジェクトを挿入して、ファイル全体を保存する必要があります。 このプロセスには非常に時間がかかる場合があります。
COM によって提供されるソリューションは、第 2 レベルの間接参照 (ファイル内のファイル システム) を実装することです。 フラット ファイル ストレージでは、ディスク上の大きな連続したバイト シーケンスを、1 つのシーク ポインターを使用して 1 つのファイル ハンドルを介して操作する必要があります。 これに対し、COM 構造化ストレージでは、1 つのファイル システム エンティティを、ディレクトリやファイルのように動作する 2 種類のオブジェクト (ストレージとストリーム) の構造化コレクションとして扱う方法を定義します。