"切り替えられるものは、保持されなければならない。保持できるものだけが、連続性を名乗れる。"
モダンなプログラミングにおいて、「スレッド」は不可避の概念である。
だが、std::thread
や pthread_create()
の背後で、
実際に何が行われているかを知る者はどれだけいるだろうか。
スレッドの本質とは、**「流れの切断と保存」**にある。
そしてその技術的核心が、**コンテキストスイッチ(Context Switch)**である。
この章では、アセンブリレベルでのスレッド切り替え、
つまり世界を一時停止し、もう一つの世界を再生するその具体的な技法と哲学を掘り下げる。
スレッドとは何か?(再定義)
通常の説明:
- 軽量なプロセス
- 並行して動作する実行単位
- 同じアドレス空間を共有
アセンブリの視点では、それはこうなる:
「独立したレジスタセットとスタックを持ち、切り替え可能な命令列の断片」
スレッドとは、一時停止可能な状態の集合である。
- レジスタ(RAX〜R15, RIP, RSP, RFLAGS)
- スタックポインタとベースポインタ
- スレッドローカルストレージ
- 一部のセグメント(例:FS)
つまり、“スレッドの本体”とは、CPUの状態そのものである。
コンテキストスイッチとは何か?
コンテキストスイッチとは:
- 現在のスレッドの状態(コンテキスト)を保存し
- 次のスレッドの保存済み状態を復元する操作である。
この操作が成り立つためには、状態の完全な捕捉と再生が必要となる。
; 疑似コード
save_context:
push rax
push rbx
push rcx
...
mov [current_rsp], rsp
load_context:
mov rsp, [next_rsp]
pop ...
ret
それは、単に「別の処理に切り替える」のではなく、
ある人格を一時停止し、別の人格に“憑依”する行為に近い。
スレッドスイッチの最低要件
スレッド切り替えに必要な情報セット:
- RIP(命令ポインタ)
- RSP(スタックポインタ)
- 汎用レジスタ(RAX〜R15)
- フラグレジスタ(RFLAGS)
- FPUレジスタ/SSEレジスタ(必要に応じて)
これらすべてを“透明に”保存・復元できなければ、
スレッドの「人格連続性」は失われる。
実装例:簡易スレッド切り替え(アセンブリ)
; スレッド構造体(スタック上)
; [0] - RIP(復帰位置)
; [8] - RSP(スタックポインタ)
; [16..] - その他レジスタ
; スレッドA → スレッドBへのスイッチ
switch_context:
; 保存(current)
mov [rax], rsp ; Save stack pointer
mov [rax + 8], rbx ; Save RBX
mov [rax + 16], r12 ; etc...
; 読み込み(next)
mov rsp, [rbx] ; Restore stack pointer
mov rbx, [rbx + 8]
mov r12, [rbx + 16]
...
ret
この「ret」によって、新しいスレッドの命令列が動き出す。
つまり、世界が切り替わる瞬間である。
スタック設計の哲学:中断とは信頼の構造
スタックは「ただの退避場所」ではない。
- 呼び出し履歴
- 局所変数
- コンテキストの一時記憶
これらすべてが、スレッドという存在の“記憶”を司る。
コンテキストスイッチは、その記憶を**「箱詰めし、棚に戻す」**行為である。
スレッド設計者は、
**「未来に自分が再び目覚める」**ことを信じて、記憶を丁寧に並べておく必要がある。
マルチタスクの構造的美
スレッド切り替えの設計は、単に機能を成立させるものではない。
- CPUという有限資源の可変的利用モデル
- 制御の分散と合流
- 意識の部分化と連続性
このすべてを、アセンブリのレベルで支える。
つまり、それは計算構造の純粋な組曲である。
実際のOSでは何が行われているか?
Linuxの例:
- カーネルは各プロセスに
task_struct
を持つ - スイッチ時に
switch_to()
マクロが__switch_to_asm()
を呼び、 - レジスタの保存/復元をアセンブリで実装している
このスイッチ処理は、
**CPU上で動作するすべてのプロセスの“魂の交代劇”**である。
結語:切り替え可能であるとは、存在可能であるということ
スレッドは実行単位ではない。
それは、保存可能な意志の塊である。
そして、
その意志を切り替える設計とは、
有限性を認識した者だけが手にできる、構造の芸術である。
"スレッドの切り替えは、世界の再構築である。保存されることで、私たちは再び動き出すことができる。"