khurata’s blog

khurata’s blog

OS とは何か?―OS 概説―

(もともと「Yahoo!知恵袋」の「知恵ノート」だったものを転載しています)
(最終更新日時:2017/1/28)投稿日:2012/6/13

はじめに

 「知恵袋」では、OS に関する質問を時折り見かけます。 しかし OS は、それだけで本が何冊も書けてしまうほど複雑で多様なものであり、「知恵袋」の回答字数では、全く不足です。
 そこで、知恵ノートの1万字を使って、「知恵袋」回答では書ききれない所まで書いてみます(現在9944字)。

 OS を語るには、まず歴史を概説するのが良いと思います。 なぜそうなっているのか、どうしてこうなったのか、それを知るには、歴史を見るのが良いと思うからです。

 OS の歴史はコンピュータの歴史でもあります。 コンピュータを「どのようなスタイルで使えるか」は、OS によってほぼ決まるからです。

 

OS の萌芽―そもそも何のために

 OS は、Operating System もしくは Operation System の略で、直訳すれば「操作系」ですが、そうは呼ばれず、「基本ソフトウェア」などと訳されます。

 つまり、OS は、ワードやエクセル、ブラウザ、ゲームなどと同じく、ソフトウェア(コンピュータ・プログラム)なのですが、わざわざ「基本~」と付けるあたり、なんとなく、ワードやエクセルなどといったアプリケーション・ソフトウェアとは、違う感じがします。

 アプリケーション application は「適用」という意味であり、アプリケーション・プログラムは「適用業務プログラム」と訳されます。 文書作成という業務に適用するプログラムがワードであり、表計算に適用するのがエクセルです。 つまり、これらはアプリケーションです。
 何かプログラムを作ろうと考えた時、それらはほぼ「何らかの特定の目的をもって作られる」のですから、それらもアプリケーションであると言えます。
 対して OS は、特定の業務に適用されるわけではなく、汎用のソフトウェアであるため、アプリケーションとは呼ばれません。 

  今も昔も、コンピュータは2進数値だけを扱える機械です。 2種類の電圧を0と1に対応させて、0と1だけを使って計算します。
 コンピュータが使われ出した頃、つまり1940~1950年代は、入力は2進数値を並べて行い、計算結果の表示も2進数の並びでした。 昔の映画やアニメで、コンピュータが出力した「穴の開いた紙テープ」を読み取る、という場面がありますが、あれは穴の有る無しで0と1を表しているのです。

 でも、いくらコンピュータが計算が速いと言っても、それは、さすがに不便過ぎます。 計算機と名乗るからには、普段使い慣れた10進数で入力したいし、結果も10進数で受け取りたいのが人情です。 キーボードやディスプレイを使った文字の入出力も、有ったほうが良いに決まっています。
 そのような、基本的な入出力をするためのプログラム、これが OS の始まりです。 OS は、コンピュータと人間の「仲立ち」をするために作られたのです。

 当初、このような「仲立ち」をするソフトウェアは BIOSBasic Input/Output System)と呼ばれ、コンピュータ製造各社が独自に作っていました。 製造元が同じであっても機種が違うと BIOS も違う、という事は普通にあり、しかもそれが「新しい BIOS は新機能搭載で使いやすくなります!」という宣伝材料にもなっていました。

 今も BIOS という言葉は使われていますが、現在は「OS よりも更に一段下の、よりハードウェアに近いレベルで動作する、設定用プログラム」を指す言葉になっています。

 

多種多様な OS の時代―黎明期

 最初期は、製造元・機種毎に、様々な OS がありました。 そうなった理由の1つは、もちろんコンピュータそのものが開発途上であった事ですが、もう1つの大きな理由は、新しい周辺機器が次々に開発された、という事です。

 初めの頃、周辺機器は「0と1を入力するスイッチの並びと、点滅するランプの並び」しか無かったのですが、「文字を入力出来るキーボード」、「文字を打ち出せるプリンタ」、「データを記録出来る磁気テープ・磁気ドラム」、「データを通信出来る通信機器」……と、どんどん新しい周辺機器が作られていきました。
 新しいコンピュータ機種が売り出されるたびに、新しい周辺機器、より優れた性能の周辺機器も発売され、利用者はそれを買い求めました。
 当然、OS はそれに対応する必要がありました。 利用者が、新しい周辺機器を使うプログラムをゼロから作らねばならないのでは、新機種をたくさん売る事は出来ないからです。

 まさに百花繚乱の時代でしたが、この頃は、メーカーが違えば OS の互換性が無いどころか使用感も違い、同一メーカー製品であっても旧機種と新機種との間では使い勝手が大きく違う、という事が普通にありました。 全ての OS は、機種毎にバンドルされた、その機種専用のソフトウェアだったからです。

 しかし利用者は、「せめて製造元が同じであれば、今まで使ってきたコンピュータで培った知識を、新しい機種でも使いたい」と望み始めました。
 また、コンピュータが広く世間で使われるにつれて、「A社の機種で使っていたデータやプログラムを、B社の機種でも使いたい」という要望も強くなってきました。

 そのため、文字コードを統一するとか、磁気テープの記録規格を統一するとか、プログラミング言語の規格を統一する、という事が行われ始めたのですが、OS については、どうしたものか、製造元の悩みの種でした。 OS は、その機種専用に作られていたからです。

 

