システムコールって何?プログラムからOSを呼ぶってどういうこと?
例えばPythonで「ファイルを読む」コードを書いたとき、Pythonが直接ハードウェアのディスクを操作するわけじゃないんだ。OSの「ファイルを読んでくれ」という機能(システムコール)を呼んで、OSにやってもらうんだよ。
なんで直接ハードウェアを操作しちゃダメなの?
複数のアプリが好き勝手にハードウェアを操作したらカオスになるから、OSが管理してるんだ。OSというゲートキーパーを通すことで、権限チェックやリソース管理ができる。
ユーザーモードとカーネルモードって何?
CPUの動作モードで、ユーザーモードは「制限ありの安全な状態」でアプリが動く場所。カーネルモードは「何でもできる特権モード」でOSが動く場所。システムコールを呼ぶと、ユーザーモードからカーネルモードへ切り替わって処理が行われ、終わったら戻ってくる。
システムコールって遅いの?
モード切り替えが必要なのでオーバーヘッドはあるんだけど、最近は「vDSO(仮想動的共有オブジェクト)」という仕組みがあって、時刻取得のような一部のシステムコールはカーネルモードへの切り替えなしに実行できるようになってる。gettimeofdayがvDSOで高速化されてることが多い。逆に言えば、プログラムが想定外に遅いとき「過剰なシステムコール」が原因のことがあって、straceで調べると思わぬ犯人が見つかることがあるんだよ。