個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 13)

タイマの続き

今日もタイマをやるのですが、どちらかというとタイマそのものではなくその裏の割り込み処理とかを改善する、という感じでしたかね・・・

性能測定

ただコードを改善するだけでは本当にそれが速度も改善で来ているかはわかりません。そこで、実際に数値を比較することで改善を定量的に示すために、ベンチマークテストのようなものを作成します。といっても現状複雑なことをしているわけではないため、10秒間ひたすらcount変数をインクリメントし続け、タイムアウト時にこの値を見てみることでどれだけ値が増えているかで確認します。
ちなみにタイマの開始直後は値にぶれが大きいため、開始数秒後(本では3秒後)に一旦値を0にリセットして、そこから測定を開始するようです。(なので実際は7秒間ですね)
とりあえず上記で数回計測を行って、平均を取ればその時の実装における性能がわかるという流れですね。

FIFOバッファを見直す

現状、キーボード・マウス・タイマの割り込みはそれぞれ別のFIFOを使っています。そのため、割り込みがあるかどうかはとりあえず全てのFIFOを確認しなければならず、無駄が多くなります。3種類どれにでも対応できるような汎用性の高いFIFOを作成できればFIFOは1つだけで済むはずで、実際そのようなFIFOは作れます。
その値が何を表しているかを判定できればいいため、一定値オフセットを用意してあげるだけで解決できます。例えば、キーボードの値は常に256を足した状態で入れたり、マウスの値はキーボードの範囲よりも上になるように512を足すといった具合です。あとは処理するタイミングでそのオフセット分を引けば問題ありませんね。

ちなみに、この変更だけで実機でも1.3倍ほど性能が上がるようです。

続・割り込み処理は短く

FIFO自体の性能は上記のおかげで上がりましたが、そもそもFIFOはタイマ向きではありません。それは、タイマを新規に作成する際に正しい順番にいれた後、それ以外をずらす処理を行う必要があるからです。しかも、この新規作成は割り込みを禁止にした状態で行うので割り込み処理の速度にも影響がありそうです。

線形リスト

というわけでついに線形リストの登場です。(双方向ではないやつ)
線形リストではそれぞれの構造体(別に構造体でなくてもいいですが、簡単のため)の中に次の構造体へのポインタを持たせることで、ずらし処理が高速に行えるようになります。ずらし処理は次の変数へのポインタを付け替えてあげるだけでよくなるからです。
いつ見てもこれを思いついた人は天才に見えますよね。普通次へのポインタを持たせるなんて考えないと思うんですが・・・

番兵を置く

現状、タイマを登録する際に、
・タイマが1つだけ ・先頭に入れる ・途中に入れる ・末尾に入れる と4通りそれぞれを考えるようになっていて、非常に無駄が多いです。これを解決してくれるのが番兵くんです。
番兵として一番末尾に常に絶対に到達しないであろう時間を設定したタイマ(到達しそうになってもリセットすればいいわけですが)を配置すると、上記の4つがなんと2つまで減らせるのです。(1つだけになる可能性がなく、末尾に入れる可能性もないため)
これでずいぶんとタイマの新規登録が早くなったはずです。

性能測定

ほんとは14日目の内容ですが、流れで見てしまいましょう。
実は、上記と同じ条件で測定してみると数値がほとんど変わりません。というのも、新規登録の特にずらし処理を高速化したわけで、実際にそういった環境で測定してみないと変化がわかりづらいのです。
まぁ、実際はずらし処理をたくさん行ってみてもそこまで大きな性能向上は得られないのですが(インクリメントが1000回くらい大きくなる程度)、しかし割り込み処理を素早く行えるかどうかは非常に大きな問題のため、こういった小さな改善でも大きな成果といえるのです。

Day 14へ

これでひとまずタイマは終了です。明日は少し毛色が変わって高解像度に対応させることとキー入力を文字で表示させるようです。それが終わったらいよいよマルチタスクなのでサラっと進みたいところですね。