[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 725] Re: ssizz1.



  こんばんは、川合です。


Koyanagi Masaaki さんは 2000/06/02 23:57:32 の「[OSASK 720] Re: 
ssizz1.」で書きました:

>そんなことないです。とても興味深く読みました。
>ここまで詳しく書いて下さってありがとうございます。

  どういたしまして。開発に疲れてたので気分転換になりました。

>ssizz0の「そのほかの全てをこなすビッグタスク」は、ssizz1の
>scratch pad+雑用ということですね。

  ええと、小柳さんの書き忘れかもしれませんが、"music player"もビ
ックタスクの中に入っています。

>ssizz0ではscratch padのみのタスクは存在していなかった、と。

  はい、そうです。

>マウスカーソルを動かすのも雑用タスクですよね。

  そうです。ssizz1で、雑用タスクがやっていることを羅列すると、

  ・F1〜F6の入力シグナルに反応
  ・マウスドライバーからのシグナルに反応(マウスカーソルの消去/
    描画)
  ・初期化作業の全て

などです。

>>   この移行作業中に、トラブルが起きました。メモによると5/30の出来
>> 事です。・・・なんと、入力をかちゃかちゃと切り替えると、不意に、
>> カウンターが停止してしうのです。
>ちなみにこれはOS全体が停止したということ(カーネルパニック)
>ですか。

  いやー、そのう、すぐには分からなかったのですが、F1〜F6には反応
しました。つまり、少なくとも「雑用タスク」は生きていたわけです。
テスト用のマシンにはマウスが繋がっていないので試していませんでし
たが、きっとマウスも動いたでしょう。・・・これは「不眠症バグ」で
あることを暗示していたわけです。

  OSASKではタスクの実行レベルにグローバルレベルとインナーレベル
という概念がありまして、「雑用タスク」はとても優先度の高いグロー
バルレベルを持っているのです。グローバルレベルは排他的なレベルで
、これより低いグローバルレベルをもつタスクは、永久に実行されませ
ん。この雑用タスクがスリープして、高いグローバルレベルに所属する
タスクが1つもない状態になると、低いグローバルレベルをもつ"count
 up"たちが動きはじめるのです。グローバルレベルが等しいタスクが複
数存在する場合は、インナーレベルで実行時間比が決定されます。

>なるほど、「雑用タスクから"scratch pad"タスクへカーソルブリンキング
>停止シグナルを送信」というのが雑用タスクがOSASKのシェル(的存在)
>であり、自らの役割を果たしているということですね。

  そうです。雑用タスクは、"scratch pad"に、「おまえは入力アクテ
ィブになったんだよ」って伝えます。"scratch pad"は、自分がどうい
う手段で入力アクティブになったのかは知りません。F6かもしれません
し、マウスでウィンドウをクリックされたからかもしれません。でも、
そんなことは"scratch pad"にはどうでもいいことです。・・・これは
、統合入力で目指している、「具体的な操作」と「実行される機能」を
分離する、という一例でもあります。分離しているからこそ、アプリケ
ーションを再コンパイルすることなく、操作方法を変更することができ
ます(たとえば、GUIアプリケーションに対しても、バッチファイルを
作ることができるということです)。

>>   それで、地道に流れをたどったところ、数字時間後に、ついに、TAPI
>> が悪いと分かったのです。雑用タスクから"scratch pad"にカーソルブ
>> リンキング停止シグナルを送信したあと、すぐに雑用タスクはスリープ
>> するのですが、このスリープが効いていないのです。それで、ソースを
>スリープが効かないというのは、雑用タスクが起きたままになる
>ということでいいでしょうか。

  そうです。スリープのためのシステムコールをしているのに、寝ない
で帰ってきてしまうのです(このシステムコールのあとは、メッセージ
が来るまで起きることはないのが正常)。

  でも、この事例を小柳さんが深く勉強しても参考にはなりませんよ。
もう、こんな間抜けなバグはなさそうですから。

>> ング能力もここまでかと、あきらめモードに入りました。それで、とり
>> あえずブリンクはやめて、この問題はソース公開のときにTAPIを作り直
>> すことで解決させよう、と何度も思いました。でも、そのたびに、いや
>> 、そんなことじゃだめだと、考え続けたのです。
>ここがデバッグで一番苦しい時ですよね。私だったら、ここで一端
>終了して気分転換か眠るかしてると思います。

  いつもの僕なら、小柳さんと同じ事を僕もしたでしょう。いや、その
ー、5/31が迫っていたもので・・・。

>川合さんのこんなメモがいっぱい書かれたノートを見るのもおもしろいかも。

  それじゃあ、ついでにもうひとつ。これは、timerの拡張の際のバグ
に悩んだ様子です。この時のバグは、不意に"count up"のカウンターが
停止してしまうという症状で、しかも、適当なキーを押すとなぜか再開
したのです。

000525
  timerのwork->status == 0のまま疑惑は、晴れた。
  GAPIのcli_count疑惑も晴れた。
  では、なぜ、キーを押したら再開するのか?・・・それは、時分割割
り込みが死んでいるからである。
  timeoutバッファへ入ってくる数と出て行く数は一致しているようだ
。
  そうなると、interval計算が怪しくなる。
  そのとおり。intervalがおかしかった。時刻からすればタイムアウト
していなければいけないのに、タイムアウトしていない例が見付かった
。
  おかしくなるのは、誰のせいなのか?registは無罪だと思われるのだ
が・・・。
  既知のバグはすべて解消。めでたい。

  ・・・こんなのじゃあ、一体なんのことだかさっぱりでしょう。いい
んです。僕が当時の問題点と修正個所を思い出せればいい、くらいのつ
もりで書いたメモですから。雰囲気をお楽しみください。

>>   これに懲りて、すぐにTAPIの初期化ルーチンの自動化(タスク数を数
>> えるとか)をしたのは、言うまでもありません。
>こういう自動化ってバグを防ぐためにとても重要だと思います。

  本当は、こんな初期化ルーチンがあってはいけないのです。タスクを
生成するシステムコールができていないのが根本的な問題なのです。で
すから、タスクを生成できるようになったら、この初期化ルーチンは単
なるごみになります。

>>   するどい!・・・あまりにも鋭い指摘です。デバッグモードに入るオ
>> プションはないですが、それに相当する隠し機能が存在しています。メ
>> モリの好きな場所を覗く機能です。16バイトずつしか表示しませんが。
>やった!鋭い指摘ができた。
>今後も鋭く迫れるようにがんばります。

  いや、そんなにがんばらなくていいです。僕のための隠し機能だった
のに・・・。自分しか知らない機能があったりすると、なんとなく楽し
いじゃないですか。そして、リリースが迫っているのにろくな改良がで
きなかった場合などに、隠し機能を公開してあたかもたくさんの改良点
があるかのように見せかけるための貯金でもあるのです。

  有名な隠し機能は、0x6aの800x600モードですね(あのときは、橋さ
んに言われてばらしてしまいました)。残念ながら、小柳さんのマシン
ではうまく動きませんでしたが。

>dumpという命令のみを解釈するシェルが動いていると言えないこともない

  それは、ちょっと誉めすぎです。そんなに立派なものじゃありません
よ。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.or.jp
Homepage http://www.imasy.or.jp/~kawai/