こんばんは、川合です。
KOYANAGI, Masaaki さんは 2002/09/17 21:09:44 の「[OSASK 5015] Re
: シグナル(ぐいぐい01).」で書きました:
>私が想定している状況は、順序を無視してでも最優先に通知したいという場合
>です。VRAM アクセス禁止や再描画要求のシグナルを他のシグナルよりも優先
>するような感じです。
> 複数ではなく、「通常」と通常シグナルに割り込める「特別」の 2種類のみ
>をシステムでサポートすべきではないかと思いました。
> 優先レベルが複数ある場合はアプリ側で自前で振り分けでいいと思います。
おっしゃることはよくわかります。ただ、通常シグナルに割り込むと
いうのは結構厄介でして、結局はシグナルボックスを2つもつという方
法になります。シグナルボックスを単なるFIFOバッファにしないで、も
っと複雑な構造にすれば割り込みもできますが、効率はぐっと落ちます
。そうなるくらいなら僕としては以下のような書き方をお勧めします。
int new_getsig()
{
static int sb_2nd_buf[1000], *sb_2nd_rptr = sb_2nd_buf;
static int *sb_2nd_wptr = sb_2nd_buf;
int sig;
for (;;) {
sig = getsignal();
if (sigは特別の値)
return sig;
if (sig == 0)
break;
*sb_2nd_wptr++ = sig; /* 通常はbufに貯めておく */
}
if (sb_2nd_rptr == sb_2nd_wptr)
return 0;
return *sb_2nd_rptr++;
/* これだと通常シグナルを1000個しか扱えないので
ちゃんとつかうならrewindなどを入れる */
}
これはつまり、通常シグナルをどんどん読み飛ばしてFIFOキューに入
れているわけです。結局、シグナルボックスを2つ持っているようなも
のですが。もちろんバッファを複数にすることもできます。そうすれば
、複数のシグナルボックスを持つようなものです。
こういう処理がふさわしいのは時間のかかるシグナル処理と緊急を要
するシグナル処理の両方をアプリ側にもっている場合だけです。システ
ム側が効率のよくない大規模なものを提供するよりも、アプリが好きな
ようにやったらもっとうまくいくんじゃないかと思っているのですが、
どうでしょうか?
>元の[OSASK 4982]ではシグナルボックスの数には触れていなかったので、
> 1つのままでいくと思っていました。複数にした場合のことは私も考えて
>いたので、この説明は良く分かります。
おお、さすがです。
なお、[OSASK 4982]にはシグナルボックスの数についてほんの少しだけ
言及しています。シグナル属性のbit8-15のところです。ここに配達先(
どのシグナルボックスにするか)を書いてもらおうかと思っていたのです
。
実は上記のnew_getsig()のようなものをぐいぐい00は既に持っています
。これでまさに「VRAMアクセス禁止や再描画要求のシグナルを他のシグナ
ルよりも優先」しております。もっともアプリ側がこれらのシグナルを要
求した場合はこの限りではありませんが。
で、new_getsig()のようなものを持っている以上、別にアプリ側のシグ
ナルボックスを複数にしたってどうってことはありません。簡単に処理で
きます。負荷もシステム側のコードサイズもほとんどそのままです。ただ
これが本質的に必要なのかどうかが悩みどころなのです。
>マルチスレッドがサポートされると複数のシグナルボックスがサポート
>されていると便利ではないでしょうか。マウスシグナル専用のシグナル
>ボックスを用意して 1つのスレッドでそのシグナルボックスを監視する
>というような使い方をしたくなると思います。
それはそのとおりです。でも複数のシグナルボックスがあれば、シグナ
ルが溜まっていないかどうかを検出するのはそれだけ面倒になります。そ
れでも使えるものでしょうか?ちゃんとしたマルチスレッドの場合は、ス
レッドごとに独立したシグナルボックスを与える方針です。ですからとり
あえずはシングルスレッドに限定して考えてください。
なんというか結局ほとんどの場合でシグナルボックスは一つしか使わな
いなんてことなら、APIとしては一つしかサポートしなくていいと思うん
です。その方がシステムもアプリも単純ですし。一つのサポートがあれば
、それを複数のサポートにすることもアプリのわずかな努力でできるわけ
です。逆に多くの場合で複数のシグナルボックスを使うというなら、シス
テムが面倒を見てやった方が効率がいいわけです。それがなんとも決めか
ねて・・・。
もしずっと分からないままだったら、ぐいぐい01ではとりあえず複数
のシグナルボックスに対応してみます。それで数年間ほど様子を見て、
ぐいぐい02あたりで継続するか廃止するかを決めようかと思っています
。考えて分からなければ試してみるしかありませんから。
それでは。
--
川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/