メインフレームの時代―機能の成熟

 利用者の要望を汲むため、製造元は、OS を分割して開発する(モジュール化)という事を考えつきました。
 「機種毎に異なる OS」になってしまう理由は、OS が、その機種のハードウェア構成と密着しているからです。 接続される周辺機器が異なっても、同じ OS が使えるようにするには、「周辺機器用のプログラムを分離」すれば良いでしょう。 バイス・ドライバの出現です。

 「異なる CPU」や「異なるメモリ」をも「周辺機器」と捉えれば、OS は、「OS の基本機能+デバイスドライバ群」という構成にする事が出来ます。 こうすれば、多少違う機種であっても、OS の使用感を統一し、プログラムやデータを使い回す事も出来ます。

 これにより、コンピュータを「シリーズ機種で売る」という販売戦略も生まれました。 デラックスな周辺機器を持つ上位機種も、廉価な下位機種も、OS の基本部分は同じで、デバイスドライバの構成だけが異なる……こうすれば、OS の開発期間・費用も抑えられ、結果として利用者が購入・導入しやすくなります。

 この頃、コンピュータの処理能力が向上したため、1台のコンピュータを複数人数で同時に使いたい、という要求が出てきました。
 当時、コンピュータは、大変高価なものでしたから、CPU(中央処理装置 Central Processing Unit)が「遊んでいる」「空き時間がある」という状況は、利用者にとって許容し難い事でした。

 そのためには、当然ですが、1つのコンピュータで、複数のプログラムが、相互に独立して動作しなければなりません。 これを可能にした2つの重要な技術が、「並行処理」と「時分割処理」です。

並行処理
 CPU の処理は、周辺機器の処理よりも、はるかに高速です。 現在でも、HDD や SSD より CPU の方が桁違いに高速ですし、キーボードや通信回線と CPU とでは、比べものにならないほど処理速度が違います。 もし CPU が周辺機器に「付き合って」、その処理にかかりっきりになってしまうと、CPU の稼働率は著しく低下し、「遊んでしまう」ことになります。
 並行処理とは、プログラムの実行が周辺機器に待たされる段になったら、CPU を他のプログラムの実行に切り替えてしまう、という処理です。 周辺機器の動作が完了すれば、元のプログラムにまた切り戻します。
 これによって、複数のプログラムを、効率良く(=CPU の遊びを少なくして)動かす事が出来ます。

時分割処理
 時分割処理とは、CPU が、たとえば 0.01秒毎に、複数のプログラムを切り替えて実行する動作です。 0.01秒はとても短い時間ですから、「複数を切り替えて実行している」とは言っても、人間の目から見れば「複数を同時に実行している」ように見えます。

割り込み
 並行処理や時分割処理が可能になったのは、CPU に「割り込み」という機能が付いたからです。 並行処理においては、周辺機器からの信号が切り替えの契機になり、時分割処理においては、クロック・タイマーからの信号が切り替えの契機になります。
 こうした「契機となる信号」を受け付け、他のプログラムに切り替えるのが、「割り込み」という機能です。
 人間の世界でも、1つの仕事をしている時に、急に別の仕事が割り込んでくる事はよくあります。 そして割り込み仕事が終わったら、元の仕事に戻るでしょう。 まさにそういう動作を可能にするのが、CPU の「割り込み」機能です。

 「並行処理」と「時分割処理」のおかげで、1960年代後半の大型汎用コンピュータ(メイン・フレーム)は、複数の利用者が、同時に複数のプログラムを実行出来るようになりました。

 また、別の話として、巨大なアプリケーションを多数同時に実行したい、巨大なデータを扱いたい、という要望も出てきました。 コンピュータが様々な用途に使われ出すにつれて、扱う課題も複雑なものとなり、処理するプログラムやデータも複雑で巨大になったからです。
 しかし、当時の半導体はまだまだ高価で、巨躯を擁するメイン・フレームといえども、メモリは64MB(メガ・バイト)がせいぜいといったところでした。
