1 つのプロセスのコンテキストの内部で複数のタスクを実行するために,スタックを切り換える小さなプライベート・スレッド・パッケージが,多くのアプリケーションでサポートされています。これらのパッケージの多くは,アセンブリ言語 (VAX では Macro-32, Alpha では Macro-64) で作成された 1 つ以上の小さなルーチンを使用して,スタック・ポインタを操作することで,単一プロセスの内部でコンテキストの切り換えを行います。通常,タスクのストールと再起動を行う機能も必要です。置き換えられるスタックは,要求されたタスクにとって適切なモードであれば,どのモードでもかまいません。
表 C-1 モードおよびスコープ別割り当てガイドライン
カーネル---システム
EXE$KP_ALLOC_KPB
2
|
非ページング・プール
KW
EXE$ALONONPAGED
|
S0/S1
KW
EXE$KP_ALLOC_MEM_STACK
|
S2
KW
EXE$KP_ALLOC_RSE_STACK
3
|
カーネル---プロセス
|
非ページング・プールまたは P1
KW
EXE$ALONONPAGED または EXE$ALOP1PROC
|
P1---パーマネント
KW
$CREATE_REGION/$CRETVA
|
P2---パーマネント
KW
EXE$KP_ALLOC_RSE_STACK_P2
|
カーネル---イメージ
|
P1
KW
EXE$ALOP1IMAG
|
P1---非パーマネント
KW
$CREATE_REGION/$CRETVA
|
P2---非パーマネント
KW
$CREATE_REGION/$CRETVA
|
Exec---プロセス
|
P1
EW
EXE$ALOP1PROC
|
P1---パーマネント
EW
$CREATE_REGION/$CRETVA
|
P2---パーマネント
EW
EXE$KP_ALLOC_RSE_STACK_P2
|
Exec---イメージ
|
P1
EW
EXE$ALOP1IMAG
|
P1---非パーマネント
EW
$CREATE_REGION/$CRETVA
|
P2---非パーマネント
EW
$CREATE_REGION/$CRETVA
|
Super---プロセス
|
P1
SW
EXE$ALOP1PROC
|
P1---パーマネント
SW
$CREATE_REGION/$CRETVA
|
P2---パーマネント
SW
EXE$KP_ALLOC_RSE_STACK_P2
|
Super---イメージ
|
P1
SW
EXE$ALOP1IMAG
|
P1---非パーマネント
SW
$CREATE_REGION/$CRETVA
|
P2---非パーマネント
SW
$CREATE_REGION/$CRETVA
|
ユーザ---イメージ
|
P0
UW
Heap/Malloc/LIB$GET_VM
|
P0---非パーマネント
4
UW
EXE$KP_ALLOC_MEM_STACK_USER
|
P2---非パーマネント
UW
EXE$KP_ALLOC_RSE_STACK_P2
|
C.1.3 KPB |
|
KPB とは,KP ルーチンを起動するコード・ストリームと KP ルーチンの間で必要なコンテキストを保持するために使用されるデータ構造です。 KPB は半透過的です。一部のフィールドはアプリケーションで管理され,一部は KP ルーチンで管理され,一部は両方で共有されます。 KP ルーチンでは,KPB は割り当て時に 0 に初期化されるので,0 以外のフィールドには適切なデータが格納されていると解釈されます。
KPB の構造定義は,Macro-32 では $KPBDEF マクロで, C では KPBDEF.H で定義されます。 KPB 定義はシステムの内部的な定義であると考えられるため, LIB.MLB と SYS$LIB_C.TLB で提供されます。 BLISS の場合は,LIB.REQ または LIB.L32/LIB.L64 に KPB 定義が格納されています。
KPB は多くの領域またはサブ構造で構成される可変長構造です。すべての領域が必須なわけではありません。領域は以下のとおりです。
- ベース領域
- スケジューリング領域
- VEST 領域
- スピンロック領域
- デバッグ領域
- ユーザ・パラメータ領域
ベース領域は必須です。この領域には,標準構造ヘッダ,スタック・サイズとベース・アドレス,フラグ (他にどの領域が存在するかの情報を含む),非アクティブ・コード・ストリームのメモリ・スタック・ポインタ,他の領域を参照するポインタ,ベース KP ルーチンが必要とする追加フィールドが格納されます。
スケジューリング領域には,ストール,再起動,終了を取り扱うルーチンを参照するポインタ,フォーク・ブロック,追加フォーク・ブロックを参照するポインタが格納されます。終了ルーチンを除き,他のルーチンの大部分は,高い IPL で実行されるドライバ・レベルのコードでのみ必要とされます。 EXE$KP_USER_ALLOC_KPB を呼び出すルーチンは,割り当てられたメモリの必要なクリーンアップを実行する終了ルーチンを指定する必要があります。
VEST 領域とスピンロック領域は,主にドライバ・コードで使用されます。
デバッグ領域は,ドライバ・サポート・ルーチンでインプリメントされる,制限されたトレース機能を提供します。
ユーザ・パラメータ領域は,単に他の領域に連続的に割り当てられる未定義ストレージです。アプリケーションはそれぞれの要件に応じて,このメモリを自由に使用できます。
C.1.4 提供される KPB 割り当てルーチン |
|
OpenVMS オペレーティング・システムでは,KPB および関連スタックを割り当てるために, 2 つの標準的な割り当てルーチンを提供しています。 Alpha で提供されていたカーネル・モードのドライバ・レベル・インタフェースは,そのまま変更されずに提供されるため,KP インタフェースを使用するデバイス・ドライバは,この部分に関してソースを変更する必要がありません。さらに,モードに依存しないルーチンも提供されます。モードに依存しないルーチンは,アプリケーションで指定されたルーチンを呼び出して,KPB と各スタックを割り当てます。大部分の新規アプリケーションや,KP API にポーティングされるアプリケーションは,モードに依存しないルーチンを使用します。
カーネル・モード・ルーチンも,モードに依存しないルーチンも, KPB を初期化します。提供されるすべてのルーチンの C プロトタイプは,ヘッダ・ファイル EXE_ROUTINES.H に格納されています。
C.1.5 カーネル・モードの割り当て |
|
カーネル・モードの割り当ての形式は次のとおりです。