C リソースと制限
ナビゲーションに移動
検索に移動
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); }
この本からの覚書。
© 2006 矢木浩人