第4回 メインフレームLinuxの実装(後編)
日本アイ・ビー・エム株式会社
システムズ&テクノロジー・エバンジェリスト
北沢 強
2008/10/23
アーキテクチャ特有の実装の検討
Linuxカーネル機能の中で、アーキテクチャ特有の実装として検討したのは、以下の項目です。
- Linuxの起動処理(ブート)
- メモリ管理
- システムコール・インターフェイス
- デバイスドライバ
- SMP(Symmetric Multi Processing)
- SIGNALの処理
これらの中でも特徴的な実装として、メモリ管理とデバイスドライバについて紹介します。
■メモリ管理―64ビット・アドレッシングの実装
メインフレームは完全な64ビットアドレッシングを実装していますが、実際に装備されるメモリはほとんどの場合で1Tbyte以下です。Linuxとして64ビットアドレッシングを完全実装してしまうと、ページテーブルや制御ブロックなどの管理用メモリを大量消費してしまい、メモリ効率がよくないうえに、DAT(Dynamic Address Translation)による変換も段数が多く、効率が悪くなります。
そこで、現状に見合ったサイズで効率よく動かすため、メインフレームLinuxでは42ビットアドレッシング(4Tbytesまで)を採用しています(カーネルソース内のパラメータを変更してリビルドすれば、もっと大きなビット数に変更することも可能)。
64bit-DATの場合(図1)に比べて、42bit-DAT(図2)では、Region-1とRegion-2を0として変換ステップを省略でき、5レベル変換を3レベル変換に減らすことで高速化にも寄与しています。アドレス変換モードにおいては、制御レジスタとアクセスレジスタを活用しています。特にアクセスレジスタは、コンテキストスイッチの高速化に寄与しています。
図1 動的アドレス変換 64bit DAT(クリックすると拡大します) |
図2 動的アドレス変換 42bit DAT(クリックすると拡大します) |
■メモリ管理 - コンテキストスイッチの高速化
LinuxはマルチタスクOSであり、複数のプロセスが仮想メモリによる複数のアドレス空間で同時並行的に実行されます(図3)。しかし、ハードウェアに搭載されるCPUは1〜数十個であり、同時に動くプロセス数よりも少ないので、時分割処理によって1つのCPUで複数のプロセスを実行します。
図3 アドレス空間のレイアウト |
このときのプロセスを切り替える処理がコンテキストスイッチであり、Linuxカーネルの重要な仕事の1つです。
コンテキストスイッチを行うときには、プロセスのコンテキストを退避させたり戻したりするため、仮想アドレス空間の間でのデータのコピーが発生します。このメモリ間のコピー量が大きくなるほど、カーネルのオーバーヘッドとして目立つようになり、高負荷になってシステムが急にスローダウンしてしまうような原因の1つとなります。
メインフレームLinuxでは、それを高速化するためにアクセスレジスタを使いました。アクセスレジスタは、仮想アドレス空間をまたいだ処理ができる特別なレジスタで、ベースレジスタとして使用できます。
図4に示したとおり、通常のプライマリ空間やセカンダリ空間(ホーム空間)においては、そのアドレス空間の中でのコピーは簡単な命令で自由にできますが、アドレス空間をまたいでのコピーは簡単なハードウェア命令だけではできません。そこで、アクセスレジスタを使って、2つのアドレス空間それぞれをポイントしてコピーします。
図4 アクセスレジスタによるアドレス空間をまたいだコピー |
コンテキストスイッチにおけるコンテキストのコピーは、たった数ステップのハードウェア命令で実行できるため、非常に高速です。結果として、高負荷下で多重度が高い状況でも、コンテキストスイッチによるオーバーヘッドがほとんどなく安定稼働を続けられるのです。一般的にメインフレームはCPU使用率が高い状態であっても安定しているといわれますが、これも理由の1つだといえるでしょう。
2/3 |
|
||||||
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|