[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:21520] Re: Linuxの割り込みについて



汐崎です。
松本さん,反応ありがとうございます。
----- Original Message -----
From: "Norimasa Matsumoto" <matsu@bi.wakwak.com>
To: <plamo@linet.gr.jp>
Sent: Wednesday, December 03, 2003 6:20 PM
Subject: [plamo:21451] Re: Linuxの割り込みについて
> 松本@兵庫県です。
>
> _Message-Id: <43C3B69BDD1913sios_hs@yahoo.co.jp>
> _From: "H.Shiozaki" <sios_hs@yahoo.co.jp>
> _Date: Sun, 30 Nov 2003 02:11:44 +0900

> さて本題です
> テストコードも示さずに何が分かるのかという気もしますが……
この点は,ご容赦下さい。
下記の変更ソフトに,ほぼ反映していますので。

> > ところが,Linuxでは,ほぼ,512msec毎に約52usecの誤差
> > (遅れ方向)が発生します。(CPUは233MHzのPentium)
>   これ、自信ありますか? 周期を 0.1msec にすると 51.2msec
> 毎に変わりませんか?
その通りです。
原因が分からず,表現方法には問題があるとは思っていました。

>ループ一回、回す毎に 8 Bytes メモリ を消費していませんか?
そのほうの問題とは気がつきませんでした。
>
>   興味の無い人にはただのゴミですが、
> http://www.netfort.gr.jp/~matsu/plamo/gomi/chk_delay.c
> にサンプルコードを示します。ゴミのようなコードですが、
> 念のために Copyright 表示があります。GPLでお願いします。
>
>   基本的に危険なプログラムですので、コードをいじる際には
> 細心の注意を払って下さい。一歩間違えるとカーネルが死にます。
>   最適化オプションが必須です。root権限を要します。
>
>   このプログラムは
> #define COUNT 10000
> で示される回数 for loop を回します。その間、loop1回に要した
> マシンサイクル数を、変数 data に納めていき、あとでその結果を
> 表示します。
>   10000 行結果を表示するとうるさいので、100cycle 以上要した
> 物だけ表示するようにしています。
>   たぶん 512回に一度のペースで、極端に時間が掛かる事が分かる
> と思います。
(このケースでは,約314回になりました)。
>
>   これを解消する方法は、ソース中の /* page alloc start */
> から  /* page alloc end */ の間のコメントアウトされた、部分
> を有効にする事です。
やってみました。
松本さんのおっしゃる通りでした。
これは,私にとっては,重要なヒントになりました。
実は,当初は,測定期間が短いからだろうと疑っていました。
松本さんの, chk_delay.c をベースに
測定期間を長くするように改変したものでも,
やって見ましたが,松本さんの言う通りの動作をしました。
お礼を兼ねて,次のところに示します。
http://www.geocities.jp/sios_hp/gat_page/public/soft/linux/chk-delay-v3.c
混乱を避けるため,ファイル名の_を-に変えています。
変更等の概要です。(松本さんのものをOriginalと表記しています。)
1)2.5%以上周期が伸びた事象の間隔を表示するようにしました。
 (この誤差定義変更は,コンパイルレベルです)
2)周期を長くするための半ソフトタイマーを追加しました。
  このタイマーは,PCATのBIOSを設定を自動補正します。
3)周期設定を,コマンドラインから指定可能にしました。
4)松本さんのは,STI,CLIを使っていますが
  SYS_TIMERのみ割り込みマスクのOn/Offでも
  テストするようにしました。
  (どちらも,動作状況は同じ様に見えます)
>   これらのテストは、linux 2.4.22 で行っています。カーネルの
> バージョンが異なれば結果も異なる可能性があります。
私の場合は,Linux-2.2.19です。
--------------
松本さんの,
>ソース中の /* page alloc start */ から /* page alloc end */
> の間のコメントアウトされた、部分を有効にする事です。
のコメントが重要なヒントになりました,
私目の問題になったプログラムは,calloc()
を使っていますが,イニシャライズすることによって
問題の時間誤差発生が解消しました。
それで,glib6-srcのmalloc.c を眺めてみてみましたが,
大きいファイルでいろいろ書いておることはわかりました。
とても,私目には直ぐ手に負える代物ではないようです。
実は,FreeBSDでは,この問題は発生しないのです。
callocの実装の違い,カーネルの違いがからくるように思います。
疑問点としては,callocでは,ゼロクリアされると思っていましたが。
-----
調べていて気になったことですが,
上記 4)のCLI/STI方式と,SYS_TYMERのON/OFF方式
で,どちらが良いかと言う疑問です。
一瞬考えると,後者の方が,システムへ影響が少ないような気もしましたが,
その間にsys_callをしたり,しなかっても,何かが動作するすると,
Timerが割り込みが停止していると返って不都合が発生することも考えられます。
私の場合,FreeBSDと共通のプログラムとするために,あまり考えずに,
後者を採用していたのです。
(使い方によるとは思いますが),こんな危険があるとか
これ以外の,この割り込みでは,SYS_TIMERと関係しているとか。
信頼性の観点から,ご意見を頂けたらと思います。
FreeBSDでは,前者(CLI/STI方式)は使えるのでしょうか。
FreeBSDでは,iopl()はサポートしていないように思っていますが。
また,松本さんのコードの場合,iopl()とペアで使うのが必須でしょうか?
-------
いずれにしても,松本さんの応答に,感謝申し上げる次第です。
私目の,割り込みにとらわれた質問に,
的確な応答をして頂き,ありがとうございます。
chk-delay-v3.c作成で,お返事が遅れたことを,ご容赦下さい。
- - - - -
FM: 汐崎 廣義 < H.Shiozaki >
E-Mail: sios_hs(at)yahoo.co.jp
URL: http://www.geocities.jp/sios_hp/
>
> --
> 松本 徳真
> Norimasa Matsumoto
> E-mail: matsu@netfort.gr.jp
>

Follow-Ups
[plamo:21521] Re: Linuxの割り込みについて, H.Shiozaki
[plamo:21528] Re: Linuxの割り込みについて, Norimasa Matsumoto
References
[plamo:21451] Re: Linuxの割り込みについて, Norimasa Matsumoto

[検索ページ] [メール一覧]
Plamo ML 公開システム