!!!C リソースと制限 [Programming C] Linux systemで実行されるprogramには、resourceに関する種々の制限が課せられている。 *Hardware による物理的な制限(memoryなど) *System policy による制限(CPU時間の上限など) *実装上の制限(intのsize、file名に使用できる文字数など) このうちいくつかはUNIXの仕様で定義されており、applicationから取得することができる。 header file limits.h では operating systemによって課せられた制約を表すための定数が定義されている。 ,定数,説明 ,NAME_MAX,file名に使用できる最大文字数 ,CHAR_BIT,charのbit数 ,CHAR_MAX,charの最大値 ,INT_MAX,intの最大値 header file sys/resource.h には、resource の操作に関する様々な定義が記述されている。 #include int getpriority(int which, id_t who); int setpriority(int which, id_t who, int priority); int getrlimit(int resource, struct rlimit *r_limit); int setrlimit(int resource, const struct rlimit *r_limit); int getrusage(int who, struct rsusage *r_usage); *id_tは、user id と group id に使われる整数型 *構造体 rusage は現在のprogramがどれだけのCPU時間を使用しているかを取得 rusage構造体のmember ,member,説明 ,struct timeval ru_utime,使用したuser時間 ,struct timeval ru_stime,使用したsystem時間 parameter whoには、次の何れかの定数 ,定数,説明 ,RUSAGE_SELF,現在のprogramに関する使用情報のみを返す ,RUSAGE_CHILDREN,子processに関する使用情報も含める *application ではgetpriority、setpriority関数を使用して、programの優先度を調べたり、設定したりできる。 *これらの関数を使って優先度を取得、変更するprocessは、process id、group id、userの何れかで指定。 *parameter whoをどのように扱うのか指定するのが、parameter which parameter whichには次の何れかの定数 ,定数,説明 ,PRIO_PROCESS,whoはprocess id ,PRIO_PGRP,whoはprocess group ,PRIO_PUSER,whoはuser *setpriority関数は、可能であれば、新しい優先度を設定 *defaultの優先度は 0 *正の優先度は、backgroupnd task *負の優先度は、より頻繁に実行され、CPU時間も多く使用 *有効な範囲は -20〜+20 数値が大きいほど優先度は低い *system resourceに関する制限を取得、設定するには、getrlimit、setrlimitを使う *resourceの制限を表すために、構造体rlimitを使用する。 rlimit構造体(sys/resource.hで定義) ,member,説明 ,rlim_t rlim_cur,現在のsoft制限 ,rlim_t rlim_max,hard 制限 通常soft制限は、超えるべきではない制限を意味する。 hard制限を越えた場合は、systemがprogramにsignalを送りprogramを終了させようとする rlimit関数群のparameter resourceで指定する parameter resource ,parameter,説明 ,RLIMIT_CORE,core dump file sizeの制限(bite単位) ,RLIMIT_CPU,CPU時間の制限(秒単位) ,RLIMIT_DATA,data(malloc/sbrk)segmentの制限(bite単位) ,RLIMIT_FSIZE,file sizeの制限(bite単位) ,RLIMIT_NOFILE,openするfile数の制限 ,RLIMIT_STACK,stack sizeの制限(bite単位) ,RLIMIT_AS,address空間(stackおよびdata)の制限(bite単位) #include #include #include int main() { struct rusage r_usage; int priority = getpriority(PRIO_PROCESS, getpid()); printf("Priority : %d\n", priority); /* dummy work */ int i; for(i=0; i<30000; i++) { getpriority(PRIO_PROCESS, getpid()); } getrusage(RUSAGE_SELF, &r_usage); printf("CPU usage: User=%ld.%06ld, System=%ld.%06ld\n" ,r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec ,r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec); exit(0); } ---- この本からの覚書。 {{amazon 4797327014}}