標準関数とシステム関数

このエントリーをはてなブックマークに追加

ここでは標準関数とシステム関数の違い、そして、システム関数とOSとの関わりを解説していきます。

標準関数とシステム関数の違い

C言語における、標準関数とシステム関数の違いについて説明していきます。
内容的には難しい事ではありませんが、違いをきちんと認識して次で説明するOSとの関わりにつながる大切な知識です。

標準関数とは

標準関数とはC言語の規格で定義されている関数で、例えば、memcpy(3)やmalloc(3)等です。
これらは非常に特定の環境下以外では使えて当たり前の関数と考えて問題ありません。
これらは通常コンパイラ側がライブラリとして提供しています。

システム関数とは

システムコール(system call)ともよばれ、標準関数とは異なりOS側が提供する機能です。
当然OSによって、提供される機能はことなります。とはいえUnixではPOSIXなどの規格により統一されていますので 、特殊な事をしない限りは、Linuxで作ったプログラムはBSDなどでも動作するはずです。
標準関数はこのシステム関数を使用して作られています。memcpy(3)などシステム関数を使わない関数ももちろんあります。
ここで気をつけて欲しいのはOS側から提供されるということは、システム関数を呼ぶと一旦制御はOS側に移動します。当然、OS側に制御が移動するのでその分時間的なロスが発生します。当然無駄なプログラムは処理時間が多くかかります。
このあたりは次で詳しく解説します。

システム関数が呼ばれた時のOSの動作

システム関数(システムコール)はOSの機能で、システム関数を呼ぶとOSに制御が移動すると説明しましたが、普段は意識しないので解説をします。
まず、LinuxはKernel(狭義のOS)とユーザランド(ユーザの作業場所)で完全に分かれています。分かれているというのはメモリが分かれているので特殊な事をしないとお互いにアクセスは出来ないという意味です。
しかしながら、システム関数はKernelの機能です。つまり処理自体はKernel内部で動作します。
Kernelとユーザランドの間では特別な方法を使いデータを渡す事ができます。
つまり、プログラム→sシステム関数→Kernelが処理を行う→必要なデータをユーザランドへ渡す→プログラムがデータを受け取る、という流れになります。
ユーザランドから、Kernelへの切り替え、データの受け渡し、これらは非常に重い動作です。
システム関数を使用する場合はこの事を常に意識してください。無駄な処理はシステム全体の動作に悪影響を与える可能性があります。