トップ 差分 一覧 ping ソース 検索 ヘルプ PDF 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);
}

この本からの覚書。



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.