2009年7月30日

[plamo:30008] Re: CONFIG_HZ と jiffie

早間です。

加藤さんありがとうございます。
>
> さて,この "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
>

結論としては、私の勘違いで Kernel Config の herz は jiffie とは
無関係だったのですね。
また、今時の Linux kernel は jiffie の単位は 1/100 秒で通常は変わ
らないと言うことですね。
# 無駄な事だったのですが kernel の設定を変えてコンパイルして見ました。
# いずれも HZ が 100 でわざわざkernel の設定や関数を使用して取得す
# る必要はありませんでした。

sysconf(_SC_CLK_TCK);

The corresponding variable is obsolete.
と言うのはどういう事になるのでしょう。

-- 早間

投稿者 xml-rpc : 2009年7月30日 16:40
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/87108
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。