タスク情報取得

取得できる値

メールの解説にあったもの

TASK_GETPARAM_PRIORITY_INIT : 50
一般的意味でのpriority
TASK_GETPARAM_PRIORITY_OFFSET : 0
TASK_GETPARAM_PRIORITY_INITのうちのniceコマンドやproc_setpriority/self_setpriorityシステムコールによって変更された部分を示します。
TASK_GETPARAM_PRIORITY : 155766676
TASK_GETPARAM_PRIORITY_INITとactiveでなくなった時刻(tickベース)の和で、readyキューにタスクがつながれている場合にこの値が最も若いタスクがスケジューリングされます。
TASK_GETPARAM_TIMESLICE : 2
不明
TASK_GETPARAM_LIFE : 0
ユーザモードの実行時間(tick単位)
TASK_GETPARAM_SYS_LIFE : 0
カーネルモードの実行時間(tick単位)
TASK_GETPARAM_SUBLIFE : 318
tick(10msec)に満たないユーザモードの実行時間(usec単位)
TASK_GETPARAM_SS_WAIT_F : 1
不明

メールの解説にないもの

TASK_GETPARAM_SYS_TRACE_F
不明(返値も0)
TASK_GETPARAM_CREATOR
親タスク(ノードを移動すること変わることがある)
TASK_GETPARAM_PARENT
上と同じ
TASK_GETPARAM_SHELL_ID
タスクを起動したNikomonShell上で割り振られるID?5からスタートした。
TASK_GETPARAM_SHELL_NODE
タスクを起動したNikomonShellが存在する物理ノードID
TASK_GETPARAM_P_ORGNAME
不明(返値も0)
TASK_GETPARAM_PREV_NAME
前にいたノードにおけるタスク名(tid)。ノード移動しても変わらない。
TASK_GETPARAM_PREV_NODE
前にいたノードの物理ノードID。
TASK_GETPARAM_SHELL_PATH
不明。値は0x207。マイグレーション前後で変化無し。
TASK_GETPARAM_ORG_SHELL_PATH
不明。値は0x3106。マイグレーション前後で変化無し。
TASK_GETPARAM_RETQ : 0x415e6d1f (taskname : #15e6d1f)
不明。2重起動・ノード毎で変化あり。CREATERの値に+1してるだけかもしれない。
TASK_GETPARAM_DOCOM_ID : 0x75 (taskname : ____CU)
不明。ノード毎に変化。
TASK_GETPARAM_STDIN : 0x208 (taskname : ____PH)
不明。2重起動で変化するがノード毎の変化はなし。
TASK_GETPARAM_STDOUT : 0x208 (taskname : ____PH)
不明。2重起動で変化するがノード毎の変化はなし。
TASK_GETPARAM_STDERR : 0x208 (taskname : ____PH)
不明。2重起動で変化するがノード毎の変化はなし。
TASK_GETPARAM_RETQVAL : 0xffffffff (taskname : #3fffffff)
不明。まったく変化なし。
TASK_GETPARAM_STDTRACE : 0x105 (taskname : ____HE)
不明。ノード毎に変化。

新たに判明したシステムコール

sss_getparam(name,type)
タスク名nameのタスク情報を得る。タスク情報の種類はtypeで指定。
self_getparam(type)
自らのタスク情報を得る。タスク情報の種類はtypeで指定。
self_setpriority(int num)
numに設定した値だけpriorityが増加する。マイナスは無理っぽい。

メール全文

> SSS-PCのタスクについて質問があるのですが、ご教示頂けると幸いです。
> 
> 卒論において設計しているタスクスケジューラが、ノード上で実行している
> タスク(プロセス)のpriority/life等の情報を得る方法を検討しております。
> 
> 情報開示機構からこれらの情報を得られるかと考えていたのですが、
> タスク毎の情報を得る方法を見つけることができませんでした。
> 
> ・情報開示機構では各タスク毎の情報取得はできないのか
>
情報開示機構はノードレベルのメタな情報を得るための機構という
位置付けになっています。
個別タスクの情報はノードレベルの負荷分散にはいらないと思って
情報開示機構にはついていません。

SSS-PCでは自律的に負荷分散するのが基本ですので、
自分の情報(システムコールで取得可能)とノードレベルの情報
があれば、走行するノードを自分で決めることはできるという
わけです。

> ・(情報開示機構から取得できない場合)どのように取得したら良いのか
> 
タスク構造体の中のデータを読み出す
システムコールに以下の二つがあります。

unsigned
sss_getparam(name,type)
OBJECT_NAME	name;
int	type;
{
	 _trap_syscall_2( TASK_GETPARAM, name, type);
}

sss_getparam(name,type)は自分以外のタスクの情報を読み出します。
読み出すタスクは物理タスク名(name)で指定し、システムコール
実行タスクと同一ノードに存在しなくてはなりません。
また、同一のnikomon shellの子孫の関係にないタスクの情報は読めません。
# 一応、セキュリティと言うかプライバシを考慮してます。

同一shellの子孫であるという制約が足枷になるようならご相談下さい。
制約を緩めたカーネルを作成することを検討します。

unsigned
self_getparam(type)
int	type;
{
	 _trap_syscall_1( TASK_SELF_GETPARAM, type);
}

self_getparam(type)は自分に対するタスク構造体の情報を読み出します。

typeにはいろいろなものが指定できる(ssscore.h参照)のですが、
そのうちの以下のグループが御希望の物だと思います。

#define TASK_GETPARAM_PRIORITY_INIT	(0x80)
#define TASK_GETPARAM_PRIORITY_OFFSET	(0x81)
#define TASK_GETPARAM_PRIORITY		(0x82)
#define TASK_GETPARAM_TIMESLICE		(0x83)
#define TASK_GETPARAM_LIFE		(0x84)
#define TASK_GETPARAM_SYS_LIFE		(0x85)
#define TASK_GETPARAM_SUBLIFE		(0x86)
#define TASK_GETPARAM_SS_WAIT_F		(0x87)

一般の意味でのPRIORITYは
TASK_GETPARAM_PRIORITY_INIT
に基づいています。

TASK_GETPARAM_PRIORITYは
TASK_GETPARAM_PRIORITY_INITとactiveでなくなった
時刻(tickベース)の和で、
readyキューにタスクがつながれている場合に
この値が最も若いタスクがスケジューリングされます。

TASK_GETPARAM_PRIORITY_OFFSETは
TASK_GETPARAM_PRIORITY_INITのうちの
niceコマンドやproc_setpriority/self_setpriorityシステムコール
によって変更された部分を示します。

TASK_GETPARAM_LIFE
はユーザモードの実行時間(tick単位)

TASK_GETPARAM_SYS_LIFE
はカーネルモードの実行時間(tick単位)

SSS-PCはカーネル内でシステムコールをしたタスク自身が
処理を行うわけではないので(カーネルタスクに処理を依頼するのみなので)、
TASK_GETPARAM_SYS_LIFEの値は通常は極めて小さくなります。
# 意味のある処理をするタスクがいない場合はSYS_LIFEの値が高くなる
# 場合があります。

TASK_GETPARAM_SUBLIFE
はtick(10msec)に満たないユーザモードの実行時間(usec単位)

Lab/SSS-PC


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS