コンテキスト (計算機科学)

コンピュータおよび計算機科学におけるコンテキスト: context)とは、何らかのタスクプロセススレッド、またはファイバー)によって使用されるデータの最小セットである。英語のcontextは文脈や状況といった意味を持ち[1]、タスクの状態(ステート)の集合を表すためにコンテキストという概念が用いられる。

概要

編集

複数のタスクが同時並行的に動作するマルチタスク環境では、1つのタスクのみに計算資源CPU)を占有させることはできず、短時間でタスクを切り替えながら(プロセッサ時間を割り当てながら)少しずつ実行する必要がある。オペレーティングシステム (OS) がタスクを中断する場合、タスクが再開された際に中断箇所からタスクを継続するため、プロセッサが実行中のタスクの内容(プログラムの実行状態)を保存しておく必要がある。この保存される一連の情報がコンテキストである[2]。タスクの割り込みが発生すると、OSはタスクを中断してプロセッサのコンテキストを保存し、割り込みハンドラ(interrupt service routine: ISR)が動作する。したがって、コンテキストが小さいほど、タスク切り替え(コンテキストスイッチ)のレイテンシ(遅延)はより小さくなる。

コンテキストのデータは、プロセッサレジスタ、タスクによって使用されるメモリ、またはタスクを管理するためにOSが使用する制御レジスタ内に配置されることがある。

ストレージメモリ(タスクで使用されるファイル)は、コンテキストスイッチの場合は「タスクコンテキスト」にとって重要ではない。

プロセッサ自身がコンテキストスイッチの仕組みをハードウェアによって実装していることもあるが、大規模な汎用OSの場合、一般的にはこの仕組みを使わず、OS側が制御する[3]

ソフトウェアレベル

編集

OSやデバイスドライバーが管理するプロセッサ状態のようなハードウェアレベルの情報に限らず、各種APIなど、アプリケーションソフトウェアレベルの抽象化された状態情報に関しても、コンテキストという概念が使われることがある。以下はその例である。

  • Microsoft WindowsGDIおよびDirect3D/Direct2Dには「デバイスコンテキスト」の概念があり、グラフィックスオブジェクト集合の保持、グラフィックスパイプラインステートの設定、描画命令の発行などを担当する[4][5][6]
  • OpenGLには「OpenGLコンテキスト」の概念があり、OpenGLインスタンスに関連付けられたステートを保持する[7]。WindowsのWGLでは「レンダリングコンテキスト」とも呼ばれ、すべてのOpenGL命令を通過させるポートの役割を果たす[8]。OpenGL呼び出しを実行するスレッドはカレントコンテキストを持つ必要があり、スレッドローカルストレージの変数により保持される。
  • macOS/iOSQuartz 2D(Core Graphics)には、描画パラメータや描画に必要なデバイス固有の情報を保持・管理する「グラフィックスコンテキスト」を表現するクラスとしてCGContextがある[9]
  • Androidには、アプリケーション環境に関する情報にアクセスするための抽象クラスとしてandroid.content.Contextがある[10]
  • .NETには、論理的な実行スレッドに関する情報を格納するコンテナとして「実行コンテキスト」ExecutionContextがある[11].NET Frameworkでは、実行コンテキストはセキュリティコンテキスト、呼び出しコンテキスト、同期コンテキストを含んでいる。

脚注

編集

関連項目

編集

外部リンク

編集