マルチタスク1

今日の勉強を覚書

今日の勉強を覚書

・マルチタスクは複数の仕事を決まった時間でスイッチして繰り返す。
・切替間隔は、間隔に対して切替にかかる時間が無視できる程度になるように設計する。
・現在の状態を次回呼ばれたときに復帰できるようにデータを管理することが必要。
・タスクスイッチは、指定セグメントを「TSS」としてfarのJMP命令を使用することにより実現。
・必要なときしか処理しないようなプログラムは、スリープさせて効率をあげる。 

マルチタスクとは

名前の通り、複数の仕事を
A→B→C→・・・→A→・・(繰り返し)
とする仕組み。

■ タスクスイッチ 切替間隔

切替間隔は通常のOSで0.01〜0.03秒だそう。

※例えばもっと高速にすると、
切替の回数が増える=切替の時間が増える(回数が増えるんだから当たり前)
→つまり、CPUの処理能力の切替時間が占める割合が増えてしまう。

このような理由から、切替間隔は短くても0.01秒くらいになっているそう。
(切替時間はOSによるが、0.0001秒くらいは必要だそう。間隔が0.01秒なら、切替にかかる時間は1%くらい
なので、気にならないということのようだ)

■ タスクスイッチ時のデータ管理

① 「現在の状態」を後から再開できるように、レジスタ→メモリへデータコピー
② 次のプログラムのデータをメモリ→レジスタへコピー
(ここらへんは、当たり前かな)

レジスタの内容 メモリへの書き込まれ方

「TSS」タスク状態セグメント( intが26個集まった構造体 )の、
[int eip]を使用して、次の命令がどの番地にあるかを記憶し、次のタスクを再開できる仕組みになっている。

※ EIPとは、extend instruction pointer 
次に実行する命令がどこの番地にあるかをCPUが記憶しておくためのレジスタ

■ タスクスイッチの方法

JMP命令を使う。
JMP命令・・・
①nearモード  EIPだけを切り替える
②farモード   EIPとCSを同時に切り替える ( CS・・コードセグメントレジスタ )

タスクスイッチでは、②を使用し、指定されたセグメントが実行可能ではなく「TSS」だった場合、
タスクスイッチ命令だと判断する。(CPUはEIPやCSを書き換えない)

TRレジスタ(task register)・・現在動いているタスクをCPUが覚えておくためのレジスタ。
タスクスイッチするとTRレジスタの値も自動的に切り替わる。

■ スリープ

「スリープ」
・・タスクの中から一時的に除外し、データが来たり、復帰するべき状態になったら起こされる仕組み。
「入力待ち」しているようなプログラムは、入力がくるまで暇である。
「スリープ」させれば、すべてのタスクに均等に処理を割り当てるより効率的に動作させることが出来る。

スリープについて考慮2点
① ちゃんとそのタスクを飛ばしてくれる仕組み。(該当タスク以降を後ろから詰める、など)
② 「自分自身」をスリープさせる場合、処理が終わったら次のタスクへのスイッチを忘れない

割り込み処理のあるプログラムでは何でもそうだが、たとえばスリープ処理を行っている間に割り込みが入る
などという状況が起こらないように設計する。スリープ処理中にバッファにデータが入ったりするとおかしく
なることがある。