English

第122回コラム「あやふやなハードウェアとソフトウェアの境界」

2020年8月28日

追川 修一 教授

 一般的に、ソフトウェアは物理的な実態を持たない、そのために変更が容易である、ハードウェアは物理的な実態を持つ、そのため一度作ってしまうと変更できない、または非常に困難である、と言われる。ソフトウェア工学の講義でもそのように話すわけだが、そう単純な話ではないと思いながら、引っ掛かりながらも、そちらの方の話に脱線するわけにもいかないため、そちらの方の話はしないで済ませることになる。

 ここで、コンピュータ本体はハードウェア、コンピュータが実行するアプリケーションがソフトウェア、というのもまた一般的な認識になるかと思う。デスクトップであれラップトップであれ、PCは目に見え、また手で触って操作するため、コンピュータが物理的な実態であるという認識になるのも当然である。

 では、いわゆるサーバはどうであろうか。一昔前(二昔以上前かも)は、大型計算機などと呼ばれ、大学には計算機センターと呼ばれる施設があり、その中に入ると、冷却のためのファンと空調でけたたましい音がする計算機室に鎮座する大きな箱を、小窓から垣間見る機会もあった。それは、使用できるとしても別室の端末をとおしてであり、直接触る機会は無くとも、紛れもなく物理的な実態であるハードウェアそのものであった。

 現在、サーバの主流はクラウドコンピューティングである。その名の通り、雲のようなものなのか、物理的な実態が置かれているデータセンターの所在地は非公開なことも多く、その姿を見ることはできない。さらに、クラウドコンピューティングでは、さまざまな仮想化技術が取り入れられている。コンピュータでは、古くから仮想化技術が使われている。PCでも、仮想メモリと呼ばれる、HDDやSSDなどのストレージを借りて、物理的なメモリ以上の容量があるように見せかける技術が使用できる。プロセッサ(またはCPU)も時間で分割することにより複数ユーザで共有できるようになっているが、これは仮想化とは呼ばない。プロセッサの仮想化というと、メモリも含めたコンピュータ全体が独立して複数あるかのように見せかける技術になる。仮想化されたコンピュータ上では、オペレーティングシステムが実行され、その上でアプリケーションが実行されることになる。

 このコンピュータの仮想化の歴史は、意外なほどに古い。最初のコンピュータの仮想化は、1967年にIBM System/360を仮想化するために開発されたIBM CP-40で実現されたと言われている。当時、複数ユーザが同時にコンピュータを利用したいとの要求に応えるためのオペレーティングシステムが開発されていたが、その開発に時間がかかっており、その代替手段として仮想化技術が開発されたとの話もある。仮想化技術は、ハードウェアの支援も必要であるが、基本的にはソフトウェアで実現される。つまり、ソフトウェアがハードウェアのインタフェースを提供するものであるため、仮想化環境で実行される場合、通常はハードウェアが実行する部分をソフトウェアが実行する、つまりエミュレーションすることになる。

 System/360は、通常はハードウェアが実行する部分をソフトウェアが実行するエミュレーションを、仮想化以外の、その他の通常の機械語命令でも行っていた。System/360は、小型で安価な機種から高性能だが高価な機種まで揃えたことで知られているが、全ての機種で同じ命令セットをサポートしていた。命令セットは同じでも、高価な機種はそのほとんどをハードウェアで実現することで高い性能を提供するが、安価な機種ではエミュレーションとすることでハードウェアを減らし価格を抑えていた。

 現在ではPCでも、ソフトウェアによるハードウェアのエミュレーションは使用されている。最近のPCでは、USBキーボードを古いインタフェースであるPS/2に見せかける機能を持つものも多くあるが、これはIntelプロセッサの持つ SMM (System Management Mode) という機能を利用して、PCのファームウェアであるBIOSがデバイスのエミュレーションをすることで実現している。マイクロコードも健在だそうである。あたらしい命令(例えば、仮想化を支援する命令)が追加された際には、最初はマイクロコードで実現され、よく使われる命令から、徐々にシリコンによる実装に置き換えられていったそうである。

 このように考えると、昔から現在に至るまで、ハードウェアとソフトウェアの境界は必ずしも明確ではなかったことになる。一度作ってしまうと変更できない、または非常に困難である部分が必ずあるのは確かであるが、その境界というのは結構あやふやである。

PAGE TOP