- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!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 <sys/resource.h>
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 <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
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}}