見出し画像

#7 OSクンのマルチタスク

 忙しさ&色々インプットするの楽しすぎて、まったく更新していないことに…….. 久しぶりに書きます、OS記事。今回はOSのマルチタスクについてです。

参考書籍

 いつもの本。MIkan本。

  • 書籍名:「ゼロからのOS自作入門」

  • 著者:内田 公太

  • 出版社:株式会社マイナビ出版

※ アフィリエイトリンクではありません。飽くまで書籍の紹介としてのリンクです。

マルチタスクとは?

 マルチタスクと聞いて、どんなイメージが湧きますか?

  • Youtubeで動画を見ながら、ゲームをやる

  • 音楽を聴きながら、料理する

  • 授業を受けながら課題をやる

etc…

PCと関係ない話だと、こんな感じのイメージではないですか?
このイメージをそのままPCに持ってきたのが、OSのマルチタスクです。

じゃあ、OSのマルチタスクって?

 即ち、複数のタスクを並行or(並列)に動かすこと。
ここでは 「タスク=アプリ」と捉えるとわかりやすいと思います。

  • Spotifyで音楽を聴きながら、資料を作る

  • Youtubeで動画を見ながら、ネットサーフィン

  • ウェブ会議に出席しながら、議事録を取る

etc…

とこんな感じで、複数のアプリを同時に使えるようにするのが、OSのマルチタスクです。
 これ、使っている側からすると当たり前の機能ですが、OSクンが実現させてくれています。つまり、OSクンはスーパーハイスペックマン。

そもそもなぜマルチタスクが必要なのか

 では何故マルチタスクが必要なのか?これはマルチタスクがない場合のPCを考えてみるとわかりやすいです。

 マルチタスクがない場合、一つのタスクがCPUを占有していることになります。なので、ほかのタスクを全く動かすことができなくなります。例えばWordを開いた状態でOSを起動したら、再起動しないと永遠にWordしか使えない。そんなイメージです。

 めちゃくちゃ使いずらいですよね。もっと言うならOSのタスクの中には、画面表示タスクや、マウスの移動処理タスク、キーボード入力の受付タスクなど、もっと基礎的な機能を持つタスクがあります。本当に1つのタスクしか動かないOSだとすれば、これらを複数使うこともできないわけです。

(正確にはこれらのタスクは、割り込み実装がされているので、ほかのタスクの実行状態を奪って優先的に実行されるような実装がされます。)

つまり、マルチタスクがないと一つのアプリしか使えないパソコンになってしまいます。これでは使い物にならないですよねー。ということでマルチタスクを実装します。

ここからは、OSクンのマルチタスク術――つまり、技術的にどうやってマルチタスクを実現しているのか、について説明していきます。

コンテキストスイッチング

 OSのマルチタスクには、コンテキストスイッチングが欠かせません。というか、これがマルチタスクのすべてだと思います。

まず、コンテキストってなに?

 ここでのコンテキストとは、「タスク(アプリ)が実行される環境」のことを指します。具体的には、

  • タスクが使っているメモリ(スタック)の情報

  • タスクの次の命令の情報

などなどです。
これらはCPUのレジスタ上に存在しています。

What is コンテキストスイッチング

 前述のとおり、コンテキストとはタスクの実行環境です。つまりコンピューターのリソースを含めた、タスクそのものです。
 このタスクの環境ごと切り替えることを「コンテキストスイッチング」といいます。

例えばミシンを使って、服を作ることをイメージしてください。

  • 同時に何着もの服を作らないといけない

  • ボタンなどの縫い付けは他の人に頼まないといけない

 こんな条件でボタンの付いた服を作るとすると、1着の作業ごとにボタン縫い付けの時間だけ暇ができます。どうせなら早く仕事を終わらせて、自由に遊びたい……そんな時にマルチタスク。
 暇な間にも服を作ればいいんです。単純ですが。このミシンで縫う服の切り替えが、コンテキストスイッチングのイメージです。

 実はOSとミシンで服を作る人は似た境遇なのです。
共通点を挙げると、

  • 使えるミシンは一つしかない = OSが管理しているPCは一つ

  • 複数の服を同時に作る = 複数のタスクを同時にOSは実行する

