*タスク情報取得 [#u97c3e84] #contents -[[研究関係Wiki・SSS-PCへ戻る>Lab/SSS-PC]] **取得できる値 [#jb77bf03] ***メールの解説にあったもの [#m9a71d53] :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| 不明 ***メールの解説にないもの [#l2acc66f] :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)| 不明。ノード毎に変化。 :TASK_GETPARAM_WAKEUP_COND : 0x0 (taskname : ______)| 不明 :TASK_GETPARAM_WAKEUP_VALUE : 0x80 (taskname : ____D_)| 不明 :TASK_GETPARAM_NIKO_TASKP : 0xc0250500 (taskname : #250500)| 不明 :TASK_GETPARAM_NIKO_NAME : 0x41609704 (taskname : #1609704)|| CREATERとおなじ :TASK_GETPARAM_NIKO_ENVBUF : 0x5fffd71c (taskname : #1fffd71c)| 不明 :TASK_GETPARAM_NIKO_ENVBUF_SIZE : 0x2000 (taskname : ___H__)| 不明 :TASK_GETPARAM_NIKO_CAREA : 0x60000000 (taskname : #20000000)| 不明 :TASK_GETPARAM_NIKO_LOCK : 0x0 (taskname : ______)| 不明 :TASK_GETPARAM_CREATE_METHOD : 0x1 (taskname : _____A)| 不明 **新たに判明したシステムコール [#q4556d8e] :sss_getparam(name,type)| タスク名nameのタスク情報を得る。タスク情報の種類はtypeで指定。 :self_getparam(type)| 自らのタスク情報を得る。タスク情報の種類はtypeで指定。 :self_setpriority(int num)| numに設定した値だけpriorityが増加する。マイナスは無理っぽい。 **メール全文 [#w92496b4] > 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]]