システムコール
ユーザー空間のプログラムが OS カーネルの機能を呼び出すインターフェース
OS低レベル
システムコールとは
システムコール (System Call, syscall) は、ユーザー空間のプログラムが OS カーネルの機能 (ファイル操作、ネットワーク、プロセス管理) を呼び出すインターフェースである。アプリケーションはハードウェアに直接アクセスできず、カーネルを経由する。
ユーザー空間とカーネル空間
ユーザー空間 (アプリケーション)
Node.js, Python, Go ...
↓ システムコール
カーネル空間 (OS)
ファイルシステム, ネットワーク, メモリ管理
↓
ハードウェア
CPU, メモリ, ディスク, NIC
主要なシステムコール
| カテゴリ | syscall | 説明 |
|---|---|---|
| ファイル | open, read, write, close |
ファイル操作 |
| プロセス | fork, exec, wait, exit |
プロセス管理 |
| ネットワーク | socket, bind, listen, accept |
ソケット操作 |
| メモリ | mmap, brk |
メモリ割り当て |
Node.js とシステムコール
import { readFile } from 'fs/promises';
// readFile() → libuv → read() syscall → カーネル → ディスク
const data = await readFile('/etc/hosts', 'utf-8');
// fetch() → libuv → socket() + connect() + write() + read() syscall
const res = await fetch('https://api.example.com');
Node.js の fs, net, http モジュールは内部的にシステムコールを呼び出している。libuv がシステムコールを非同期に実行し、イベントループに結果を返す。
strace でシステムコールを観察
# Node.js のシステムコールを表示
strace -f node -e "require('fs').readFileSync('/etc/hosts')"
# openat(AT_FDCWD, "/etc/hosts", O_RDONLY) = 3
# read(3, "127.0.0.1 localhost\n...", 8192) = 234
# close(3) = 0
コンテナとシステムコール
コンテナはホスト OS のカーネルを共有するため、コンテナ内のプロセスもホストのシステムコールを使う。seccomp でコンテナが使えるシステムコールを制限し、セキュリティを強化する。
// seccomp プロファイル: 危険な syscall をブロック
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{ "names": ["reboot", "mount"], "action": "SCMP_ACT_ERRNO" }
]
}
Lambda とシステムコール
Lambda の実行環境 (Firecracker microVM) は、使用可能なシステムコールが制限されている。/tmp への書き込み (512 MB) は可能だが、ネットワークインターフェースの直接操作はできない。
パフォーマンスへの影響
システムコールはユーザー空間 → カーネル空間のコンテキストスイッチを伴うため、コストがある。io_uring (Linux 5.1+) はシステムコールの回数を削減し、I/O パフォーマンスを向上させる。
より深く学ぶには関連書籍が役立つ。