[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[plamo:30003] Re: CONFIG_HZ とjiffie
-
From:KATOH Yasufumi
-
Date:Wed, 29 Jul 2009 20:11:54 +0900 (JST)
- Subject: [plamo:30003] Re: CONFIG_HZ とjiffie
- From: KATOH Yasufumi <karma@xxxxxxxxxxxxxxxx>
- Date: Wed, 29 Jul 2009 20:11:47 +0900
- User-agent: Wanderlust/2.15.7 (Almost Unreal) SEMI/1.14.6 (Maruoka)FLIM/1.14.9 (=?iso-2022-jp-2?b?R29qGyQoRCtXGyhC?=) APEL/10.7 Emacs/23.0.92(i686-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)
加藤泰文です.
[plamo 29982] は全くはずしてたのでムシしてください.(^_^;)
>>> On Sat, 25 Jul 2009 23:41:36 +0900 (JST)
in message "[plamo:29972] CONFIG_HZ と jiffie"
早間義博-san wrote:
> (1) コマンド ps でコマンド実行開始時刻を得ます。
> $ ps u -C snmpd
> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
> root 26395 0.5 1.6 7780 4172 ? S 17:57 1:31 /usr/sbin/snmpd
> 17:57 が開始時刻です。
ここの "START" 欄の計算は
> (2)このコマンドの実行開始 jiffie を取得すると
> $ cat /proc/26395/stat| cut -f 22 -d" "
> 7653258
> です。
ここを元に計算していますね.procps-3.2.8 の ps/output.c 内で pr_start
or pr_bsdstart という関数が START を出力していて,
start = time_of_boot + pp->start_time / Hertz;
こんな式があります.早間さんの (4), (5) の計算と同じ式ですね.問題はこ
この "Hertz" ですよね.
さて,この "Hertz" ですが,proc/sysinfo.c で取得されていま
す.init_libproc という関数内で
if(linux_version_code > LINUX_VERSION(2, 4, 0)){
Hertz = find_elf_note(AT_CLKTCK);
if(Hertz!=NOTE_NOT_FOUND) return;
fputs("2.4+ kernel w/o ELF notes? -- report this\n", stderr);
}
というのがあって,
static unsigned long find_elf_note(unsigned long findme){
unsigned long *ep = (unsigned long *)environ;
while(*ep++);
while(*ep){
if(ep[0]==findme) return ep[1];
ep+=2;
}
return NOTE_NOT_FOUND;
}
という関数があります.これに AT_CLKTCK を入れているわけですが,これは
find_elf_note を見ると分かるように,環境変数 (environ) から AT_CLKTCK
を取得してるわけですね.
# 外部変数 environ は man 7 environ 参照かな?
AT_CLKTCK はカーネルから ELF の情報として渡されるみたいですね.で,こ
んな感じで見ることが出来ますね.手元では
% $ LD_SHOW_AUXV=1 ps | grep AT_CLKTCK
AT_CLKTCK: 100
となっていて 100 が正解です (ps の START の時間を得るという目的では).
----
ここからは本多さんに教えていただいたのですが,kernel ソースの
arch/x86/include/asm/param.h に
#ifdef __KERNEL__
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
# define USER_HZ 100 /* some user interfaces are */
# define CLOCKS_PER_SEC (USER_HZ) /* in "ticks" like times() */
#endif
という所があって,USER_HZ が 100 になってるから,ですかね? カーネルの
内部的なタイマー間隔と,ユーザ空間から見える値はまた別ということですか
ね?
あと,/usr/include/asm/param.h には
#ifndef HZ
#define HZ 100
#endif
というのがありますが,これは使わない方がいいってことかなー.
あとは詳しい人にまかせまーす.(^_^;)
--
==============================================
(((( 加藤泰文
○-○ karma @ jazz.email.ne.jp
==============================================
(Web Page) http://www.ne.jp/asahi/ka/to/
==============================================
- Follow-Ups
-
- [plamo:30008] Re: CONFIG_HZ とjiffie, 早間義博
- References
-
- [plamo:29972] CONFIG_HZ とjiffie, 早間義博
[検索ページ]
[メール一覧]
Plamo ML 公開システム