システムコール

ユーザー空間のプログラムが 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 パフォーマンスを向上させる。

より深く学ぶには関連書籍が役立つ。

関連用語