(当時の代表的なメモリ構成は、1ワードが32ビットで、24ビット・アドレスでしたから、全部で16メガ・ワード、すなわち64メガ・バイトでした)

 この限られたメモリに、OS、多数のプログラム、多量のデータを全部入れるのは、どうしても無理がありました。 そこで、「スワップ」と「仮想記憶」という、これまた2つの重要な技術が考え出されました。

スワップ
 いくら巨大なデータであっても、ある時点で CPU が処理すべきなのは、データの一部だけです。 つまり、今処理している部分データだけがメモリに有れば良いわけで、データ全体を律儀にメモリに置き続ける必要はありません。
 そこで、今必要なデータだけを外部記憶装置から取り出し、処理が終わったデータを外部記憶へ書き戻す、という方式が考え出されました。 このような、メモリと外部記憶との間における退避と復帰を OS が行うのが「スワップ」です。 この動作にも、先ほど説明した「割り込み」機能が使われます。

 スワップ用の外部記憶は、磁気テープでも何でも良いのですが、ある程度高速なものでないと非実用的です。 高速にランダムアクセスが出来る磁気ディスク装置の普及は、スワップの実現を容易にしました。
 スワップは OS の機能ですから、巨大データが、いつ、どうやってスワップするか、ユーザーは意識する必要が無く、巨大データが扱えます。

仮想記憶
 プログラムについても似た事が言えて、CPU が今実行しているのはプログラムの一部であり、プログラム全体を、律儀にメモリに置き続ける必要はありません。
 ならばプログラム自体もスワップすれば、大きなプログラムが処理出来る……わけではありません。 なぜ「メモリは16メガワードがせいぜい」だったのか、その理由の1つは、当時主流だった「24ビット・アドレス」でした。
 24ビットで表せるのは0から1677万7215までなので、16メガしか取り扱えません。 もしプログラムの総量が、これを越えるサイズならば、プログラムをスワップしたところで意味がありません。 データは「同じアドレスに別のデータを入れ替える」事も出来ますが、プログラムでそれをやると、プログラム内容が書き換わってしまうからです。

 この問題を解決するには、「限られた24ビット・アドレスで、あたかもそれ以上の大きさのアドレスを扱える」ようにする必要があります。
 このために考え出されたのが「仮想記憶」です(対する言葉に「実記憶」がありますが、これは、実際のメモリを指す言葉です)。

 仮想記憶は、実記憶と外部記憶の間のプログラム・スワップに、アドレス変換機構を組み合わせ、「実行プログラムに対し、あたかも多ビット・アドレスの広大なメモリがあるかのように見せかける」技術です。
 仮想記憶をサポートする OS では、プログラムの実行は仮想記憶の上で為されるので、実行されるプログラム自身は、28ビットあるいは32ビット・アドレスの上で動いているかのように「錯覚」しています。

 仮想記憶は「ページ」という単位でメモリを管理します。 追加メモリが必要になれば、「ページ」をディスク上に作り、実記憶にあるページをディスクに退避させて(ページアウト)、ディスク上のページを実記憶に持ってきます(ページイン)。 そしてこれらのページは、28ビットないし32ビット・アドレスで管理されるという寸法です。

 この仮想記憶という技術は、見方を変えれば、プログラミングする人や利用者が、メモリの上限やプログラムの大きさについて悩まなくても良い、という技術でもあります。
