🎉

【OS】ページングとセグメンテーション

に公開

はじめに

現代のオペレーティングシステム(OS)は、限られた物理メモリを効率的に管理するために、高度なメモリ管理技術を採用しています。その中でも特に重要なのが「ページング」と「セグメンテーション」という2つの技術です。これらの技術はどちらもメモリ空間を論理的に分割して管理する方法ですが、そのアプローチと特徴には大きな違いがあります。
本記事では、ページングとセグメンテーションについて、わかりやすくまとめていきます。

ページングの仕組みと特徴

ページングは、物理メモリを「ページ」と呼ばれる固定サイズのブロックに分割して管理する技術です。一般的なページサイズは4KBですが、アーキテクチャによっては2MBや1GBなどの大きなページを使用することもあります。

この技術は、プログラムが使用する論理アドレス空間と、実際の物理メモリ空間を分離して管理します。
OSは「ページテーブル」というデータ構造を使用して、プログラムから見える仮想アドレスと実際の物理アドレスとの対応関係を管理します。
これにより、プログラムは連続した仮想アドレス空間を持っているように見えますが、実際の物理メモリ上ではページがバラバラに配置されることになります。

ページングの最大の利点は、メモリの断片化(フラグメンテーション)を最小限に抑えられることです。固定サイズのページを使用するため、メモリ空間に「隙間」が生じにくくなります。また、使用されていないページをディスク上のスワップ領域に退避させることで、物理メモリよりも大きな仮想メモリ空間を提供できるのも特徴です。

ただし、ページングにも欠点はあります。
固定サイズのページを使用するため、小さなデータを格納する場合でも1ページ全体を占有してしまう「内部フラグメンテーション」が発生する可能性があります。また、大規模なプログラムではページテーブルが巨大化し、管理コストが増大するという問題もあります。

セグメンテーションの仕組みと特徴

セグメンテーションは、プログラムを論理的な単位(セグメント)に分割して管理する技術です。
各セグメントは、コードセグメント、データセグメント、スタックセグメントなど、プログラムの機能ごとに分けられます。
重要なのは、これらのセグメントのサイズが固定ではなく、必要に応じて可変であるという点です。

セグメンテーションでは、「セグメントテーブル」を使用して論理アドレスと物理アドレスの変換を行います。各セグメントは独立したアドレス空間を持つため、プログラムの構造に沿った自然なメモリ管理が可能になります。また、セグメントごとにアクセス権限を設定できるため、メモリ保護の面でも優れています。

しかし、セグメンテーションには重大な欠点があります。可変サイズのセグメントを使用するため、メモリ空間に「外部フラグメンテーション」と呼ばれる隙間が生じやすくなります。この断片化問題を解決するには定期的にメモリの再配置(コンパクション)を行う必要があり、システムのオーバーヘッドが大きくなってしまいます。

2つの技術の比較と現代システムでの利用

ページングとセグメンテーションは、それぞれ異なるアプローチでメモリ管理の問題に取り組んでいます。ページングが「均一な固定サイズブロック」による管理を基本とするのに対し、セグメンテーションは「可変サイズの論理単位」に基づいた管理を行います。

現代のOSでは、ページングが主流の技術として採用されています。
LinuxやWindows、macOSなどの主要なオペレーティングシステムは、ほぼ例外なくページング方式を採用しています。その理由は、ページングが持つシンプルさと効率性、特に断片化への強さにあります。

ただし、x86アーキテクチャなどでは、セグメンテーションの考え方を部分的に残している場合もあります。例えば、x86の保護モードでは、セグメンテーションとページングを組み合わせたハイブリッド方式が採用されています。これは、セグメンテーションが提供するメモリ保護機能の利点を活かすためです。

まとめ

メモリ管理技術の進化は、OSの発展と密接に関わってきました。ページングはそのシンプルさと効率性から現代OSの標準となりましたが、セグメンテーションの考え方も完全に消えたわけではありません。両技術の長所を理解することは、OSの動作原理を深く理解する上で重要です。

実際のシステムでは、これらの技術が組み合わされて使用されることも少なくありません。例えば、セグメンテーションでプログラムの論理構造を保護しつつ、ページングで物理メモリを効率的に管理するといったハイブリッド方式も存在します。このような技術の組み合わせによって、現代のOSは高度なメモリ管理を実現しているのです。

参考・画像引用元URL

https://hogetech.info/linux/kernel/memory
https://itmanabi.com/virtual-memory/
https://ja.wikipedia.org/wiki/ページング方式
https://os.phil-opp.com/ja/paging-introduction/

Discussion