トップ 一覧 ping 検索 ヘルプ RSS ログイン

C リソースと制限の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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}}