この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
出典検索?: "セグメント方式"
セグメント方式(セグメントほうしき、英: memory segmentation)は、メモリ管理の方式の一つ。プログラムやデータをセグメントまたはセクションという「可変な」大きさのまとまりで管理する。セグメントは、メモリ空間上で、情報の属性などによって分類されたグループである。セグメント方式でメモリ位置を参照するには、セグメントを識別する値とセグメント内のオフセットを指定する。セグメントまたはセクションはプログラムをコンパイルした際に生成されるオブジェクトファイルでも使われており、それらがリンクされて実行ファイルが生成され、そのイメージがメモリにロードされる。
セグメントは仮想記憶やメモリ保護機能を実現する方式の一つである。プログラムのモジュール毎やメモリ使用法の異なるクラス毎に「コードセグメント」や「データセグメント」といった各種セグメントが生成される。1つのセグメントを複数のプログラムが共有することもある[1]。 オペレーティングシステムは、必要なプログラムやデータを主記憶上に読み込み(ロールイン)、セグメントとして管理する。読み込む際に、空き領域が足りないときは、不要なセグメントを補助記憶装置に退避(ロールアウト)して必要な空き領域をつくる。 各セグメントは、セグメントテーブルで管理され、セグメント番号とセグメントの開始物理アドレスが保管されている。各セグメントに属するプログラムやデータの実アドレスは、セグメントテーブル内の開始アドレスとそこからの相対アドレスから算出する。 セグメントは、実記憶上に連続した領域として割り当てられる。セグメントの大きさが可変長なため、場合によっては、実記憶上には空き領域の合計が十分あるのに連続領域が空いていないことがある(フラグメンテーション)。 セグメント方式とページング方式を組み合わせた方式。この方式では、プログラムコード用、データ用などの各セグメントが複数のページで構成される。これによって、1つのセグメントが連続した実メモリに存在する必要が無く、外部断片化を防ぎ、効率的にメモリを使用することができる。さらに、プログラムコード用のセグメントの書き換えを禁止するといったアクセス制限や、リードオンリーのセグメントをプログラム間で共有することによりメモリ消費を抑えるといったことができる。 ページングに対応したシステムにおいても、一つの(仮想)アドレス空間を区切ることでセグメントを実現する場合もある。たとえば、プロセスが使用するコード、データやスタックをそれぞれ、0x1000から0x2000までのコードセグメント、0x2000から0x4000までのデータセグメント、0xe000から0xffffffまでのスタックセグメント、に配置して使うことである。ハードウェアがこうした方式のセグメンテーションに対応していれば、それぞれの領域に対してデータ実行防止のような保護をセグメントごとに行うことができる。 この場合、CPUアーキテクチャの互換性が高くなるが、プロセス間でセグメントを共有するときに、ページテーブルを共有してメモリ使用量を削減するというメリットはなくなる。 Linuxはこの方式を採用している。[3] セグメントはメモリ保護を実装する方式の1つである。ページ単位のメモリ保護もあり、両者を組み合わせることもできる。セグメントの大きさは可変であり、最小の場合1バイトとすることもできる[4]。セグメントは通常、ルーチン群やデータテーブル群といったプログラム上の自然な領域に対応しており、プログラマから見えるようになっていることが多い[1]。
仮想記憶におけるセグメント方式
ページ化セグメンテーション(多重仮想記憶)多重仮想記憶の概念図
フラットメモリモデルにおけるセグメンテーション
ハードウェア実装