- 履歴一覧
- ソース を表示
- Lab/SSS-PC/タスク情報取得 は削除されています。
タスク情報取得
メール全文
> 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