システムコールについてどれくらいご存じですか?:知ってトクするシステムコール(1)(1/2 ページ)
「システムコール」と聞いて、どういう印象を受けますか? 「難しくて、自分では手に負えない」とか「使う必要を感じない」という方は多いでしょう。しかし、コンピュータを使う人ならどんな人でも、システムコールについて知っておくといろいろトクをするんですよ。(編集部)
システムコール? 聞いたことはあるけど……
企業情報システムや、Webアプリケーション、携帯機器向けアプリケーション、あるいはちょっとしたツールの作成など、なんらかの形でソフトウェア開発に携わったことのある方なら、一度は、「システムコール」という言葉を耳にしたことがあるはずだ。しかし、先に挙げたような分野のアプリケーション開発現場で、明示的にシステムコールを利用する開発者は多くない。
システムコールは、低レベルのプログラミングやカーネルと密接な連携が必要となる場面で使う。例えば、ハードウェアを直接操作するとき、カーネルの提供する機能をフルに利用したいとき、あるいは処理速度を限界まで上げなければならないときといった特別な場面でなければ、システムコールを直接利用することはあまりない。開発者の中には、システムコールを直接使ったことが一度もないという方もいるだろう。
現在、人気を集めている言語について、それぞれ使用する場面を考えてみよう。企業情報システムの開発ならJavaやC#を使うことが多いだろう。Webアプリケーションの開発ならPHPやJavaScript、Python、Rubyのどれかを使うだろう。iPhoneやiPad向けのネイティブアプリ開発であればObjective-CかLuaだろう。UNIXシステムの運用ならシェルやシェルスクリプト、各種コマンドを使うだろうし、Windowsの管理であればPowerShellを使うだろう。
ここで挙げたプログラミング言語やツールは、扱いやすいライブラリや機能を提供しており、システムコールを直接利用する必要がない作りになっている。システムコールを直接呼び出しやすいC言語でツールやソフトウェア、ライブラリを作るときも、基本となるライブラリやサードパーティ製のライブラリを使うものだ。好んでシステムコールを使うことはあまりないだろう。しかし実際には、どこかの段階で、何らかのAPI(Application Programming Interface)を経由して、コードの中でシステムコールを利用している。
これは、開発者に限らず企業情報システムの運用や、業務システムの管理、サーバの運用などを担当しているオペレータにとっても同じだ。オペレータがシステムコールを意識することはまずない。しかし、小さいコマンドを1つ実行するときも、Webブラウザを動かすときも、管理アプリケーションを操作するときも、何らかタイミングでシステムコールを利用している。
普段のプログラミングで「システムコール」を使うことがないため、システムコールというものはなにか高尚なものというイメージを抱いている方はいないだろうか。ほかにも、システムの下層で動作する不思議なもの、アプリケーションからは触っていはいけないもの、低レベルでかつ難しすぎて自分には扱えないもの、実はすごい高速化が期待できる魔法のAPIなどなど、人によってシステムコールについて抱いているイメージは実にさまざまかもしれない。
本連載では、実際にシステムコールを使用する簡単なサンプルプログラムを作ってみることで、システムコールがどういったものであるかを体験することを目標としている。システムコールを使ってみることで得た経験を、より上級な技術を習得することを目指しているプログラマの糧となればと思う。また、「近寄りにくいもの」というシステムコールに付いて回るイメージを払拭したいとも考えている。説明にはC言語を使うが、C言語を使ったことがない開発者でも問題がないように、環境のセットアップから順番に説明していくので安心してほしい。
システムコールをちょっと体験
環境のセットアップを始める前に、シェルで簡単なコマンドを実行して、どのようなシステムコールが呼ばれているかを見てみよう。次のコマンドは、引数として与えた文字列を標準出力に出力するものだ。いわゆるHello Worldのようなコードであり、プログラミング言語の初学者が最初に作成する類のものである。コマンドを実行しているだけなのでプログラミングとはちょっと違うが、似たようなものと考えていただきたい。
# /bin/echo hello hello #
このコマンド実行するときに、システムコールが呼ばれる回数を表示させてみると、12種類のシステムコールが合計で30回呼ばれていることが分かる。FreeBSD 9で実行した結果だ。ここでは調査するコマンドとしてtruss(1)を使っているが、OSが変わると違うコマンドで調べることになることもある。なお、この手のデータ収集に関しては、DTraceの持つ機能が最も優れている。ユーザーランドDTraceを利用できる環境ならDTraceを利用できる。
# truss -S -c /bin/echo hello hello syscall seconds calls errors readlink 0.000429664 1 1 lseek 0.000171251 1 0 mmap 0.003209627 7 0 mprotect 0.000157003 1 0 open 0.000940342 3 1 close 0.000433854 2 0 fstat 0.000649803 1 0 break 0.000197232 1 0 access 0.000201422 1 0 sigprocmask 0.006510885 8 0 munmap 0.002529093 2 0 read 0.029569680 2 0 ------------- ------- ------- 0.044999856 30 2 #
大まかにソースコード実装の観点から言えば、ここで実行したコマンドはprintf(3)を呼び出すコードに近い。C言語のプログラミングでは、入門段階で作成する簡単なコードだが、このような単純に見えるコードでも多くのシステムコールが実行されていることが分かるだろう。
Copyright © ITmedia, Inc. All Rights Reserved.