***本記事にはプロモーションが含まれています。***
マルチタスクの話だった。
プリエンプティブとノンプリエンプティブの差って、案外小さいんだなと思った。実際、タスクの優先度をつけたりするのは、プリエンプティブでなければできないけれど。
処理する時間で優先度をつけるのは一般的なんですかね。
それに、カーネル内部の関数も1つのタスクとして独立して動かせるってのが新しかった。普通、アプリケーションやサーバを独立したタスクとして動かすことは、想像できるけれど。Linuxで、カーネルのログをとったりするデーモンも、こういう実装になっているんだろうか。起動の最初のほうで、いろいろ立ち上がっていることは気づいていたけれど。調べたことはないけど。
別にカーネルであろうとアプリケーションであろうと、つまり、特権レベルが違っていなくても、ある関数をタイマ割り込みで切り替えているんだから、同じなのか。
逆に、スレッドなどもTSSを1つ使ってGDTに登録してしまうという実装もありなんですね。コストがかかるけれど。
ただ、LinuxもWindowsも、プロセスの管理はx86の機能を利用せずに自前でやっていると聞いたことがある。x86_64になると、互換性のために残っているという感じだと思います。この辺、どうなっているのでしょう。