leiqunniの日記: Windowsのマウス処理 5
USBマウスを使っているけど、システムが一時的に過剰負荷の時、
マウスカーソルの動きも止まってしまう。これの原因は何なんだろうか。
Windowsはマウスが動いたときもウィンドウメッセージを投げて処理してるようだから、
このメッセージ処理が負荷で間に合ってないんだろうか(マウスカーソルを描画するルーチンは、
WM_MOUSEMOVEをもらって描いてる)。
それともUSBのポーリング処理なんだろうか。
PCにはせっかくPS/2端子とシリアルポートが付いていて、
どちらもIRQを割り振られてる割り込み族だ。
マウスから動いた信号が入ると、CPUに割り込みが入るんだぜ。
USBはホストがマウスをポーリングしないとデータを送れん。
これの検証のために、PS/2のマウスとキーボードも接続してる。
Windows 4.0のマウスはぬるぬる動いてた覚えがあるなあ。
キーボードやマウスは人間の速度が基準の負荷の軽い処理だ。
だけど人間は自分の操作がそのまま反映されないと、ムカつく。
マウスカーソルの移動はハードウェアレベルでOSとも分離してて、
どんなときでもマウスを動かしたようにカーソルが動いて、
それでアプリケーションを操作したい。iPhoneのタッチパネルもたまに反応しなくなるけど。
UIの部分を全部割り込みで処理したら気分いいだろうなー。
そうするとシステムメッセージも割り込みになって、処理順序が保たれなくなって、駄目か。
どんなけシステムに負荷がかかってても、人間の入力くらいは受け付けてほしいだけなんだ。
なのに人間が待たされるって。
Windowsはアプリ(スレッド?)ごとにメッセージキューが用意されて、
そこにメッセージが溜まってく。キューの処理はアプリケーションがする。
ウィンドウシステムのアーキテクチャって誰か頑張って研究してたりするのかな。
ウィンドウの重ね合わせだって、グラフィックメモリが山のようにあるから、
アプリケーション毎に仮想スクリーン持って、最後にGPUで重ね合わせだもんな。
Windows98SEの場合 (スコア:1)
丁度、私も不思議に思っていたところなので、チョットお邪魔しますm(__)m
自分の日記にも書いたのですケド、ウチの場合逆で、マウスをウリウリ~と動かすと、
演奏しているmidiシンセ(SB16AWE64ISA)のテンポが遅くなる、と言う問題でした。
日記では、グラボのBIOSを更新したら治ったと書いてるのですが、環境を変えたら再発。
根本的な対処では無かったことが判明して、目下アタマを抱えて大orz状態です。
それで、ここのUSBはポーリング?という部分を見て、USB無線マウスとの比較を
してみようと思い付きました。で、その結果…
何と! テンポは遅くなりませんでした!!(@_@)ェッ?
PS/2マウスとは同時稼動で、ドチラのマウスを使ってもカーソルが動く状態です。
そこでマウスを交互にウリウリ動かしてみると、
・ポーリングなUSB無線マウスは影響を受けず、
・割り込みなPS/2だとテンポが遅くなりました。
この結果からすると、足を引っ張っているのはグラボ周りの描画系ではなく、
そこまでに至るマウスの割り込み処理そのものがヘン…みたいに見えます。
Windows98SE辺りだと、メッチャ沢山のマウス割り込みが入るんでしょうか(^^;)
WinampでCanyon.midを演奏させているだけなので、CPUパワーの影響を大きく受ける
類の負荷だと思うのですケド、そのマシン(Intel/DK440LX/Pentium2/300MHz)では、
カーソルが止まったり飛んだりするような現象は見られませんでした。
これがストレージ関連だとそうは行かないのでしょうが、優先度の低い高負荷だと、
そんな感じで処理されているようです。
流石にシリアルマウスは手元に無いので、試すコトが出来ないのですケド、
USB無線マウスはドングル・本体共に、32bitRISCの1チップマイコンが搭載されて
いるそうなので、思っているよりも低負荷で動いている可能性も考えられますし、
USB有線マウスは意外と高負荷だったりするのかも知れません。
USBは出始めた頃、少し仕事で関わったコトがあるのですケド、バーストモードと
キャラクタモードがある位しか記憶が残ってないので、全然参考にならなかったら
ゴメンナサイ(>_<)ゞ
# やっぱりコンピューターは忠実に応える僕であるべきだと思いまするぅ~。
ヒトよりコト・モノに関心を持ち、反応するように心掛けています♪(^^)v
UIプロセスそのものが重くなっています (スコア:0)
マウスやキーボードの反応が悪いときは、UIプロセス自体が何らかの理由(おそらくバグ)で激重になっているようです。
たまたまタスクマネージャを開いていた時の経験からすると、アプリやバックグラウンドプロセスの負荷は無関係のようです。
UIプロセスそのものに欠陥があるので、優先度を上げるとアプリやバックグラウンドプロセスまで止まってしまいます。
マウスが動かない (スコア:0)
ってのは無いなぁ…
アプリが出してるようなときは別として
Re: (スコア:0)
USBの実装ミスっていて、USBの処理をOSのドライバーでなんとかしてるチップセットがあったような。有名なのはP55
その手の奴は変なことが起きるのかも。
後は、他の何かタコなドライバーがマウスかGPUかOSの処理を止めてるのかも。
キャプチャデバイスで経験あり。
思いもよらぬ原因として、DisplayPortのケーブルの不良。
エラー処理か何かでGPUが止まってマウスも止まる症状の経験あり。
USBトラヒックで輻輳していないんだったら (スコア:0)
>システムが一時的に過剰負荷の時
おめー自身が、原因を書いてじゃん。
ご存じの通りPS/2とUSBのマウス&キーボードでは 結果は同じだけど
結果に向かうためのプロセスが違う。USBデバイスはデバイスにあった種類へ
エミュレートをする必要があるためのソフトウェア処理が入るのでどうしても
システムが過負荷になるとその処理が滞留しやすく止まることがある。
(USBの特性上 USBバス内に流れるバルク通信を解析できなくなると
デバイス停止とOSがみなすので最悪 ブルスクになる危険性がある)
つまりPS/2に接続した機器であるなら、そのバスから来た情報は
マウス・キーボードであると判断しなくてもマウス・キーボードとわかるが
USBの場合、流れる通信の中からマウスである情報を見つけ出し、それを
マウスであると判断しないといけない。
判断するために必要なリソースが、システム過負荷によって失われると
どうしてもUSB機器は 一時的に使えなくなる。(USBは仕組みが単純な分
複雑な処理が要求されるデバイスなのです)