(参考 https://khurata.hatenablog.com/entry/2019/04/04/053833

  こうした近代的な OS 技術を確立し、牽引したのは、IBM 社でした。 これらの機能を持つ IBM のコンピュータがよく売れたため、他の各社も、IBM 製品を真似た機種を売り出しました。
 結果として、各社ともそれぞれ独自の機種・OS を販売しているけれども、磁気テープなどは互換性があり、相互に通信も出来て(オンライン利用)、利用者が作って使うプログラムも、ソースコード・レベルではそれなりの互換性を持つに至りました。

 並行処理と時分割処理で、多数のプログラムを複数のユーザが同時に実行出来て(マルチ・タスクでマルチ・ユーザ)、巨大なプログラムであっても仮想記憶で無頓着に動作し、巨大なデータもスワップで無頓着に扱える……「無頓着に扱える」というのは、使い勝手が良いという事に他なりません。

 かくして、メイン・フレームは、1970年代に1つの成熟に達しました。 OS も、同時に「1つの成熟点に達した」と言えるでしょう。

 

個人利用の歴史―8ビットから 32ビットへ

 PC(パーソナル・コンピュータ)が売られるようになったのは、1970年代の事です。 最初の PC は、とても非力で、ディスプレイも無く、データ保存も出来ず、大きな電卓のようなもので、しかも百万円以上するというシロモノでした。 当然、あまり売れませんでした。
 しかし半導体技術の進歩により、価格が下がり性能が上がって、ワン・チップでコンピュータの機能を持つ「マイクロ・コンピュータ」が作られるようになりました。

 そして、このマイクロ・コンピュータを基盤に搭載した「ワンボード・マイコン」なる商品が出てきました。 1枚の基盤の上に、CPU やメモリが載って、10~20万円そこそこでした(当時の貨幣価値では、かなり高価なものです)。 詳しくない人が見れば、今の PC のマザーボードとあまり違わないように見えるかも知れません。

 その頃、コンピュータと言えば、大企業や研究機関や政府・軍事施設だけが所有し、ビルの地下室を占拠する、非常に大がかりで、得体の知れない神秘的な機械というイメージでしたが、ワンボード・マイコンの出現によって、「コンピュータを個人が所有出来る!」という時代が訪れたのです。 これは革命的な出来事でした。

 とは言っても、当時のワンボード・マイコンは、4ビットないし8ビット CPU に、メモリは1KB(キロ・バイト)とか4KBという極めて貧弱なシステムで、OS のような複雑なプログラムは動かせませんでした。 当時のユーザ達は、自分で周辺機器を手作りして、それを機械語プログラムで動かしていたのです。 あくまで趣味、ホビーとしてのコンピュータの域を出ませんでした。

 その後、技術革新は急速に進み、1970年代も末になると、半導体の価格はますます下がり、8ビット CPU システムに16~64KBという「大容量」メモリを搭載する事が現実的になってきました。 こうなると、「もっと便利に使いたい」という要望が当然出てきます。
 メモリが狭いと、「OS なんかより、使いたいプログラムを入れたい」と思うのは当然(そうしなければ自分の思うようには動かないのですから)でしたが、メモリが広くなって、OS もユーザ・プログラムも載るなら、OS が有った方が便利です。

 かくして、8ビット CPU 用の OS が世に出回ることになります。 最も売れたのは、CP/M という OS でした。 これは、フロッピーディスクから起動する OS で、操作は文字の入出力で行われていました。
 大容量メモリが使えるようになった事で、小規模ビジネス・アプリケーションも、少しずつ販売され始めました。 PC がホビーの域を脱し始め、ごく一部の中小企業には、経理処理に PC を使う所も出てきました。
 また、電話回線を介してメイン・フレームと通信し、PC では手に負えない計算を代行させるホスト・プロセッシングという使い方も出てきました(今で言う「クラウド」の先祖です)。

 更に時代が下ると、16ビット CPU の時代が訪れました。 使えるメモリ量も飛躍的に増え、PC でも640KBとか1MBのメモリが普通になってきました。 PC 用 HDD も低価格・大容量になり、個人が購入し始めた事で、「HDD から OS を起動する」という、現代に通ずるスタイルが確立します。
 16ビット PC OS の市場を制したのは、MS-DOS でした。 他にも CP/M 86XENIX など、色々な PC 用 OS があったのですが、結果的に MS-DOS の1人勝ちになりました。
 この頃、ビジネスで PC を使う事は、もはや当たり前でした。 ワープロ表計算、データベースなど、現在も見られるビジネス・アプリケーションの種類がほぼ出揃いました。

 しかし MS-DOS は、当時すでに成熟していたメイン・フレーム用 OS とは比べものにならない貧弱な OS でした。 その最大の要因は、16ビット CPU の機能が貧弱だった事です。
 並行処理はそこそこ実用されていたものの、メイン・フレーム CPU が持つ多彩な割り込み、それらによって成立する時分割処理、仮想記憶などが、16ビット CPU では充分に実現出来ませんでした。
 そのため、この頃の PC 用 OS は、シングル・タスク(同時に1つのプログラムのみ実行)でシングル・ユーザ(同時に1人の利用者だけ)が当たり前でした。

 ところが技術革新は更に進み、1980年代なかばには、本格的な32ビット CPU が、個人でも買える価格で発売されました。 ワン・チップの小ささで、価格は数万円ですが、機能的にはかつてのメイン・フレームにほぼ比肩し得るものです。
 そのおかげで時分割処理や仮想記憶が実用になり、それらを使った OS も可能になりました。 現在、WindowsLinuxMacOS などが使えるのは、32ビット CPU が安くなった結果なのです。

 

API―OS の機能を隠蔽しつつ提供する

 OS が便利な機能を満載していても、それをプログラムから使えないのでは意味がありません。 しかし、OS の機能を好き勝手に使われても困ります。
 たとえば、プログラムAがマウスを使っている時に、プログラムBが「勝手に」マウスを使ったりしたら、プログラムAは正しい実行が出来ないでしょう。
 つまり、OS の機能は、「OS 自身が管理」しつつも、「各プログラムに開放」しなければなりません。

 この、一見矛盾する事を実現するのが、APIApplication Programming Interface)という仕組みです。
