コンテンツにスキップ

The M:N Concurrent Model — A Complete Guide. From First Principles to Production Schedulers

チェック

  • [ ] 本文を確認した
  • [ ] 概要を確認した
  • [ ] タグを確認した
  • [ ] inbox/ 直下へ移行した

概要

M:N 並行モデルを、N:1 グリーンスレッド、1:1 ネイティブスレッドとの比較から、実際のランタイムスケジューラ設計まで広く説明する長文記事。 Go の goroutine、Rust/Tokio、Erlang/BEAM、Java Project Loom など、軽量並行実行単位を OS スレッドへ多重化する実装の背景を学べる。 実装面では、ユーザー空間コンテキストスイッチ、スタック管理、ローカル run queue、work stealing、I/O イベントループ、観測性、性能チューニングまで扱っている。 Go ランタイムや async runtime の仕組みを理解するための索引として使える。

本文

記事はまず、スレッディングモデルを 3 つに分ける。 N:1 は多数のユーザースレッドを 1 つのカーネルスレッドに載せるモデル。 コンテキストスイッチは安いが、ブロッキング syscall が全体を止め、マルチコア並列性を使えない。 1:1 はユーザースレッド 1 つをカーネルスレッド 1 つに対応させるモデル。 OS のプリエンプションと真の並列性を得られるが、スレッド作成、スタック、カーネルスケジューラのコストが高く、大量接続ではスケールしづらい。

M:N は、多数のユーザー空間スレッド、タスク、goroutine、fiber を、CPU コア数程度のカーネルスレッドに多重化する。 N 側はハードウェア並列性に合わせ、M 側は論理的な並行性に合わせる。 グリーンスレッドが I/O や mutex で待つとき、ランタイムがそれを park し、カーネルスレッドは別の実行単位を走らせる。 これにより、大量の論理スレッド、安い作成コスト、非同期 I/O の透過的な利用を狙える。

用語整理も重要。 green thread はユーザー空間でスケジュールされる実行単位。 fiber は協調的に yield する green thread。 goroutine は Go の M:N スケジュールされる軽量実行単位。 coroutine は中断・再開可能な関数機構であり、green thread そのものとは少しレイヤーが違う。 async/await runtime の task は、コンパイルされた状態機械を executor が poll する単位。 Java の virtual thread は carrier thread 上に mount される M:N 実行単位として説明される。

実装の要素として、グリーンスレッドには再開位置、スタックポインタ、レジスタ、状態、run queue 連結、待機先、タイマー、worker の locality hint などの状態が必要になる。 スタック管理では、固定長スタック、segmented stack、Go 1.4 以降の copying/growing stack、stack pool のトレードオフが扱われる。 run queue は単一グローバルキューだと単純だが競合しやすいため、プロダクションでは worker ごとのローカルキューと work stealing が重要になる。

記事全体は、M:N が魔法の高速化ではなく、ランタイムの複雑さを引き受けて、アプリケーション側に大量並行性を扱いやすく見せる設計であることを示している。 FFI でのブロッキング、シグナル、デバッグ、プロファイリング、デッドロック検出、I/O 統合など、実運用の難しさもセットで理解する必要がある。

要点

  • M:N は、論理的な大量並行性を少数の OS スレッドに多重化するモデル。
  • N:1 は軽いがブロッキングと並列性に弱く、1:1 は単純だが大量スレッドで重い。
  • Go の goroutine、Java virtual thread、Erlang process、Tokio task は似た問題領域を異なる抽象で解く。
  • 実用ランタイムでは、ローカル run queue、work stealing、stack growth、I/O event loop との統合が重要になる。
  • M:N はアプリケーションに扱いやすさを提供する代わりに、ランタイム実装と観測性を複雑にする。

タグ

concurrency #scheduler #linux #go #rust #runtime #systems-programming