第38回
プログラミングの周辺事項(1)~Cで書いたプログラムの仕組みと構造

OSとプログラム

今では、OSがコンピュータのすべてを管理し、一般的なアプリケーションはOSの管理下で動作します。その構造をざっと覗いておきましょう。

遠くなる言語とCPUの関係

昔は、コンピュータとプログラムの関係はシンプルなものでした。しかし、OS――オペレーティングシステムが登場し、さらにそれがGUIを搭載し、統合開発環境が現れ、コンポーネント・プログラミングが一般化し、OSに代わってWebがプラットフォーム(実行環境)となり……と、プログラムが動作する環境はめまぐるしく進化・変遷し、それに合わせてプログラミングの環境も手法も大きく変わってきました。

プログラミングという行為自体はどんどん楽になってきていますが、逆にプログラムとCPUの関係――という原初的な構造は見通しにくく、どんどん複雑になっています。しかし、根本のところは初期の頃から少しも変わっていません。二重三重の構造が、基本のところを見えなくしているだけです。

Cの初歩的な解説をひととおり終えたところで、Cで書いたプログラムが動作する仕組みを再確認しておきましょう。

OSの起動

現在では、プログラムはディスクなどの外部記憶装置に記録されているのが普通です。実行されるときには外部記憶装置からメモリ(主記憶)に読み込まれ、その特定のアドレスに存在する命令をCPUが読み取って処理が始まります ※1

OSもまたプログラムであり、コンピュータが起動したとき真っ先にメモリに読み込まれて実行されるプログラムです ※2 。OSが実行されると必要なプログラム群を読み込んで初期化を行い ※3 、最後にシェル・プログラム(以下「シェル」と略)をメモリに読み込んで実行します。シェルはユーザーとOSとの橋渡しをするプログラムで、これ以降はシェルを介してユーザーの指定したプログラムが実行されることになります。

記憶装置に記録されている段階では「実行形式ファイル」、メモリに読み込まれて実行されている状態では「プロセス」あるいは「タスク」と呼ばれます
OSは一般的にハードディスクに記録されていますが、初期のパソコンではフロッピーディスクから起動するものが多くありました。現在ではCDやDVD、USBメモリなどからも起動できます
最初に実行されるのはOSの中枢であるカーネルと呼ばれる部分で、その後、周辺機器を制御するためのデバイスドライバや、アプリケーションが必要とするライブラリなどが読み込まれます
図1:OSが起動してシェル・プログラムを実行する
図1:OSが起動してシェル・プログラムを実行する

すべてOSが管理している

メモリに読み込まれてOSが実行するプログラムを「プロセス(process)」と言い、OSはファイル、メモリ、プロセスを管理します ※4 。最初に読み込まれて実行されるOSはCPUが直接命令を読み取って実行しますが、OSが実行された後はプログラムに記述された命令をOSが読み取り、それをOSがCPUに対する命令として実行することになります。つまり、プログラムとCPUの間にOSが介在するということです。

プログラムはCPUに対して直接命令を送るのではなく、OSの用意した機能を利用して処理を実行します。プログラムがデータのためにメモリを必要とした場合も、OSがその要求を受け取ってメモリを確保し、確保したメモリのアドレスをプログラムに対して知らせます。

このようにすることで、バグなどによってプログラムが不正な動きをした場合も、システム全体がその影響を被らないようになっています。

OSもまた1つのプログラムであり、最初にOSが起動してコンピュータ全体を仕切り、それ以降はすべてのプログラムがOSの制御下に置かれる――ということになります。

メモリに読み込まれているかどうかに関わらず、OSが実行するプログラムの単位をタスク(task)と呼びます。マルチタスクの「タスク」です。それをOSがメモリに読み込んで実行すると「プロセス」となります