スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WindowsOSの歴史を振り返る

 私は新しいWindowsが出るたびに、無責任かつ過激なバッシングをする人がいることに眉をひそめています。WindowsはOSであり、OSを正しく評価するには、OSに関する知識と歴史に関する知識が必要です。それを踏まえずに、感想を超えて過激にバッシングする行為は、知性と品性を疑われる行為ではないでしょうか?しかしながら、Windowsの歴史に関する読みやすい資料がなかなかないのも事実なので、私が書くことにしました。
 先ずOSとは何かということを知らねばなりません。OSを簡潔に表現すると、ハードウェアを制御し、プログラマーに対して適切なサービスを提供するためのソフトウェアです。ハードウェアを制御すというところがポイントで、OSを正しく批評するにはハードウェアの状況を見なければなりません。OSの歴史はハードウェアの歴史とマッチしているといっても過言ではないでしょう。特にCPUの歴史との関連が深いです。それを踏まえて、Windowsの歴史を振り返ってみましょう。
 1978年インテルは16ビットCPU(アドレスバスは20ビット)の8086を1978年に発表しました。当時としては高性能な製品で、1Mバイトのメモリを操作できるようになりました。しかしこのCPUは、既存の資産を無効にしてしまいかねないものだったので、外部機器とのやり取りを8ビットに抑えた8088を1979年に発表しました。これにより、インテルのシェアが一気に高くなります。これが運命の始まりです。
 大型コンピューターのシェアが80%の超巨大企業IBMが、小型コンピューターに目を付けました。といっても、IBMからしてみれば、小型コンピューターはおもちゃのようなもの。本格的に経営資源を割くわけにはいかないと考え、マイクロソフト社(ビルゲイツ氏)にOS開発の依頼をしました。
 この時できたのが、初めてのWindowsであるMS-DOS(当時はPC-DOSと呼ばれていた)です。このOSは他社の権利を買い取り、改良する形で作成しました。何故ならば、IBMのPCの発売予定日が1981年ごろだったので、BASICコンパイラを販売していたマイクロソフト社でも、1年の期間でOSを0から開発する余裕がなかったのです。ちなみに、この買い取ったOSの元々の名前は86-DOSでした。
 MS-DOSの仕組みは極めてシンプルです。割り込みベクタテーブル、IO.SYS、MSDOS.SYS、COMMAND.COM、デバイスドライバ領域、ユーザー領域、VRAM領域にメモリを分けただけのものでした。ユーザーインタフェースもCUIでした。とはいえ、当時のOSとしては良いものです。
 MS-DOSのユーザーインタフェースが文字ベース(CUI)だったので、一般ユーザーは使いにくいものでした。そこで、GUIベースのOSをめざし、1985年にWindows1.0を発売しました。ただし、本当のところはOSというよりも、アプリケーションの1つでした。しかもGUIゆえに640KBの容量があったので、ユーザーが使えるメモリ容量は少ないです。なおかつ、メモリを節約するためにウィンドウを重ねることすらできませんでした。
 ウィンドウを重ねられなかったので、Windows2.0で拡張メモリ機能を使って、解決しました。これがユーザーの心をつかみヒットしました。しかし、CPUの進化は止まりません。インテルのCPUが進化するに従い、新しいOSを発売していきます。
 インテルは1982年に、メモリ容量16MB対応、プロテクトモードを有した80286を発売します。プロテクトモードというのは、セグメントと呼ばれる単位でメモリを区切り、その範囲内のデータを保護したり、マルチタスクを実現したり、仮想記憶を実現したりできます。非常に画期的な機能なので、マイクロソフト社は、プロテクトモード対応のWindows3.0を発売します。
 Windows3.0はMS-DOSの流れを受けていたので、ひとまずMS-DOSをリアルモードで立ち上げてから、改めてプロテクトモードで動くWineos3.0を起動する形でした。なぜこのような形でMS―DOSを残すのかというと、既存のお客様が引き続き、既存のアプリを使い続けられるようにしたかったからです。既存のお客様を大にする所が大成功のカギだと思います。
 Windows3.0の核となるのは、DOSX.EXE(32ビットCPUではWIN386.EXE)です。DOSX.EXEはセグメント機能を使いこなすために、セグメントに関する情報を管理したり、プロテクトモードに移動したり、権限を決定したりしていました。
 ここでいう権限とは、メモリにどれだけアクセスできるかを表す度合です。80286CPUは0~3の特権レベルをセグメント毎に設定できるようになっていました。この値が小さいほうが強い権限を持っていて、0はメモリのどこでも自由にアクセスできます。でもそれだと簡単にクラックされるので、普通のユーザーは権限が3になるように設定します。これをやっているのが、DOSX.EXEです。ちなみに、Windows3.0はWin16APIを使っていました。
 先ほどWIN386と書きましたが、Windows3.0は人気があったので、32ビットCPUである、80386が発売された1995年まで使われていました。Windows系開発者の中で有名な御三家、KERNEL,USER,GDIもこの時すでに存在していました。どうやらWin16APIができたときから居るようです。人気があったので、既存のお客様の要望に応えるために、16ビットと32ビットのハイブリッドOSになっていたのです。
 この当時の問題はセグメント方式が原因で発生する、通称「64KBの壁」でした。アドレスバスは増え続け、最大メモリ容量は増えたのですが、セグメントの使用で一度に64Kまでしかメモリを扱えませんでした。「64Kの壁」を破るために、32ビットCPUとそれに対応するWin9x系(95,98、ME)とWinNT系が登場しました。
 Win9x系は、Win3.x系の拡張モード(32ビットに対応するためのモード)にWin32APIを付与して作られたOSです。マイクロソフト社としても、本格に敵に32ビットCPUに移行したかったのですが、既存のお客様が持っている遺産を無視できなかったのです。一方、WinNT系は始めから32ビット主眼に作られたハイエンドなOSでした。
 Win9x系の特徴は仮想マシンマネージャ(VMM32.VXD)です。Win3.xにはOSを仮想的に作ることはできませんでした、Win9xではそれが可能でした。これにより、MS-DOS以来の資産に対応していました。また、仮想マネージャは、32ビットCPUの機能を使うための動作モードを以降や、メモリ管理などをしていました。これにより、まだ不安定さが残るもののWin3.xよりも安全なOSとなりました。ちなみに、Win9xでもMS-DOSから起動していました。
 先ほどWin9x系は「まだ不安定」だと書きましたが、その理由はWin16APIとWin32APIとの共存のための仕組みによるものでした。Win16とWin32はアドレスの扱いが異なります。また、仮想マシンもはっきりとわかれていませんでした。これらの理由により、どうしても不安定にならざるを得ませんでした。Windows95でよく再起動した思い出を持っている人は多いと思います。
 一方、WinNT系は始めから32ビットCPUを主眼に設計されており、仮想マシンも個々のアプリケーションごとに用意できました。これにより、Win9xよりも飛躍的に堅牢になりました。始めからこうすればいいというのは簡単ですが、当時の状況を考えると、既存のお客様を捨てることはできないので、仕方がないと思います。現実に商売している企業は、机上の空論とは違い、妥協も必要なのです。
 WinNT系にはもう一つ特徴があります。それは、オブジェクト指向を取り入れた事です。WinNT系はオブジェクト指向を目指して作られているので、カーネルの構造がはっきりと役割分担されています。この思想はWindows Vistaで成熟します。
 Windows Vistaは、オブジェクト指向OSが進化して、デバイスドライバもフレームワーク化されています。後で登場したWindws7の人気がありすぎて、批判されがちなVistaですが、OSを知っている人は、デバイスドライバの事を思い出し、無暗に批判しないでしょう。この時から、様々なサービスを提供する形へと進化しています。
 Windows7の事は記憶に新しいでしょう。Windows7では、さまざまなデバイスがサポートされるようになりました。例えば、センサー、タッチ操作、生体認証などです。Windows7からあらゆるデバイスにマッチするOSを目指していると思います。
 Windows8とWindows8.1は、みんな覚えているでしょう。では違いは分かりますか?意外と知られていないと思いますので、違いを重点にして説明します。Windows8はクラウド対応で、従来よりもネットワークを意識して作られています。また、パームトップ型PCの対応も意識されています。その為インタフェースが変わって、大バッシングされました。そして、Windows8.1でスタートボタンが復活して、そこだけが注目されています。でも、実のところ、カーネルのバージョンが上がっているので、それだけではありません。
 私が調べたところ、デバイスドライバレベルで多くの違いが見られました。タイマーが高精度になり、より快適な動作ができるようになりました。また、スリープ状態でも動くタイマーが追加されました。他にも細かくバージョンアップしています。カーネルのバージョン6.2から6.3へ上がったのは伊達ではないようです。さらに、最新のハードウェアに対応しています。
 私が注目しているのはWindows8で登場したWinRTです。オブジェクト指向OS+コンポーネント思考+サービス思考を実現するためのものでしょう。以前からマイクロソフト社は、OSを.NET化するといっていましたが、その試みが実現しつつあるのではないでしょうか?これから先もWindowsから目が離せません。
 纏めます。WindowsOSの批判は主に、移行期の製品を出す(Windows MEやWindows Vista)と、既存のお客様の事を考えていない(主にスタートボタンがない)です。しかしながら、CPUやハードウェアは常に進歩しており、Windowsに限らずどのOSも常に移行期です。Unix系OSも常に完成していません。人類が進化し続ける限り、OSが完成することないのです。また、既存のお客様の事を大切にしているからこそ、さまざまな努力と工夫を行い、OSを徐々にレベルアップさせています。マイクロソフト社の技術力ならば、互換性を無視した斬新なOSを作れるでしょうが、そうすると多くの既存のお客様が困ってしまいます。机上の空論を言うのは簡単ですが、実社会に存在する企業は、ハードウェアベンダーやお客様の事を考えつつ製品を作らねばならないのです。したがって、感想ならばいざ知らず、批判するときは、経営に関する知識とOSに関する知識を持ち、過去の歴史を踏まえながら意見するべきだと私は思います。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。