API は、UNIXMS-DOS では「システムコール」、Windows では「Win32API」等の名前で呼ばれています)

 API は、機能を動かすための「入り口」です。 API は、OS の持つ様々な機能、たとえばキーボードからの文字を受け取るとか、ファイルを削除するとか、文字を表示するなど、機能の数だけ、たくさん用意されています。

 たとえば、あるプログラムがファイルを新規作成したい場合、そのプログラムは「ファイルを HDD のどこに記録すべきか」「HDD はどういう状況か」「同じファイル名がぶつからないか」……といった事を知る必要は無く、ただ「ファイルを新規作成する API」を呼び出せば済みます。 面倒な事は全て、OS が「API の向こう側」で処理してくれます。

 別のプログラムが、たまたま同名のファイルを作成しようとしたら、やはり同じ API を呼ぶのですが、「API の向こう側」で、OS が「これはぶつかる処理だ」と判断してくれるので、後から API を呼び出したプログラムには、エラーが返されます。

 こうして、OS の機能を、全ての「OS 上で動くプログラム」から、統一的に、衝突せずに、使う事が出来るのです。

 ワードやエクセル等のアプリケーションは、API を呼び出す事によって、ファイルの読み書きや画面の表示といった OS の機能を使います。 プログラム開発者は、自分でキーボード入力や通信、ファイル処理のためのプログラムを作らなくても、API を呼び出せば良いので、手早く開発が出来るのです。

 

シェル―OS の「見た目」

 OS を人間が使うためには、文字や音声、画像など、なんらかの手段で、「OS とユーザーの対話処理」を行う必要があります。 これを担うプログラムを「シェル shell」と呼びます。
 Windows ならエクスプローラコマンドプロンプトLinux なら bashcsh などがシェルです。

 シェルは人間の指示を OS 本体に伝え、また、OS 本体の処理結果を、人間に分かる形で表現します。 シェルは「貝殻」という意味ですが、OS 本体の事は「殻の中身」になぞらえて、カーネル kernel とも言います。

 図式としては、「人間←→OS(シェル←APIカーネル)←→コンピュータ」、という感じです。

 OS の使用感と見た目は、シェルの出来に大きく左右されます。
 Windows の場合、エクスプローラGUI シェル)とコマンドプロンプトCUI シェル)の2つのシェルが用意されています(自作している人もいます)。
 Linux では、いくつか有名なシェルがあり、自由に選択出来ます。 ただし、自由である分、迷う事も有ります。

 

おわりに

 かなりの駆け足説明でしたが(汗)、まとめると、近代的な OS は、少なくとも以下の特徴を備えていると言えます。

1)デバイスドライバが OS 本体と分離され、様々な機器・構成に対応できる。
2)並行処理により、CPU 時間を周辺機器動作とプログラム実行へ、効率的に割り振れる。
3)時分割処理により、マルチユーザとマルチタスクを実現する。
4)スワップにより、巨大なデータ、ファイルが扱える。
5)仮想記憶により、実記憶容量に関わらず広大なメモリ空間を提供する。
6)API により、OS の機能を使ったプログラムの実行・開発がやりやすい。
7)シェルにより、人間にとって使いやすくなっている。

 これらの特徴は、全て「コンピュータをより使いやすくする」目的で実現されています。 もし OS が無かったら、いかに高性能なコンピュータであっても、とても使いこなせないでしょう。 むしろ、高性能で多機能だからこそ、それを使いこなすためには OS が必要なのです。
(転載以上)


コメント(1)
OS の歴史について語る上で、ミニコンの話は外せないのだが、「Yahoo!知恵ノート」の字数制約では書けなかった。
特に、個人利用の PC 用 OS の成立に関して、ミニコン OS が色濃く影響している事は、なんとか書き込みたかった。

[ khurata ]
2019/2/24(日) 午後 6:25