Part III: マルチタスキングとスケジューリング¶
概要¶
本章では、OS がどのようにタスクを切り替えるか、タイムシェアリングの仕組みを学びます。ゲームループの例を通じて、マルチタスキングを理解します。
ゲームループの例¶
タスクの定義¶
public record GameTask(string Name, Action Action)
{
public void Run() => Action();
}
イベントによる調整¶
public class ProcessorFreeEvent
{
private readonly object _lock = new();
private bool _signaled;
public void WaitForSignal()
{
lock (_lock)
{
while (!_signaled)
{
Monitor.Wait(_lock);
}
_signaled = false;
}
}
public void Signal()
{
lock (_lock)
{
_signaled = true;
Monitor.Pulse(_lock);
}
}
}
ゲームループ¶
public class GameLoop(
Action inputTask,
Action computeTask,
Action renderTask,
Func<bool> continueCondition)
{
public void Run()
{
while (continueCondition())
{
inputTask();
computeTask();
renderTask();
}
}
}
スケジューリング方式¶
| 方式 | 説明 |
|---|---|
| 協調的 | タスクが自発的に制御を譲る |
| 先制的 | OS がタイムスライスで切り替え |
次のステップ¶
Part IV では、Fork/Join パターンとパイプラインパターンを学びます。