OSを基礎から丁寧に (2)OSの役割
第二週目
今週はOSのプログラミングインターフェースについてです。
OSは応用プログラムに対して、ファイルや入出力装置を利用する機能など、種々の機能を提供していますが、この応用プログラム向けの機能について説明します。
シリーズの構成
大学のOSの講義で推奨されていた本を参考に章立てしていきます。
- OSの役割
- OSのプログラミングインターフェース ←本記事!
- OSの構成
- ファイルの管理
- プロセスとその管理
- 多重プロセス
- メモリの管理
- 仮想メモリと仮想化
- ネットワークの制御
- セキュリティと信頼性
- OSと性能
OSのプログラミングインターフェース概要
プログラミングインターフェースといえば、よくAPIと言われるものがありますが、これはアプリケーションプログラミングインターフェースの略称です。
これのOSバージョンなので、周辺機器等のハードウェア呼び出しと応用プログラムの橋渡し的な役割を持っていると言っても良いでしょう。
この図のように、アプリケーションからの呼び出しに対して、 例えば入出力の呼び出しがあった場合に、動作をコントロールする命令を出すための入口的な役割を果たします。
また、プログラミングインターフェースは応用プログラム向けであることを強調してAPIと呼ばれることもあります。
プログラミングインターフェースの実現方法
ここからは若干細かい話になります。
複数人で利用することが前提のOSでは、本体が応用プログラムからは隔離されています。
OSの本体はカーネルなどと呼ばれることがありますが、このカーネルが誤って応用プログラムによって破壊されたりしないように、ハードウェア的に別の実行モードで動いています。
- 応用プログラム:ユーザー権限
- カーネル:root権限
なので、ユーザー権限でroot権限のカーネルを呼び出す(カーネル呼び出命令)ことになるわけですが、
内部では、プロセッサの割り込み処理が行われています。
下の図が大雑把なイメージです。
OS側から見れば、OSの機能の本体はカーネルの中で実現されていて、 応用プログラムが直接呼び出すAPIルーチンは、必要な準備をした後カーネル呼び出命令を実行する。
という繋ぎ目の役割を果たしているに過ぎません。
システムコール
UNIXのプログラミングインターフェースでは、ここのOSの機能のことをシステムコールと呼ぶ。
システムを呼び出して処理をイライする、という意味で使われる。
具体的なOS API
これまではOS APIが何をするのかを確認してきた。では実際にどのようなインターフェースがあるのか。
1. C言語企画の標準ライブラリに含まれるOS機能
C言語の標準ライブラリには、OS関係の機能も含まれている。具体的な関数を一部列挙すると
- ファイル操作
- fopen()
- close()
- remove()
- rename()
- 書式付き入出力
- fprint(), printf()
- fscanf(), scanf()
- 文字列入出力関数
- getchar(), fgetc(), gets()
- fgets(), putchar(), fputc(), puts(), fputs()
- 直接入出力関数
- fread()
- fwrite
- ユーティリティ関数
- malloc()
- free()
- exit()
- abort()
- 日付と時刻
- clock()
- time()
などである。Cを書く人なら一度は使ったことあるこれらは、元々はUNIXの機能の一部として提供されていたものであり、言語企画の一部でもあるが、OS APIとしてみることもできる。
2. UNIXシステムインターフェース
UNIXのAPIは、次の形で提供される。
- システムコール関数
- その他のライブラリ関数
具体的には
- 入出力
- open()
- read()
- write()
- close()
- ディレクトリ操作
- mkdir()
- rmdir()
- パイプ
- pipe()
- ファイル保護
- chmod()
これらのシステムコールは、呼ばれるたびにカーネル呼び出しの内部割り込み処理が発生して、本来の処理はカーネルで行われる。
3. WindowsのAPI
Microsoft社は、Windows用のAPIとしてWIndows APIを定めている。
私はWIndowsユーザーではないのでこの部分は割愛する。