Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
Search
Satoru Takeuchi
PRO
April 13, 2025
Technology
2
180
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
以下動画のテキストです
https://youtu.be/3FzWDsJlB-8
Satoru Takeuchi
PRO
April 13, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
ファイルシステムへのアクセス方法
sat
PRO
0
19
ファイルシステム
sat
PRO
1
21
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
6.1k
ポーリングと割り込み
sat
PRO
1
76
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
140
会社員しながら本を書いてきた知見の共有
sat
PRO
3
870
デバイスにアクセスするデバイスファイル
sat
PRO
1
58
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
46
デバイスドライバ
sat
PRO
0
77
Other Decks in Technology
See All in Technology
JOAI発表資料 @ 関東kaggler会
joai_committee
1
250
Go で言うところのアレは TypeScript で言うとコレ / Kyoto.なんか #7
susisu
5
1.2k
ZOZOTOWNフロントエンドにおけるディレクトリの分割戦略
zozotech
PRO
16
5.2k
会社にデータエンジニアがいることでできるようになること
10xinc
9
1.5k
新卒(ほぼ)専業Kagglerという選択肢
nocchi1
1
2k
KiroでGameDay開催してみよう(準備編)
yuuuuuuu168
1
120
実践アプリケーション設計 ①データモデルとドメインモデル
recruitengineers
PRO
2
190
MySQL HeatWave:サービス概要のご紹介
oracle4engineer
PRO
4
1.7k
DeNA での思い出 / Memories at DeNA
orgachem
PRO
3
1.5k
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual Localization
takmin
0
430
帳票Vibe Coding
terurou
0
140
実践アプリケーション設計 ③ドメイン駆動設計
recruitengineers
PRO
1
140
Featured
See All Featured
Embracing the Ebb and Flow
colly
87
4.8k
Music & Morning Musume
bryan
46
6.7k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Into the Great Unknown - MozCon
thekraken
40
2k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Agile that works and the tools we love
rasmusluckow
329
21k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Writing Fast Ruby
sferik
628
62k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
How STYLIGHT went responsive
nonsquared
100
5.7k
A better future with KSS
kneath
239
17k
Transcript
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~ Apr. 13rd, 2025 Satoru Takeuchi X: satoru_takeuchi 1
はじめに • マルチスレッドを実現する方法は複数ある • 基本となるのは以下2つ ◦ カーネルスレッド: カーネル空間で実現 ◦ ユーザスレッド:
ユーザ空間で実現 • 📝 ここでいう「カーネルスレッド」は「カーネルの処理をするスレッド (psで”[kthreadd]”のように名前が”[” と”]”に囲まれているもの )」という意味でのカーネルスレッドとは別の概念 2
カーネルスレッド • スレッドごとにカーネルのスケジューリング単位が存在する ◦ このスケジューリング単位のことを LWP(Light Weight Process)と呼ぶ ▪ シングルスレッドプロセスは
LWPが1つだけ存在 ▪ マルチスレッドプロセスは LWPが2つ以上存在 • カーネルが提供する機能なのでシステムコールを発行して作成 ◦ glibcが提供するpthreadライブラリ(NPTL)で生成するスレッドはカーネルスレッド ◦ スレッドを作成するpthread_create()関数を呼ぶと、内部で clone()システムコールを呼び出して LWPを生成する ◦ スレッドの管理情報はカーネル内に存在 3
システムに存在するカーネルスレッドの一覧表示 4 $ ps -eL PID LWP TTY TIME CMD
… 756 756 ? 00:00:07 dbus-daemon 767 767 ? 00:00:03 systemd-logind 768 768 ? 00:00:00 containerd 768 802 ? 00:01:42 containerd 768 803 ? 00:00:00 containerd … カーネルのスケジューリング単位 LWP(Light Weight Process)のID
スケジューリングの様子 • システムに2つのプロセスP0,P1が存在 ◦ P0はシングルプロセス。 LWPはP0_0のみ存在 ◦ P1は2スレッドから成るマルチスレッド。 LWPはP1_0とP1_1の2つ存在 •
カーネルは3つのLWP(P0_0,P1_0,P1_1)に平等にCPU時間を与える 5 P0_0 時間 CPU上で 動作中のLWP P1_0 P1_1 P0_0 P1_0 P1_1 P0_0 …
ユーザスレッド • ライブラリレベルでスレッドを実装する ◦ スレッドを管理する情報はすべてユーザ空間に存在する • カーネルからはユーザスレッドが何個あるかは検出できない ◦ プロセス内に何個ユーザスレッドがあろうと ps
-eLではLWPは1つ • 📝 大昔のglibcのpthreadライブラリはユーザスレッドを使っていた ◦ pthread_create()を呼んでもLWPを作成するclone()システムコールは発行しない • スレッドライブラリがプロセス内のどのスレッドを動かすかを決める ◦ 例: 所定の関数を呼ぶとスレッドが切り替わる 6
スケジューリングの様子 • システムに2つのプロセスP0,P1が存在 ◦ P0はシングルプロセス。 LWPはP0_0のみ存在 ◦ P1は2スレッドから成るマルチスレッド。 LWPはP1_0のみ存在 •
カーネルは2つのLWP(P0_0,P1_0)に平等にCPU時間を与える • スレッドライブラリがP1_0内の2つのスレッドの実行を切り替える 7 P0_0 時間 CPU上で 動作中のLWP P1_0 P0_0 P1_0 P0_0 … P0_0 P1_0 • スレッドライブラリがP1_0内の2つのスレッドの実行を切り替える • カーネルはユーザ空間スレッドが2つあることを知らない
どっちがいいか • どっちも善し悪しあるので好きなほうを使うとよい • カーネルスレッドと比較したユーザスレッドの特徴 ◦ 生成コストが低い ◦ スレッド間のコンテキストスイッチが高速 ◦
一部スレッドがCPUを独占して動き続けてしまうリスクが高い ◦ スレッドがスリープすると全スレッドがスリープすることになる ◦ 複数スレッドがあっても 1つのCPU上でしか動作できない • カーネルスレッドとユーザスレッドのハイブリッドの実現方法もある! 8
プログラミング言語レベルのサポート • プログラミング言語レベルでスレッド機構を用意していることがある • 例: Go言語のgoroutine ◦ カーネルスレッドとユーザスレッドのハイブリッド ◦ 以下のようにすると関数を非同期的に呼び出せる
◦ ユーザはgoroutineが具体的にどう動かされるかは気にしなくてよい ◦ pthreadライブラリのようなものを直接動かすよりも楽 9 go func() { … }()
📝 スレッドの用語はめんどくさい! • 同じ概念を指す似たような用語がある ◦ カーネルスレッド ▪ カーネル空間スレッド ▪ カーネルレベルスレッド
▪ Light Weight Process(LWP) ◦ ユーザスレッド ▪ ユーザ空間スレッド ▪ ユーザレベルスレッド ▪ グリーンスレッド • ハードウェアの文脈でプロセスの文脈とは別の意味の「スレッド」がある ◦ SMT(Simultaneous Multi-Threading) ▪ 1つのCPUコアを論理的に2つ以上に見せる ◦ 📝 ハイパースレッディングは Intel社のCPUでSMTを実現したもの 10
まとめ • マルチスレッドの実現方法にはカーネルスレッドとユーザスレッドがある ◦ 両方使う場合もある • プログラミング言語レベルでマルチスレッドプログラムの難しさを隠蔽しているもの もある 11