コンピューティングにおいて、入出力(I/O、i/o、または非公式にはioまたはIO )とは、コンピュータなどの情報処理システムと、別のコンピュータシステム、周辺機器、または人間のオペレーターなどの外部世界との間の通信のことです。入力はシステムが受信する信号またはデータであり、出力はシステムから送信される信号またはデータです。この用語は動作の一部としても使用できます。「I/Oを実行する」とは、入力または出力操作を実行することを意味します。
入出力デバイスとは、人間(または他のシステム)がコンピュータと通信するために使用するハードウェアのことですキーボードやマウスはコンピュータの入力デバイスでモニターやプリンターは出力デバイスですモデムやネットワークカードなど、コンピュータ間の通信を行うデバイスは、通常、入力と出力の両方の操作を行います。システムと対話する主体によるあらゆるやり取りは入力、システムが応答する反応は出力と呼ばれます。
デバイスを入力デバイスとするか出力デバイスとするかは、視点によって異なります。マウスやキーボードは、人間のユーザーが出力する物理的な動きを受け取り、それをコンピュータが理解できる入力信号に変換します。これらのデバイスからの出力は、コンピュータへの入力です。同様に、プリンタやモニターは、コンピュータが出力する信号を入力として受け取り、これらの信号を人間のユーザーが理解できる表現に変換します。人間のユーザーの視点から見ると、これらの表現を読んだり見たりするプロセスは、出力を受け取ることになります。コンピュータと人間の間のこの種の相互作用は、ヒューマンコンピュータインタラクションの分野で研究されています。さらに複雑なことに、従来入力デバイスと考えられていたデバイス(カードリーダー、キーボードなど)は、スタッカーの選択やキーボードのライトの表示などの制御コマンドを受け入れる場合があり、従来出力デバイスと考えられていたデバイスは、ステータスデータ(トナー残量低下、用紙切れ、紙詰まりなど)を提供する場合があります。
コンピュータアーキテクチャでは、 CPUとメインメモリの組み合わせ(CPU は個々の命令を使用して直接読み書きできる)がコンピュータの頭脳とみなされます。たとえば、ディスクドライブからデータを読み取るなど、CPU/メモリの組み合わせとの間で行われる情報の転送はすべてI /O とみなされます。[ 1 ] CPU とそのサポート回路は、デバイスドライバの実装など、低レベルのコンピュータプログラミングで使用されるメモリマップド I/Oを提供したり、 I/O チャネルへのアクセスを提供したりする場合があります。I /O アルゴリズムは、ディスクドライブなどの二次記憶装置とデータを交換する際に、局所性を利用して効率的に動作するように設計されたものです。
入出力デバイスがプロセッサによって駆動される場合、入出力インターフェースが必要です。通常、CPU はバスを介してデバイスと通信します。インターフェースには、プロセッサによって生成されたデバイス アドレスを解釈するために必要なロジックが必要です。ハンドシェイクは、適切なコマンド (BUSY、READY、WAIT など) を使用してインターフェースによって実装され、プロセッサはインターフェースを介して入出力デバイスと通信できます。異なるデータ形式が交換される場合、インターフェースはシリアルデータをパラレル形式に変換でき、またその逆も可能でなければなりません。プロセッサが入力デバイスからのデータを待っている間アイドル状態になるのは無駄なので、必要に応じて割り込み[ 2 ]と対応するタイプ番号を生成し、プロセッサがさらに処理できるようにする必要があります。
メモリマップドI/Oを使用するコンピュータは、通常メモリにアクセスするために使用するアセンブリ言語命令と同じものを使用して、特定のメモリ位置を読み書きすることでハードウェアにアクセスします。別の方法として、命令ベースI/Oがあり、CPUにI/O専用の命令が必要です。[ 1 ]入力デバイスと出力デバイスの両方で、データ処理速度は大きく異なる場合があります。[ 2 ]一部のデバイスは非常に高速でデータを交換できるため、 CPUの継続的な支援なしにメモリに直接アクセス(DMA)する必要があります。[ 2 ]
上位レベルのオペレーティングシステムやプログラミング機能は、より抽象的な入出力の概念やプリミティブを別々に採用しています。例えば、ほとんどのオペレーティングシステムは、アプリケーションプログラムにファイルという概念を提供しています。ほとんどのプログラミング言語は、言語内のステートメントとして、あるいは標準ライブラリの関数として入出力機能を提供しています。
特殊なプリミティブ関数に代わるものとして、 I/Oモナドがあります。これは、プログラムがI/Oを記述するだけで、実際の処理はプログラムの外部で実行されることを可能にします。I/O関数はどのプログラミング言語でも副作用を引き起こすため、これは注目すべき点ですが、純粋関数型プログラミングを実用的にすることを可能にします。
オペレーティングシステムが提供する入出力機能は、レコード指向型(ファイルにレコードが含まれる)とストリーム指向型(ファイルにバイト列が含まれる)の2種類がある。
チャネルI/Oでは、 I/O操作を実行するために特別に設計された命令を使用する必要があります。I/O命令はチャネル、またはチャネルとデバイスのアドレスを指定します。チャネルは、その他の必要なアドレス情報と制御情報に非同期的にアクセスします。これはDMAに似ていますが、より柔軟性があります。
ポートマッピングI/Oでは、専用のI/O命令を使用する必要があります。通常、デバイスには1つ以上のポートが割り当てられ、それぞれに特別な用途があります。ポート番号は、通常の命令で使用されるアドレス空間とは別のアドレス空間にあります。
ダイレクトメモリアクセス(DMA)は、デバイスがCPUとは独立して、メモリとの間で大量のデータを転送するための手段である。