チャネルコントローラとは
チャネルコントローラは、
コンピュータシステム内で周辺機器と
主記憶装置(メモリ)との間のデータ転送を管理する専用のプロセッサです。これは、
CPUが直接
入出力処理を行う代わりに、チャネルコントローラがデータの読み書きや周辺機器の制御を代行することで、
CPUの負荷を軽減し、システム全体の効率を向上させることを目的としています。
概要
従来の
コンピュータシステムでは、
CPUが全ての
入出力処理を直接担当していました。しかし、
入出力処理はデータのフォーマット変換など複雑な作業を伴うことが多く、
CPUは処理が完了するまで待機する必要がありました。この状態は「I/Oバウンド」と呼ばれ、システム全体のパフォーマンス低下を招く原因となっていました。
チャネルコントローラは、この問題を解決するために導入されました。チャネルコントローラは、独自の
CPU、メモリ、回路を持ち、
入出力処理に特化した動作を行います。
CPUはチャネルコントローラに小さなプログラム(チャネルプログラム)を渡し、I/Oジョブを依頼します。チャネルコントローラは、
CPUの助けを借りずにジョブを完了させ、完了後に
CPUに割り込みを通知します。これにより、
CPUは他の処理に専念できるようになり、システム全体の効率が向上します。
チャネルコントローラは、
主記憶装置に直接アクセスできるため、DMA(ダイレクトメモリアクセス)コントローラとも呼ばれますが、DMAコントローラの定義はより広く、プログラム不可能なデバイスも含まれます。
歴史
チャネルI/Oの最初の採用例は、1957年に登場した真空管式
メインフレームIBM 709でした。このシステムの周辺機器であるModel 766 Data Synchronizerが、世界初のチャネルコントローラとされています。その後、
IBM 7090では複数のチャネルを制御できるチャネルマルチプレクサが登場し、System/360や初期のSystem/370では、セレクタチャネルやマルチプレクサチャネルが大規模で高価な別プロセッサとして構成されました。
アムダールはSystem/370互換機で、C-Unitと呼ばれる単一の内部ユニットで最大16本のチャネルをサポートしました。C-Unitは特殊な有限状態機械として機能し、各チャネルの状態を独立して制御することで、
IBMのシステムよりも高い柔軟性を実現しました。
IBMはこれに対抗するために設計変更を余儀なくされました。
IBM以外では、1965年のCDC 6600スーパー
コンピュータが、周辺プロセッサ(PP)と呼ばれる強力なプロセッサをチャネルコントローラとして採用しました。その後、チャネルコントローラは多くの
メインフレームに採用され、より小型の
コンピュータと比較した際の重要な利点となりました。
最近では、
コンピュータの性能向上や
オペレーティングシステムの進歩により、小型の
コンピュータではチャネルコントローラが使われなくなりましたが、その機能は
バスマスタリング周辺機器(PCIのDMAデバイスなど)に受け継がれています。
解説
チャネルI/Oのリファレンス実装とされているのは、
IBM System/360とその後の
メインフレームです。チャネルI/O方式を採用したシステムでは、
CPUとは独立して
入出力操作全体を制御する専用のハードウェアが存在します。
CPUは「チャネルプログラム」と呼ばれる
入出力コマンド群をI/O専用ハードウェアに渡すだけで、実際の
入出力処理はチャネルコントローラが代行します。処理完了後、I/Oハードウェアが
CPUに割り込みを通知します。
チャネルは、単なる通信媒体ではなく、I/O操作のリスト(チャネルプログラム)を解釈してI/O処理を行うインテリジェントなハードウェアです。各チャネルには1つ以上のコントローラや周辺機器が接続されており、チャネルプログラムはチャネル自身へのコマンドと接続された各種コントローラや周辺機器へのコマンドを含みます。チャネルプログラムは、データの値を調べ、条件分岐することもできるため、
CPUは個々の
入出力操作を起動/監視/管理するオーバーヘッドから解放されます。チャネルI/Oは、DMAよりも複雑で機能が豊富です。
大型
メインフレームでは、
CPUは並行して動作する強力なハードウェアコンポーネントの一つに過ぎず、様々な
入出力コントローラが専門的に
入出力を処理し、それらがチャネルに接続されています。このアーキテクチャにより、
CPUの性能を犠牲にすることなく、
入出力性能を最適化することが可能です。
チャネルプログラム
チャネルプログラムは、チャネルに接続された機器の
入出力操作(読み込みやシークなど)を指示するコマンドの集まりです。チャネルプログラムはOSや診断プログラムなどが作成し、
CPUが特定の
機械語命令を実行することで、
入出力処理ユニットに信号が送られ、要求されたI/O処理が実行されます。
CPUは、その間別の作業を行うことができます。
IBMメインフレームの初期の機種では、チャネルは1つの周辺装置と1対1に対応していました。その後、
RISCプロセッサをチャネルプロセッサとして使用するようになり、全チャネルを1つのチャネルプロセッサで扱うようになりました。例えば、
IBM Linux/390では、DASDのトラック全体のフォーマットを1つのチャネルプログラムで実行できます。
CCW(チャネルコマンド語)は、チャネルプロセッサ専用の命令セットであり、チャネルプロセッサは有限状態機械として機能します。CCWは、デバイスに対して読み込み、書き込み、センシングなどのI/O操作を行います。チャネルI/Oを採用したアーキテクチャでは、全ての周辺機器がチャネルに接続され、
入出力は全てCCWを使って行われます。
チェーニング
IBMのCCWは、チェーニングによってチャネルプログラムを構成します。CCW内のビットで、次のデータが同じチャネルプログラムを構成するCCWであるかどうかを示します。チェーニングには、コマンドチェーニング(次のCCWが新たなコマンド)とデータチェーニング(次のCCWが現在のコマンドの追加データのアドレス)があります。
自己書き換え型のチャネルプログラム
チャネルプログラムは、実行中に読み取ったデータに基づいて、プログラム自身を書き換えることもできます。この技法は、例えばOS/360のISAMなどで使用されています。
具体例
以下は、ディスク上のレコードをキーで検索して読み取るチャネルプログラムの例です。
SEEK
SEARCH KEY EQUAL
TIC *-8
READ DATA
TIC (transfer in channel) は、一致するキーを持つレコードが見つかるまで(またはトラックの終端に到達するまで)、直前のSEARCHコマンドに分岐するCCWです。
仮想記憶とチャネルプログラム
チャネルコントローラは物理アドレスで処理を行いますが、チャネルプログラムは仮想アドレスを使用して書かれます。OSはチャネルプログラムを実行する前に、仮想アドレスから物理アドレスへの変換を行う必要があります。I/O処理で使用するデータを含むページは、物理メモリ内にロックされ、チャネルプログラムが物理アドレスに変換されコピーされた後、I/O操作が開始されます。
チャネルI/Oでのブート
チャネルI/O方式のシステムでは、ブートの最初の段階で、小さなチャネルプログラムをメモリにロードし、そのチャネルプログラムを実行することでブートプログラムを主記憶にロードします。
まとめ
チャネルコントローラは、コンピュータシステムの入出力処理を効率化するための重要な要素です。CPUの負荷を軽減し、システム全体のパフォーマンスを向上させるために、様々な形で利用されてきました。その基本的な概念は、現代のコンピュータシステムにも受け継がれています。