前へ | 次へ | 目次 | 索引 |
タスクID とは,タスクがタスキング・システムによって作成されるときタスクに付けられる番号です。タスク ID により,タスクはプログラムの実行中は常に一意的に識別されます。
タスク ID の構文は次のとおりです。ただし,n は正の 10 進整数です。
%TASK n |
あるタスク・オブジェクトのタスク ID を知るためには,そのタスク・オブジェクトを評価または検査します。次はその一例です。パス名は Ada の構文に従っています。
DBG> EVALUATE FATHER %TASK 2 DBG> EXAMINE FATHER TASK_EXAMPLE.FATHER: %TASK 2 |
プログラミング言語に組み込みタスキング・サービスが用意されていない場合,タスクのタスク ID を得るためには EXAMINE/TASK コマンドを使用しなければなりません。
EXAMINE/TASK/HEXADECIMAL コマンドにタスク・オブジェクトを指定すると 16 進のタスク値が表示されるので注意してください。タスク値とはそのタスクのタスク(すなわちスレッド)制御ブロックのアドレスです。次はその一例です(Ada の例)。
DBG> EXAMINE/HEXADECIMAL FATHER TASK_EXAMPLE.FATHER: 0015AD00 DBG> |
SHOW TASK/ALL コマンドでは,現存するすべてのタスクに割り当てられているタスク ID を表示することができます。これらのタスクの中には,次のような理由からユーザにとってはなじみのないものもあります。
次の各例は,それぞれ 例 17-1 と 例 17-2 で実行したときのものです。
DBG> SHOW TASK/ALL task id state hold pri substate thread_object %TASK 1 READY HOLD 12 Initial thread %TASK 2 SUSP 12 Condition Wait THREAD_EX1\main\threads[0].field1 %TASK 3 SUSP 12 Condition Wait THREAD_EX1\main\threads[1].field1 DBG> |
DBG> SHOW TASK/ALL task id pri hold state substate task object * %TASK 1 7 RUN SHARE$ADARTL+130428 %TASK 2 7 SUSP Accept TASK_EXAMPLE.MOTHER+4 %TASK 4 7 SUSP Entry call TASK_EXAMPLE.FATHER_TYPE$TASK_BODY.CHILD+4 %TASK 3 6 READY TASK_EXAMPLE.MOTHER+4 DBG> |
タスク ID を使用すれば,デバッガの条件文に非存在タスクを指定できます。たとえば,自分のプログラムを一度実行して,%TASK 2 と %TASK 3 を調べたい場合は,その次のデバッグ・セッションを開始して,まだ %TASK 2 も %TASK 3 も作成されていないときに次のコマンドを入力します。
DBG> SET BREAK %LINE 60 WHEN(%ACTIVE_TASK=%TASK 2) DBG> IF(%CALLER=%TASK 3)THEN(SHOW TASK/FULL) |
タスクが作成される前にそのタスク ID を特定のデバッガ・コマンドに指定しても,デバッガがエラーを報告することはありません。しかし,タスク・オブジェクトが存在する前にそのタスク・オブジェクト名を使用すると,デバッガによりエラーが報告されます。タスクは作成されて初めて存在することになります。タスクは終了後しばらくして非存在になります。非存在タスクがデバッガの SHOW TASK コマンドによって表示されることはありません。
プログラムの文が同じ順序で実行されるかぎり,そのプログラムを実行するつど同じタスクには同じタスク ID が割り当てられます。しかし,AST(delay 文の満了や入出力(I/O)の完了で起こる)が異なる順序で発生するために実行順序が変わることがあります。タイム・スライス機能を許可しても実行順序が変わることがあります。同じプログラムの実行中に同じタスク ID が 2 回以上割り当てられることはありません。
17.3.4 タスク組み込みシンボル
表 17-2 に定義されているデバッガの組み込みシンボルを使用すれば,コマンド・プロシージャやコマンド構造にタスクを指定できます。
組み込みシンボル | 機能 |
---|---|
%ACTIVE_TASK | GO, STEP, CALL,または EXIT コマンドの実行によって 起動されるタスク。 |
%CALLER_TASK | (Adaプログラムだけの機能。)実行される accept 文のエントリを呼び出したタスク。 |
%NEXT_TASK | デバッガのタスク・リスト内の,可視タスクの後のタスク。 各タスクの順序はランダムだが,同じプログラムを 1 回実行している間は首尾一貫している。 |
%PREVIOUS_TASK | デバッガのタスク・リスト内の,可視タスクの前の タスク。 |
%VISIBLE_TASK | シンボル,レジスタ値,ルーチン呼び出し,ブレーク ポイントなどの参照に現在のコンテキストとして使用される呼び出しスタックとレジスタ・セットを持っているタスク。 |
これらのタスク組み込みシンボルの使用例は次のとおりです。
次のコマンドでは,可視タスクのタスク ID が表示されます。
DBG> EVALUATE %VISIBLE_TASK |
次のコマンドではアクティブ・タスクが保留されます。
DBG> SET TASK/HOLD %ACTIVE_TASK |
次のコマンドでは行 38 にブレークポイントが設定されます。このブレークポイントはタスク CHILD が行 38 を実行するときにだけ検出されます。
DBG> SET BREAK %LINE 38 WHEN(%ACTIVE_TASK=CHILD) |
シンボル %NEXT_TASK と %PREVIOUS_TASK を使用すれば,現存しているすべてのタスクを順次表示できます。たとえば,次のように使用します。
DBG> SHOW TASK %VISIBLE_TASK; SET TASK/VISIBLE %NEXT_TASK DBG> SHOW TASK %VISIBLE_TASK; SET TASK/VISIBLE %NEXT_TASK . . . DBG> EXAMINE MONITOR_TASK MOD\MONITOR_TASK: %TASK 2 DBG> WHILE %NEXT_TASK NEQ %ACTIVE DO(SET TASK %NEXT_TASK; SHOW CALLS) |
17.3.4.1 呼び出す側のタスクのシンボル(Ada 専用)
シンボル %CALLER_TASK は Ada のタスクだけに使用します。これが評価されると,accept 文のエントリを呼び出したタスクのタスク ID か,%TASK 0 になります。たとえば,アクティブ・タスクが accept 文に対応する一連の文を実行していないときに %CALLER_TASK が評価されると,%TASK 0 になります。
たとえば,例 17-2 の行 61(accept 文の中)にブレークポイントが設定されているものとします。この例では,メイン・プログラム(%TASK 1)がエントリ RENDEZVOUS を呼び出すのに応じて,タスク FATHER(%TASK 2)が accept 文を実行します。したがって,そのときに EVALUATE %CALLER_TASK コマンドを入力すれば,呼び出しタスク,つまりメイン・プログラムのタスク ID と評価されます。
DBG> EVALUATE %CALLER_TASK %TASK 1 DBG> |
AST によるエントリ呼び出しの結果がランデブのときに %CALLER_TASK を評価すると,%TASK 0 になります。呼び出す側がタスクでないからです。
17.4 タスク情報の表示
プログラム内のタスクの情報を表示するには,SHOW TASK コマンドを使用します。
SHOW TASK コマンドでは,存在している(終了していない)タスクの情報が表示されます。省略時の設定では,可視タスクの情報が1行だけ表示されます。
第 17.4.1 項 と 第 17.4.2 項 には,それぞれ,SHOW TASK コマンドによって表示される POSIX Threads タスクと Ada タスクの情報が説明されています。
17.4.1 POSIX Threads タスクのタスク情報の表示
SHOW TASK コマンドでは,プログラム内に現存しているすべてのタスクの情報が表示されます(例 17-3 を参照)。
例 17-3 POSIX Threadsタスクに対してSHOW TASK/ALLを実行したときの表示例 |
---|
(1) (2) (3) (4) (5) (6) task id state hold pri substate thread_object %TASK 1 SUSP 12 Condition Wait Initial thread %TASK 2 SUSP 12 Mutex Wait T_EXAMP\main\threads[0].field1 %TASK 3 SUSP 12 Delay T_EXAMP\main\threads[1].field1 %TASK 4 SUSP 12 Mutex Wait T_EXAMP\main\threads[2].field1 * %TASK 5 RUN 12 T_EXAMP\main\threads[3].field1 %TASK 6 READY 12 T_EXAMP\main\threads[4].field1 %TASK 7 SUSP 12 Mutex Wait T_EXAMP\main\threads[5].field1 %TASK 8 READY 12 T_EXAMP\main\threads[6].field1 %TASK 9 TERM 12 Term. by alert T_EXAMP\main\threads[7].field1 DBG> |
次の番号は,例 17-3 の番号に対応しています。
タスクの状態 | 説明 |
---|---|
RUNNING | タスクは現在プロセッサで実行中である。これがアクティブ・タスクである。この状態のタスクが移ることができるのは,READY,SUSPENDED,TERMINATED のいずれかの状態である。 |
READY | タスクは実行適格であり,プロセッサが使用可能になるのを待っている。この状態のタスクが移ることができるのは RUNNING 状態だけである。 |
SUSPENDED | タスクは中断している。つまり,プロセッサが使用できるのを待っているのではなく,あるイベントを待っている。たとえば,タスクは作成されてから起動されるまで中断状態に留まる。この状態のタスクが移ることができるのは,READY 状態または TERMINATED 状態だけである。 |
TERMINATED | タスクは終了している。この状態のタスクは,ほかの状態に移ることはできない。 |
タスクの副次状態 | 説明 |
---|---|
Condition Wait | タスクは POSIX Threads の条件変数を待っている。 |
Delay | タスクは POSIX Threads 遅延への呼び出しで待っている。 |
Mutex Wait | タスクは POSIX Threads ミューテクスを待っている。 |
Not yet started | タスクはまだその起動ルーチンを実行していない。 |
Term. by alert | タスクは警告処理により打ち切られた。 |
Term. by exc | タスクは例外により打ち切られた。 |
Timed Cond Wait | タスクは時限 POSIX Threads 条件変数を待っている。 |
SHOW TASK/FULL コマンドでは,選択した各タスクについての詳細情報が表示されます。例 17-4 に,POSIX Threads タスクの例でこのコマンドを実行した場合の出力を示します。
例 17-4 POSIX Threadsタスクに対してSHOW TASK/FULLを実行したときの表示例 |
---|
(1) task id state hold pri substate thread_object %TASK 4 SUSP 12 Delay T_EXAMP\main\threads[1].field1 (2) Alert is pending Alerts are deferred (3) Next pc: SHARE$CMA$RTL+46136 Start routine: T_EXAMP\thread_action (4) Scheduling policy: throughput (5) Stack storage: Bytes in use: 1288 (6) Base: 00334C00 Bytes available: 40185 SP: 003346F8 Reserved Bytes: 10752 Top: 00329A00 Guard Bytes: 4095 (7) Thread control block: Size: 293 Address: 00311B78 (8) Total storage: 56613 DBG> |
次の番号は,例 17-4 の番号に対応しています。
図 17-1 にタスク・スタックを示します。
図 17-1 タスク・スタック図
SHOW TASK/STATISTICS コマンドでは,プログラム内のすべてのタスクについての統計情報が報告されます。例 17-5 には,POSIX Threads タスクのプログラム例に対して SHOW TASK/STATISTICS/FULL コマンドを実行したときの出力が示されています。この情報により,プログラムの性能を測定できます。スケジューリング(コンテキスト・スイッチとも呼ぶ)の合計回数が多いほど,タスキング・オーバヘッドは大きくなります。
例 17-5 POSIX Threadsタスクに対してSHOW TASK/STAT/FULLを実行したときの表示例(VAX システムの例) |
---|
task statistics Total context switches: 0 Number of existing threads: 0 Total threads created: 0 DBG> |
SHOW TASK/ALLコマンドでは,プログラム内に現存しているすべてのタスクの情報,つまりタスク自体が作成されてからその親がまだ終了していないすべてのタスクの情報が表示されます(例 17-6 を参照)。
例 17-6 Adaタスクに対してSHOW TASK/ALLを実行したときの表示例 |
---|
(1) (2) (3) (4) (5) (6) task id pri hold state substate task object * %TASK 1 7 RUN SHARE$ADARTL+130428 %TASK 2 7 HOLD SUSP Accept TASK_EXAMPLE.MOTHER+4 %TASK 4 7 SUSP Entry call TASK_EXAMPLE.FATHER_TYPE$TASK_BODY.CHILD+4 %TASK 3 6 READY TASK_EXAMPLE.MOTHER) DBG> |
次の番号は,例 17-6 の番号に対応しています。
VAX プロセッサで作成されるタスクは省略時の設定である優先順位 7 が割り当てられる。ただし,それ以外の優先順位がプラグマ PRIORITY で指定されている場合は,その優先順位が割り当てられる。
Alpha プロセッサで作成されるタスクは,タイム・スライス機能が使用不能ならば,省略時の設定である優先順位 7 が割り当てられる。タイム・スライス機能が使用可能ならば,プラグマ PRIORITY が指定されていないかぎり,適当な中間の値が優先順位として割り当てられる。
タスクの副次状態 | 説明 |
---|---|
Abnormal | タスクは強制終了された。 |
Accept | タスクはselect文の外のaccept文で待っている。 |
Activating | タスクはその宣言部分を作成中である。 |
Activating tasks | タスクは自分が作成した各タスクが活動を終了するのを待っている。 |
Completed [abn] | タスクは abort 文のために打ち切られたが,まだ終了していない。Ada でいう打ち切られたタスクとは,その end 文で各依存タスクを待っているタスクである。それらの依存タスクが終了すると,タスクの状態は Terminated に変わる。 |
Completed [exc] | タスクは処理されない例外1 のために打ち切られたが,まだ終了していない。Ada でいう打ち切られたタスクとは,その end 文で各依存タスクを待っているタスクである。それらの依存タスクが終了すると,タスクの状態は Terminated に変わる。 |
Completed | タスクは打ち切られている。abort 文は実行されず,処理されない例外1 は起こっていない。 |
Delay | タスクは delay 文で待っている。 |
Dependents | タスクは各依存タスクの終了を待っている。 |
Dependents [exc] | タスクは処理されない例外1 の通知を依存タスクが許すのを待っている。 |
Entry call | タスクはそのエントリ呼び出しが受け付けられるのを待っている。 |
Invalid state | Compaq Adaの実行時ライブラリにエラーがある。 |
I/OまたはAST | タスクは入出力(I/O)の終了かなんらかの AST を待っている。 |
Not yet activated | タスクは,自分を作成したタスクによって起動されるのを待っている。 |
Select or delay | タスクは遅延という代替方法が可能な select 文で待っている。 |
Select or terminate | タスクは終了という代替方法が可能な select 文で待っている。 |
Select | タスクはno else,遅延,終了のいずれも不可能な select 文で待っている。 |
Shared resource | タスクは内部共用リソースを待っている。 |
Terminated [abn] | タスクは abort 文により終了した。 |
Terminated [exc] | タスクは処理されない例外1 により終了した。 |
Terminated | タスクは正常終了した。 |
Timed entry call | タスクは時限エントリ呼び出しをして待っている。 |
前へ | 次へ | 目次 | 索引 |