システムコール

ユーザー空間のプログラムが 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 とシステムコール

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 でシステムコールを観察

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 パフォーマンスを向上させる。

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

この記事は役に立ちましたか?

関連用語

関連する記事