📖

計算機のお気持ち(仮想化)

に公開

はじめに

AI関連の研究が盛んになる昨今、私の周辺では、計算機(コンピュータ)に慣れ親しんでいない人が仕事でプログラミングするようになりました。一方で、そのような方々に環境構築やネットワークの話が通じないことにもどかしさを感じていました。もちろん専門用語が通じないのは当たり前ですが、それ以上に計算機やネットワークの設計・背景にある思想が理解されていないと感じたため、その初歩の初歩である仮想化について(かなり私見を含めて)まとめてみました。

仮想化とは

一般に仮想というと、仮想現実(VR)系のことを思い浮かべるかと思いますが、ここでの仮想化は全く別物です。(「仮想」という単語の意味的には同じ)

仮想化とは、一言でいうと「物理的な計算資源の抽象化」です。ここでの抽象化とは、内部の詳細を隠して、その性質だけを外部に公開することです。この抽象化の具体例については、以下の記事がわかりやすいかと思います。

https://www.ohitori.fun/entry/what-is-abstraction-in-computer-science

どれだけ複雑で最先端のAIプログラムであっても、結局実際に処理(演算)を実行しているのは電子回路(CPUやGPU)です。ここに正しい動作を伝達するためには、プログラムに記述された(比較的)抽象的な動作を(電子回路にとって)具体的な動作に変換する必要があります。この変換こそが抽象化です。

ただし、この抽象化をあるプログラミング環境(OSや言語など)とある電子回路(ある会社で作られた特定のバージョンのCPU)の間で1対1で構築することは非効率です。したがって、抽象化の度合いを定め、「何に対する何の抽象化か」を明記するようにしたのが階層(レイヤ)モデルです。ネットワークにおけるOSI参照モデルやコンテナの説明に登場するブロック図などがこれに当たります。

これを実現することで、拡張性が格段に上昇します。これは、私たちが任意のアプリケーションを任意の計算機ハードウェアの上で実行する際、そのハードウェアの構成等を気にする必要はなく、適切なOSの存在を気にするだけで十分です。

仮想環境と仮想化

仮想化に近い概念に仮想環境があります。これはアプリケーションの実行環境と物理環境を多対多で対応させ、より柔軟性と拡張性を持たせるものになります。

上の説明だけでは、ある階層には単一の抽象化の方針しか認められていません。具体的には、単一の物理計算資源上には一つのカーネル・OSしか実装を認めていないという状況です。そこで登場するのが仮想環境です。ここでは、単一計算機上の計算資源を複数の実行環境毎に分割し、それぞれの環境から得られる命令を個別に実行する、というようなことをしています。詳しくは以下の記事がわかりやすいです。(この辺りも一度整理したい…)

https://kazuki217.hatenablog.com/entry/2024/03/02/000934

このような考え方の元登場したのがクラウドやコンテナです。これらの違いは抽象化するレイヤの違いです。また、一口にクラウドといっても様々な抽象化の度合いがあります。この辺りはAWSの責任共有モデルが非常にわかりやすいと思います。

https://flxy.jp/media/article/34249

まとめ

計算機のお気持ちと題して、私見と主観から仮想化について説明しました。仮想環境、特にコンテナ技術については個人的に非常に興味があるため、今後はそのあたりもまとめたいと思います。この観点は、ネットワーク、サーバ、セキュリティなど様々な場面で必要となります(主にバグ取りで)ので、ぜひ意識していただけると幸いです。

また、かなり大雑把に記述しているため、誤り等はコメントいただければ幸いです。

Discussion