2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スレッドとアセンブリ:コンテキストスイッチの作法

Posted at

"切り替えられるものは、保持されなければならない。保持できるものだけが、連続性を名乗れる。"

モダンなプログラミングにおいて、「スレッド」は不可避の概念である。
だが、std::threadpthread_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

それは、単に「別の処理に切り替える」のではなく、
ある人格を一時停止し、別の人格に“憑依”する行為に近い。


スレッドスイッチの最低要件

スレッド切り替えに必要な情報セット:

  1. RIP(命令ポインタ)
  2. RSP(スタックポインタ)
  3. 汎用レジスタ(RAX〜R15)
  4. フラグレジスタ(RFLAGS)
  5. 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上で動作するすべてのプロセスの“魂の交代劇”**である。


結語:切り替え可能であるとは、存在可能であるということ

スレッドは実行単位ではない。
それは、保存可能な意志の塊である。

そして、
その意志を切り替える設計とは、
有限性を認識した者だけが手にできる、構造の芸術である。

"スレッドの切り替えは、世界の再構築である。保存されることで、私たちは再び動き出すことができる。"

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?