といった感じです。ちょっと無理矢理な例えな気もしますが…

 OSも、服を縫う人が一つのミシンを使いまわして複数の服を作るように、

一つの実行環境(PC)を使いまわして、複数のタスクを実行します

ここが重要です。複数のことをしたいのに、道具は一つしかない。だから縫う服を切り替える―――コンテキストスイッチングする。そういうわけです。そのためには少々工夫が必要です。

レジスタ・コンテキストの退避

 コンテキストスイッチングを行うための工夫は、レジスタ――コンテキストの退避です。

 ここでミシンの例に話を戻します。さてあなたは縫う服をミシンから取り外し、別の服をセットすることを考えましょう。そのまま、何もせずに服を交換するとどんなことが起こるでしょうか?例えば

  • 縫っていた位置が分からなくなってしまう

  • 服の色が変わったので、ミシン糸の色が合わなくなってしまった。

こんなことが起こるでしょう。これを回避するためには、

  • まち針で縫っていた位置を見つけられるようにしておく

  • ミシン糸を服とセットで管理する

などの工夫が入ります。

 コンピューター・OSのコンテキストスイッチにも同様の工夫が必要なんです。つまり

  • プログラムを実行した位置を見つけられるようにしておく

  • プログラムに使っていたデータをセットで管理する

という操作が必要になります。

ミシン作業とコンテキストスイッチングの対応
(イラストはいらすとやさんから拝借しました)

では実際何をしているのかというと、レジスタの内容の退避を行っています。このレジスタというのはCPUの中にあります。コンピューターとはここの値を読み書きすることで、プログラムの実行するのです。なので、プログラムを中断・再開するにはこのレジスタの内容を一度別の場所に保存し、後で読み込める状態にしておく必要があります。

 このレジスタにはいくつか種類があります。役割ごとにCPUの中に作られているのですが、ここで関係してくるのが主に3つ

  1. RIPレジスタ : 次に読み込む命令の位置を記憶する(いわばまち針)

  2. RSPレジスタ : スタックの先頭アドレス(プログラムのデータを保存)

  3. RSIレジスタ : 別の処理から復帰する位置を記憶する(まち針2)

の3つです。これらを別の場所に避けてあげ、必要になったところで読み込む。するとあら不思議。複数のアプリが同時に動きます。

これがコンテキストスイッチングのざっくりとした外観です

ちょっと余談ですが…

 Mikan本のなかでは実際に、このコンテキストスイッチングを実装します。保存したいレジスタについては、実はC言語・C++言語では直接アクセスできません…そこで、アセンブリを使ってレジスタをダンプします。
 
まぁプログラムをやったことがない人にとっては何のこっちゃという話ですが、経験者からするとわりとビックリする話な気がします。スーパー力技ですよね。

まとめ

 以上、今回はコンテキストスイッチングについて、私なりにまとめてみました。私の中ではMikan本をやるなかで、1、2を争うほどインパクトがありました。「複数の処理が動くってこうなっているんだ」という驚きとともに、「うわぁ、ゴリゴリのアセンブリだぁ」と思った記憶があります。といっても、レジスタの内容をコピーするだけなので、そんなに難しい話ではないのですが…
 今回の記事では説明していませんが、Mikan本ではmさらにタスクの優先度をつけたりして上手いこと管理しています。そこの詳細については、ぜひ本を買ってねということで。この記事のリンクから本を買ったところで、私にはビタの一文も入りませんから、悪しからず。
 ですが、OSの勉強をすると「コンピュータのできること」がだいぶクリアに見えてきます。コンピュータは魔法なんかじゃない。丸裸の計算機であることが、身に染みてきます。と、同時にOSという芸術的な抽象化処理を知ることになります。実際の開発に生かせるかどうかは別として、自分の開発力・設計力・コンピュータへの理解力は、めちゃくちゃ向上しますよ!
 
 ミシンのたとえ、冗長で失敗したかなぁと思いつつも、わかりやすい解説に向けたチャレンジということで、ご容赦をば。
 長文を読んでいただきありがとうございました。では、また。

この記事が気に入ったらサポートをしてみませんか?