システムコール
ユーザー空間のプログラムが 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 パフォーマンスを向上させる。
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
プロセスとスレッドの違いとは - メモリ空間・生成コスト・通信方法を比較
プロセスとスレッドの違いをメモリ空間・生成コスト・通信方法の 3 軸で比較。マルチスレッドの注意点と Go/Rust の並行処理モデルとの関係も図解で解説
Namespace と cgroup
Linux コンテナの基盤技術で、プロセスの隔離とリソース制限を実現するカーネル機能
コンテナ
アプリケーションとその依存関係をパッケージ化し、環境に依存しない一貫した実行環境を提供する仮想化技術
腐敗防止層
レガシーシステムと新システムの間に変換層を設け、新システムの設計を汚染から守るパターン
SpringBoot
Java の定番フレームワーク Spring を、設定を簡素化して手早く使えるようにした基盤
Strangler Fig パターン
レガシーシステムを段階的に新システムへ移行する設計パターン
関連する記事
OS・低レイヤー本ガイド - コンピュータの仕組みを学ぶ技術書の選び方
OS、コンパイラ、ネットワークなど低レイヤーを学べる技術書の 4 ジャンルと、どこから始めるべきかの指針、賞味期限の見極め方を紹介します。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。
設計・アーキテクチャ本ガイド - 設計力を上げる技術書の選び方
ソフトウェア設計を学べる技術書をコード・モジュール・システムの 3 レイヤーに分類し、レベルに応じた読む順番の指針を紹介します。